Você está na página 1de 1086

Manual de Referncia do MySQL

Manual de Referncia do MySQL

ndice
Preface ............................................................................................................. xvii 1. Informaes Gerais ............................................................................................ 1 1.1. Sobre Este Manual .................................................................................. 2 1.1.1. Convenes Usadas Neste Manual ................................................... 2 1.2. Viso Geral do Sistema de Gerenciamento de Banco de Dados MySQL ............. 4 1.2.1. Histria do MySQL ....................................................................... 5 1.2.2. As Principais Caractersticas do MySQL ........................................... 5 1.2.3. Estabilidade do MySQL ................................................................. 8 1.2.4. Qual o Tamanho Que as Tabelas do MySQL Podem Ter? ..................... 9 1.2.5. Compatibilidade Com o Ano 2000 (Y2K) .........................................10 1.3. Viso Geral da MySQL AB ......................................................................11 1.3.1. O Modelo de Negcio e Servios da MySQL AB ...............................12 1.3.2. Informaes para Contato ..............................................................14 1.4. Suporte e Licenciamento do MySQL ..........................................................15 1.4.1. Suporte Oferecido pela MySQL AB ................................................15 1.4.2. Copyrights e Licenas Usadas pelo MySQL ......................................16 1.4.3. Licenas do MySQL .....................................................................16 1.4.4. Logomarcas e Marcas Registradas da MySQL AB .............................18 1.5. Mapa de Desenvolvimento do MySQL .......................................................19 1.5.1. MySQL 4.0 in a Nutshell ...............................................................20 1.5.2. MySQL 4.1 in a Nutshell ...............................................................21 1.5.3. MySQL 5.0, A Prxima Distribuio de Desenvolvimento ...................23 1.6. MySQL e o Futuro (o TODO) ...................................................................24 1.6.1. Novos Recursos Planejados Para a Verso 4.1 ...................................24 1.6.2. Novos Recursos Planejados Para a Verso 5.0 ...................................24 1.6.3. Novos Recursos Planejados Para a Verso 5.1 ...................................25 1.6.4. Novos Recursos Planejados Para a Verso em um Futuro Prximo ........26 1.6.5. Novos Recursos Planejados Para a Verso em um Futuro a Mdio Prazo 28 1.6.6. Novos Recursos que No Planejamos Fazer ......................................30 1.7. Fontes de Informaes do MySQL .............................................................30 1.7.1. Listas de Discusso MySQL ..........................................................30 1.7.2. Suporte a Comunidade MySQL Atrvs do IRC (Internet Relay Chat) .....37 1.8. Qual compatibilidade aos padres o MySQL oferece ? ..................................38 1.8.1. Qual Padro o MySQL Segue? .......................................................38 1.8.2. Executando o MySQL no modo ANSI .............................................38 1.8.3. Extenses do MySQL para o Padro SQL-92 ....................................39 1.8.4. Diferenas do MySQL em Comparao com o SQL-92 .......................42 1.8.5. Como o MySQL Lida com Restries ..............................................47 1.8.6. Erros Conhecidos e Deficincias de Projetos no MySQL .....................49 2. Instalao do MySQL ........................................................................................54 2.1. Instalao rpida padro do MySQL ..........................................................54 2.1.1. Instalando o MySQL no Windows ..................................................54 2.1.2. Instalando o MySQL no Linux .......................................................62 2.1.3. Instalando o MySQL no Mac OS X .................................................64 2.1.4. Instalando o MySQL no NetWare ...................................................67 2.2. Detalhes Gerais de Instalao ...................................................................68 2.2.1. Como obter o MySQL ..................................................................68 2.2.2. Verificando a Integridade do Pacote Usando MD5 Checksums ou GnuPG ..........................................................................................................68 2.2.3. Sistemas Operacionais suportados pelo MySQL ................................70 2.2.4. Qual verso do MySQL deve ser usada ............................................72 2.2.5. Layouts de Instalao ...................................................................75 2.2.6. Como e quando as atualizaes so lanadas? ...................................76 2.2.7. Filosofia das Distribuies - Nenhum Bug Conhecidos nas Distribuies 77 2.2.8. Binrios MySQL compilados pela MySQL AB .................................78 2.2.9. Instalando uma Distribuio Binria do MySQL ................................82 2.3. Instalando uma distribuio com fontes do MySQL ......................................85 iv

Manual de Referncia do MySQL

2.3.1. Viso geral da instalao rpida ......................................................86 2.3.2. Aplicando patches ........................................................................88 2.3.3. Opes tpicas do configure ......................................................89 2.3.4. Instalando pela rvore de fontes do desenvolvimento ..........................92 2.3.5. Lidando com Problemas de Compilao ...........................................94 2.3.6. Notas MIT-pthreads .....................................................................97 2.3.7. Instalando o MySQL a partir do Fonte no Windows ...........................99 2.4. Configuraes e Testes Ps-instalao ...................................................... 102 2.4.1. Problemas Executando o mysql_install_db ............................ 106 2.4.2. Problemas Inicializando o Servidor MySQL ................................... 107 2.4.3. Inicializando e parando o MySQL automaticamente. ........................ 109 2.5. Atualizando/Desatualizando o MySQL ..................................................... 110 2.5.1. Atualizando da Verso 4.0 para 4.1 ............................................... 111 2.5.2. Atualizando da Verso 3.23 para 4.0 .............................................. 113 2.5.3. Atualizando da verso 3.22 para 3.23 ............................................. 117 2.5.4. Atualizando da verso 3.21 para 3.22 ............................................. 118 2.5.5. Atualizando da verso 3.20 para 3.21 ............................................. 119 2.5.6. Atualizando a Tabela de Permisses .............................................. 120 2.5.7. Atualizando para outra arquitetura ................................................. 120 2.5.8. Atualizando o MySQL no Windows .............................................. 122 2.6. Notas especficas para os Sistemas Operacionais ........................................ 122 2.6.1. Notas Windows ......................................................................... 122 2.6.2. Notas Linux (Todas as verses) .................................................... 126 2.6.3. Notas Solaris ............................................................................ 133 2.6.4. Notas BSD ............................................................................... 137 2.6.5. Notas Mac OS X ....................................................................... 140 2.6.6. Notas de Outros Unix ................................................................. 140 2.6.7. Notas OS/2 ............................................................................... 151 2.6.8. Notas Novell NetWare ................................................................ 151 2.6.9. Notas BeOS .............................................................................. 151 2.7. Comentrios de Instalao do Perl ........................................................... 152 2.7.1. Instalando Perl no Unix ............................................................... 152 2.7.2. Instalaando ActiveState Perl no Windows ....................................... 152 2.7.3. Problemas Usando a Interface Perl DBI/DBD .................................. 153 3. Tutorial de Introduo Do MySQL ..................................................................... 156 3.1. Conectando e Desconectando do Servidor ................................................. 156 3.2. Fazendo Consultas ................................................................................ 157 3.3. Criao e Utilizao de um Banco de Dados .............................................. 160 3.3.1. Criando e Selecionando um Banco de Dados ................................... 161 3.3.2. Criando uma Tabela ................................................................... 161 3.3.3. Carregando dados em uma tabela .................................................. 163 3.3.4. Recuperando Informaes de uma Tabela ....................................... 164 3.4. Obtendo Informaes Sobre Bancos de Dados e Tabelas .............................. 177 3.5. Utilizando mysql em Modo Batch .......................................................... 178 3.6. Exemplos de Consultas Comuns .............................................................. 179 3.6.1. O Valor Mximo para uma Coluna ................................................ 180 3.6.2. O Registro que Armazena o Valor Mximo para uma Coluna Determinada ........................................................................................................ 180 3.6.3. Mximo da Coluna por Grupo ...................................................... 181 3.6.4. As Linhas Armazenando o Group-wise Mximo de um Certo Campo .. 181 3.6.5. Utilizando Variveis de Usurio ................................................... 182 3.6.6. Utilizando Chaves Estrangeiras .................................................... 182 3.6.7. Pesquisando em Duas Chaves ...................................................... 184 3.6.8. Calculando Visitas Dirias ........................................................... 184 3.6.9. Usando AUTO_INCREMENT ....................................................... 185 3.7. Consultas de Projetos Gmeos ................................................................ 186 3.7.1. Encontrando Todos Gmeos No-distribudos ................................. 186 3.7.2. Mostrando uma Tabela sobre a Situao dos Pares Gmeos ............... 188 3.8. Utilizando MySQL com Apache ............................................................. 189 4. Administrao do Bancos de Dados MySQL ........................................................ 190 4.1. Configurando o MySQL ........................................................................ 190 4.1.1. Opes de Linha de Comando do mysqld ..................................... 190 4.1.2. Arquivo de Opes my.cnf ........................................................ 198 v

Manual de Referncia do MySQL

4.2. Executando Mltiplos MySQL Servers na Mesma Mquina ......................... 201 4.2.1. Executando Mltiplos Servidores no Windows ................................ 203 4.2.2. Executando Mltiplos Servidores no Unix ...................................... 206 4.2.3. Usando Programas Clientes em um Ambiente Multi-Servidor ............ 207 4.3. Detalhes Gerais de Segurana e o Sistema de Privilgio de Acesso do MySQL 208 4.3.1. Segurana Geral ........................................................................ 208 4.3.2. Como Tornar o MySQL Seguro contra Crackers .............................. 210 4.3.3. Opes de Inicializao para o mysqld em Relao a Segurana. ...... 212 4.3.4. Detalhes de Segurana com LOAD DATA LOCAL ........................... 213 4.3.5. O Que o Sistema de Privilgios Faz ............................................... 213 4.3.6. Como o Sistema de Privilgios Funciona ........................................ 213 4.3.7. Privilgios Fornecidos pelo MySQL .............................................. 217 4.3.8. Conectando ao Servidor MySQL .................................................. 219 4.3.9. Controle de Acesso, Estgio 1: Verificao da Conexo .................... 220 4.3.10. Controle de Acesso, Estgio 2: Verificao da Requisio ............... 223 4.3.11. Hashing de Senhas no MySQL 4.1 .............................................. 225 4.3.12. Causas dos Erros de Accesso Negado ..................................... 229 4.4. Gerenciamento das Contas dos Usurios no MySQL ................................... 233 4.4.1. A Sintaxe de GRANT e REVOKE ................................................... 233 4.4.2. Nomes de Usurios e Senhas do MySQL ........................................ 238 4.4.3. Quando as Alteraes nos Privilgios tem Efeito .............................. 239 4.4.4. Configurando os Privilgios Iniciais do MySQL .............................. 239 4.4.5. Adicionando Novos Usurios ao MySQL ....................................... 240 4.4.6. Deletando Usurios do MySQL .................................................... 243 4.4.7. Limitando os Recursos dos Usurios ............................................. 243 4.4.8. Configurando Senhas .................................................................. 244 4.4.9. Mantendo Sua Senha Segura ........................................................ 245 4.4.10. Usando Conexes Seguras ......................................................... 246 4.5. Preveno de Disastres e Recuperao ...................................................... 252 4.5.1. Backups dos Bancos de Dados ..................................................... 252 4.5.2. Sintaxe de BACKUP TABLE ........................................................ 254 4.5.3. Sintaxe de RESTORE TABLE ...................................................... 254 4.5.4. Sintaxe de CHECK TABLE .......................................................... 254 4.5.5. Sintaxe do REPAIR TABLE ....................................................... 256 4.5.6. Utilizando myisamchk para Manuteno de Tabelas e Recuperao em Caso de Falhas .................................................................................. 257 4.5.7. Configurando um Regime de Manuteno das Tabelas ...................... 267 4.5.8. Obtendo Informaes sobre as Tabelas .......................................... 268 4.6. Adiministrao do Banco de Dados e Referncia de Linguagem .................... 273 4.6.1. Sintaxe de OPTIMIZE TABLE .................................................... 273 4.6.2. Sintaxe de ANALYZE TABLE ...................................................... 273 4.6.3. Sintaxe de CHECKSUM TABLE .................................................... 274 4.6.4. Sintaxe de FLUSH ...................................................................... 274 4.6.5. Sintaxe de RESET ...................................................................... 275 4.6.6. Sintaxe de PURGE MASTER LOGS .............................................. 276 4.6.7. Sintaxe de KILL ........................................................................ 276 4.6.8. Sintaxe de SHOW ........................................................................ 277 4.7. Localizao do MySQL e Utilizao Internacional ...................................... 296 4.7.1. O Conjunto de Caracteres Utilizado para Dados e Ordenao ............. 297 4.7.2. Mensagens de Erros em Outras Lnguas ......................................... 298 4.7.3. Adicionando um Novo Conjunto de Caracteres ................................ 298 4.7.4. Os Vetores de Definies de Caracteres ......................................... 300 4.7.5. Suporte Ordenao de Strings .................................................... 300 4.7.6. Suporte Caracteres Multi-byte .................................................... 301 4.7.7. Problemas com Conjuntos de Caracteres ........................................ 301 4.8. Utilitrios e Scripts do Lado do Servidor MySQL ....................................... 301 4.8.1. Viso Geral dos Scripts e Utilitrios do Lado Servidor ...................... 301 4.8.2. mysqld-safe, o wrapper do mysqld ........................................ 302 4.8.3. mysqld_multi, programa para gerenciar mltiplos servidores MySQL ........................................................................................................ 304 4.8.4. myisampack, O Gerador de Tabelas Compactadas de Somente Leitura do MySQL ............................................................................................ 307 4.8.5. mysqld-max, om servidor mysqld extendido .............................. 312 vi

Manual de Referncia do MySQL

4.9. Utilitrios e Scripts do Lado do Cliente MySQL ......................................... 314 4.9.1. Viso Geral dos Utilitrios e Scripts do Lado do Cliente .................... 314 4.9.2. mysql, A Ferramenta de Linha de Comando .................................. 316 4.9.3. mysqlcc, The MySQL Control Center ......................................... 324 4.9.4. mysqladmin, Administrando um Servidor MySQL ........................ 326 4.9.5. mysqlbinlog, Executando as Consultas a Partir de um Log Binrio . 328 4.9.6. Usando mysqlcheck para Manuteno de Tabelas e Recuperao em Caso de Falhas ...................................................................................... 329 4.9.7. mysqldump, Descarregando a Estrutura de Tabelas e Dados ............ 332 4.9.8. mysqlhotcopy, Copiando Bancos de Dados e Tabelas do MySQL .. 336 4.9.9. mysqlimport, Importando Dados de Arquivos Texto .................... 338 4.9.10. mysqlshow, Exibindo Bancos de Dados, Tabelas e Colunas ........... 340 4.9.11. mysql_config, Opes para compilao do cliente MySQL ......... 341 4.9.12. perror, Explicando Cdigos de Erros ........................................ 342 4.9.13. Como Executar Comandos SQL a Partir de um Arquivo Texto ......... 342 4.10. Os Arquivos de Log do MySQL ............................................................ 343 4.10.1. O Log de Erros ........................................................................ 343 4.10.2. O Log de Consultas .................................................................. 344 4.10.3. O Log de Atualizaes .............................................................. 344 4.10.4. O Log Binrio ......................................................................... 345 4.10.5. O Log para Consultas Lentas ...................................................... 347 4.10.6. Manuteno do Log de Arquivo .................................................. 348 4.11. Replicao no MySQL ........................................................................ 348 4.11.1. Introduo .............................................................................. 348 4.11.2. Viso Geral da Implementao da Replicao ................................ 349 4.11.3. Detalhes de Implementao da Replicao .................................... 350 4.11.4. Como Configurar a Replicao ................................................... 355 4.11.5. Recursos de Replicao e Problemas Conhecidos ........................... 359 4.11.6. Opes de Inicializao da Replicao ......................................... 361 4.11.7. Instrues SQL para Controle do Servidor Master .......................... 369 4.11.8. Instrues SQL para Controle do Servidor Slave ............................ 370 4.11.9. FAQ da Replicao .................................................................. 378 4.11.10. Problemas com Replicao ....................................................... 383 4.11.11. Relatando Problemas de Replicao ........................................... 384 5. Otimizao do MySQL .................................................................................... 385 5.1. Viso Geral da Otimizao ..................................................................... 385 5.1.1. Limitaes do Projeto MySQL/Trocas ........................................... 385 5.1.2. Portabilidade ............................................................................. 386 5.1.3. Para que Utilizamos o MySQL? .................................................... 387 5.1.4. O Pacote de Benchmark do MySQL .............................................. 387 5.1.5. Utilizando seus Prprios Benchmarks ............................................ 389 5.2. Otimizando SELECTs e Outras Consultas ................................................. 389 5.2.1. Sintaxe de EXPLAIN (Obter informaes sobre uma SELECT) .......... 390 5.2.2. Estimando o Desempenho de uma Consulta .................................... 397 5.2.3. Velocidade das Consultas que Utilizam SELECT ............................. 397 5.2.4. Como o MySQL Otimiza Clusulas WHERE .................................... 398 5.2.5. Como o MySQL Otimiza IS NULL .............................................. 400 5.2.6. Como o MySQL Otimiza Clusulas DISTINCT .............................. 400 5.2.7. Como o MySQL Otimiza LEFT JOIN e RIGHT JOIN .................. 401 5.2.8. Como o MySQL Otimiza Clusulas ORDER BY .............................. 402 5.2.9. Como o MySQL Otimiza Clusulas LIMIT .................................... 403 5.2.10. Performance das Consultas que Utilizam INSERT ......................... 404 5.2.11. Performance das Consultas que Utilizam UPDATE ......................... 406 5.2.12. Performance das Consultas que Utilizam DELETE ......................... 406 5.2.13. Mais Dicas sobre Otimizaes .................................................... 406 5.3. Detalhes sobre Locks ............................................................................ 409 5.3.1. Como o MySQL Trava as Tabelas ................................................. 409 5.3.2. Detalhes sobre Lock de Tabelas .................................................... 409 5.4. Otimizando a Estrutura de Banco de Dados ............................................... 411 5.4.1. Opes do Projeto ...................................................................... 411 5.4.2. Deixando os Dados com o Menor Tamanho Possvel ........................ 411 5.4.3. Como o MySQL Utiliza ndices .................................................... 412 5.4.4. ndices de Colunas ..................................................................... 414 vii

Manual de Referncia do MySQL

5.4.5. ndices de Mltiplas Colunas ....................................................... 415 5.4.6. Como o MySQL Conta as Tabelas Abertas ..................................... 416 5.4.7. Como o MySQL Abre e Fecha as Tabelas ....................................... 416 5.4.8. Desvantagem em Criar um Nmero Grande de Tabelas no Mesmo Banco de Dados .............................................................................................. 417 5.5. Otimizando o Servidor MySQL ............................................................... 417 5.5.1. Sintonia dos Parmetros em Tempo de Sistema/Compilao e na Inicializao .................................................................................................. 417 5.5.2. Parmetros de Sintonia do Servidor ............................................... 418 5.5.3. Como a Compilao e a Ligao Afetam a Velocidade do MySQL ...... 420 5.5.4. Como o MySQL Utiliza a Memria ............................................... 422 5.5.5. Como o MySQL Utiliza o DNS .................................................... 423 5.5.6. Sintaxe de SET .......................................................................... 423 5.6. Detalhes de Disco ................................................................................. 427 5.6.1. Utilizando Links Simblicos ........................................................ 429 6. Referncia de Linguagem do MySQL ................................................................. 432 6.1. Estrutura da Linguagem ......................................................................... 432 6.1.1. Literais: Como Gravar Strings e Numerais ...................................... 432 6.1.2. Nomes de Banco de dados, Tabela, ndice, Coluna e Alias ................. 435 6.1.3. Caso Sensitivo nos Nomes ........................................................... 437 6.1.4. Variveis de Usurio .................................................................. 437 6.1.5. Variveis de Sistema .................................................................. 438 6.1.6. Sintaxe de Comentrios .............................................................. 441 6.1.7. Tratamento de Palavras Reservadas no MySQL ............................... 442 6.2. Tipos de Campos .................................................................................. 444 6.2.1. Tipos Numricos ....................................................................... 449 6.2.2. Tipos de Data e Hora .................................................................. 451 6.2.3. Tipos String .............................................................................. 457 6.2.4. Escolhendo o Tipo Correto para uma Coluna ................................... 462 6.2.5. Usando Tipos de Colunas de Outros Mecanismos de Banco de Dados .. 462 6.2.6. Exigncias de Armazenamento dos Tipos de Coluna ......................... 462 6.3. Funes para Uso em Clusulas SELECT e WHERE .................................... 464 6.3.1. Operadores e Funes de Tipos no Especificados ........................... 464 6.3.2. Funes String .......................................................................... 472 6.3.3. Funes Numricas .................................................................... 483 6.3.4. Funes de Data e Hora .............................................................. 491 6.3.5. Funes de Converso ................................................................ 507 6.3.6. Outras Funes .......................................................................... 509 6.3.7. Funes e Modificadores para Usar com Clusulas GROUP BY .......... 519 6.4. Manipulao de Dados: SELECT, INSERT, UPDATE e DELETE .................. 525 6.4.1. Sintaxe SELECT ........................................................................ 525 6.4.2. Sintaxe de Subquery ................................................................... 532 6.4.3. Sintaxe INSERT ........................................................................ 542 6.4.4. Sintaxe UPDATE ........................................................................ 546 6.4.5. Sintaxe DELETE ........................................................................ 548 6.4.6. Sintaxe TRUNCATE .................................................................... 549 6.4.7. Sintaxe REPLACE ...................................................................... 550 6.4.8. Sintaxe LOAD DATA INFILE .................................................... 550 6.4.9. Sintaxe HANDLER ...................................................................... 557 6.4.10. Sintaxe DO .............................................................................. 558 6.5. Definio de Dados: CREATE, DROP e ALTER .......................................... 558 6.5.1. Sintaxe CREATE DATABASE ...................................................... 559 6.5.2. Sintaxe DROP DATABASE .......................................................... 559 6.5.3. Sintaxe CREATE TABLE ............................................................ 559 6.5.4. Sintaxe ALTER TABLE .............................................................. 568 6.5.5. Sintaxe RENAME TABLE ............................................................ 572 6.5.6. Sintaxe DROP TABLE ................................................................ 572 6.5.7. Sintaxe CREATE INDEX ............................................................ 573 6.5.8. Sintaxe DROP INDEX ................................................................ 573 6.6. Comandos Utilitrios Bsicos do Usurio MySQL ...................................... 574 6.6.1. Sintaxe USE .............................................................................. 574 6.6.2. Sintaxe DESCRIBE (Obtem Informaes Sobre Colunas) .................. 574 6.7. Comandos Transacionais e de Lock do MySQL ......................................... 574 viii

Manual de Referncia do MySQL

6.7.1. Sintaxe de START TRANSACTION, COMMIT e ROLLBACK ............. 574 6.7.2. Instrues que No Podem Ser Desfeitas ........................................ 575 6.7.3. Instrues que Fazem um Commit Implicito ................................... 575 6.7.4. Sintaxe de SAVEPOINT e ROLLBACK TO SAVEPOINT ................ 576 6.7.5. Sintaxe LOCK TABLES e UNLOCK TABLES ................................ 576 6.7.6. Sintaxe SET TRANSACTION ...................................................... 578 6.8. Pesquisa Full-text no MySQL ................................................................. 578 6.8.1. Restries Full-text .................................................................... 582 6.8.2. Ajuste Fino de Pesquisas Full-text no MySQL ................................. 582 6.8.3. TODO de Pesquisas Full-text ....................................................... 583 6.9. Cache de Consultas do MySQL ............................................................... 584 6.9.1. Como a Cache de Consultas Opera ................................................ 584 6.9.2. Configurao da Cache de Consultas ............................................. 586 6.9.3. Opes da Cache de Consultas na SELECT .................................... 587 6.9.4. Estado e Manuteno da Cache de Consultas ................................... 587 7. Tipos de Tabela do MySQL .............................................................................. 589 7.1. Tabelas MyISAM .................................................................................. 590 7.1.1. Espao Necessrio para Chaves .................................................... 592 7.1.2. Formatos de Tabelas MyISAM ...................................................... 592 7.1.3. Problemas com Tabelas MyISAM .................................................. 595 7.2. Tabelas MERGE .................................................................................... 596 7.2.1. Problemas com Tabelas MERGE .................................................... 598 7.3. Tabelas ISAM ...................................................................................... 599 7.4. Tabelas HEAP ...................................................................................... 600 7.5. Tabelas InnoDB .................................................................................. 601 7.5.1. Viso Geral de Tabelas InnoDB .................................................... 601 7.5.2. InnoDB no MySQL Verso 3.23 ................................................... 601 7.5.3. Opes de Inicializao do InnoDB ............................................... 602 7.5.4. Criando Tablespaces no InnoDB ................................................... 607 7.5.5. Criando Tabelas InnoDB ............................................................. 609 7.5.6. Adicionando e Removendo Arquivos de Dados e Log do InnoDB ....... 613 7.5.7. Fazendo Backup e Recuperando um Banco de Dados InnoDB ............ 613 7.5.8. Movendo um Banco de Dados InnoDB para Outra Mquina ............... 616 7.5.9. Modelo Transacional do InnoDB .................................................. 616 7.5.10. Dicas de Ajuste de Desempenho ................................................. 622 7.5.11. Implementao de Multi-versioning ............................................. 626 7.5.12. Estrutura de Tabelas e ndices .................................................... 626 7.5.13. Gerenciamento do Espao de Arquivos e E/S de Disco .................... 628 7.5.14. Tratando Erros ......................................................................... 630 7.5.15. Restries em Tabelas InnoDB ................................................... 630 7.5.16. Histrico de Alteraes do InnoDB ............................................. 631 7.5.17. Informaes de Contato do InnoDB ............................................ 648 7.6. Tabelas BDB ou BerkeleyDB ............................................................... 648 7.6.1. Viso Geral de Tabelas BDB ........................................................ 648 7.6.2. Instalando BDB .......................................................................... 649 7.6.3. Opes de Inicializao do BDB ................................................... 649 7.6.4. Caractersticas de Tabelas BDB: .................................................... 650 7.6.5. Itens a serem corrigidos no BDB num futuro prximo: ....................... 651 7.6.6. Sistemas operacionais suportados pelo BDB .................................... 651 7.6.7. Restries em Tabelas BDB .......................................................... 652 7.6.8. Erros Que Podem Ocorrer Usando Tabelas BDB .............................. 652 8. Introduo ao MaxDB ..................................................................................... 653 8.1. Historia do MaxDB .............................................................................. 653 8.2. Licenciamento e Suporte ........................................................................ 653 8.3. Conceitos Bsicos do MaxDB ................................................................. 653 8.4. Diferenas de Recursos entre o MaxDB e o MySQL ................................... 653 8.5. Interoperability Features between MaxDB and MySQL ............................... 654 8.6. Links Relacionados ao MaxDB ............................................................... 654 8.7. Palavras Reservadas no MaxDB .............................................................. 654 9. Conjunto de Caracteres Nacionais e Unicode ....................................................... 658 9.1. Conjuntos de Caracteres e Collations em Geral .......................................... 658 9.2. Conjunto de Caracteres e Collations no MySQL ......................................... 659 9.3. Determinando o Conjunto de Caracteres e Collation Padres ........................ 659 ix

Manual de Referncia do MySQL

9.3.1. Conjunto de Caracteres e Collations do Servidor .............................. 659 9.3.2. Conjunto de Caracteres e Collation de Banco de Dados ..................... 660 9.3.3. O Conjunto de Caracteres e Collations de Tabela ............................. 661 9.3.4. Conjunto de Caracteres e Collation de Colunas ................................ 661 9.3.5. Exemplos de Atribuies de Conjuntos de Caracteres e Collation ........ 662 9.3.6. Conjunto de Caracteres e Collation de Conexo ............................... 663 9.3.7. Conjunto de Caracteres e Collation de Caracter de String Literal ......... 663 9.3.8. Clusula COLLATE em Vrias Partes de uma Consulta SQL .............. 664 9.3.9. Precedncia da Clusula COLLATE ............................................... 665 9.3.10. Operador BINARY ................................................................... 666 9.3.11. Alguns Casos Especiais Onde a Determinao da Collation e Trabalhosa ........................................................................................................ 666 9.3.12. Collations Devem Ser para o Conjunto de Caracteres Certo .............. 667 9.3.13. Um exemplo do Efeito da Collation ............................................. 667 9.4. Operaes Afetadas pelo Suporte a Conjunto de Caracteres .......................... 667 9.4.1. Strings de Resultados ................................................................. 668 9.4.2. CONVERT() ............................................................................ 668 9.4.3. CAST() .................................................................................. 668 9.4.4. SHOW CHARACTER SET .......................................................... 669 9.4.5. SHOW COLLATION .................................................................. 669 9.4.6. SHOW CREATE DATABASE ...................................................... 670 9.4.7. SHOW FULL COLUMNS ............................................................ 670 9.5. Suporte Unicode .................................................................................. 670 9.6. UTF8 para Metdados ............................................................................ 671 9.7. Compatibilidade com Outros SGBDs ....................................................... 672 9.8. Novo Formato do Arquivo de Configurao do Conjunto de Caracteres .......... 672 9.9. Conjunto de Caracteres Nacional ............................................................. 672 9.10. Atualizando para o MySQL 4.0 ............................................................. 672 9.10.1. Conjunto de Caracteres do MySQL e o Par/Conjunto de Caracter/Collation Correspondente do MySQL 4.1 ............................................................. 673 9.11. Os conjuntos de Caracteres e Collations que o MySQL Suporta ................... 674 9.11.1. O Conjunto de Caracteres Unicode .............................................. 675 9.11.2. Conjunto de Caracteres para Plataformas Especficas ...................... 675 9.11.3. Conjunto de Caracteres do Sul da Europa e Oriente Mdio ............... 675 9.11.4. Os Conjuntos de Caracteres Asiticos .......................................... 675 9.11.5. Os Conjuntos de Caracteres Blticos ............................................ 676 9.11.6. Os Conjuntos de Caracteres Cirlicos ........................................... 676 9.11.7. O Conjunto de Caracteres da Europa Central ................................. 677 9.11.8. Os Conjuntos de Caracteres da Europa Ocidental ........................... 678 10. Extenses Espacias em MySQL ....................................................................... 680 10.1. Introduo ......................................................................................... 680 10.2. O Modelo Geomtrico OpenGIS ............................................................ 681 10.2.1. A Hierarquia da Classe Geometry ............................................. 681 10.2.2. Classe Geometry ................................................................... 682 10.2.3. Classe Point ......................................................................... 683 10.2.4. Classe Curve ......................................................................... 683 10.2.5. Classe LineString ............................................................... 684 10.2.6. Classe Surface ..................................................................... 684 10.2.7. Classe Polygon ..................................................................... 684 10.2.8. Classe GeometryCollection ............................................... 685 10.2.9. Classe MultiPoint ............................................................... 685 10.2.10. Classe MultiCurve ............................................................. 685 10.2.11. Classe MultiLineString (Multi Linhas) ............................... 686 10.2.12. Classe MultiSurface (Multi Superfcies) ............................... 686 10.2.13. Classe MultiPolygon (Multi Polgonos) ................................. 686 10.3. Formatos de Dados Espaciais Suportados ................................................ 687 10.3.1. Formato Well-Known Text (WKT) .............................................. 687 10.3.2. Formato Well-Known Binary (WKB) .......................................... 688 10.4. Criando um Banco de Dados MySQL Habilitado Espacialmente .................. 689 10.4.1. Tipos de Dados Espaciais do MySQL .......................................... 689 10.4.2. Criando Valores Espaciais ......................................................... 689 10.4.3. Criando Colunas Espaciais ......................................................... 693 10.4.4. Entrando com Dados em Colunas Espaciais .................................. 693 x

Manual de Referncia do MySQL

10.4.5. Buscando Dados Espaciais ......................................................... 694 10.5. Analisando Informao Espacial ............................................................ 695 10.5.1. Funes Para Converter Geometrias Entre Formatos Diferentes ........ 695 10.5.2. Funes de Anlise das Propriedades de Geometry ...................... 696 10.5.3. Funes Que Criam Novas Geometrias de Outras Existentes ............ 702 10.5.4. Funes Para Testar Relaes Espaciais Entre Objetos Geomtricos .. 704 10.5.5. Relaes de Retngulo de Limite Mnimo (Minimal Bounding Rectangles - MBR) em Geometrias ....................................................................... 704 10.5.6. Funes que Testam Relacionamentos Espaciais Entre Geometrias .... 705 10.6. Otimizando Anlises Espaciais .............................................................. 706 10.6.1. Criando ndices Espaciais .......................................................... 706 10.6.2. Usando ndice Espacial ............................................................. 707 10.7. Compatibilidade e Conformidade com o MySQL ...................................... 709 10.7.1. Recursos GIS Que Ainda No Esto Implementados ....................... 709 11. Stored Procedures e Funes ........................................................................... 710 11.1. Sintaxe de Stored Procedure ................................................................. 710 11.1.1. Manuteno de Stored Procedures ............................................... 711 11.1.2. SHOW PROCEDURE STATUS e SHOW FUNCTION STATUS ........ 713 11.1.3. CALL ..................................................................................... 713 11.1.4. BEGIN ... END Compound Statement ..................................... 713 11.1.5. Instruo DECLARE ................................................................. 714 11.1.6. Variables in Stored Procedures ................................................... 714 11.1.7. Condies e Handlers ............................................................... 714 11.1.8. Cursors .................................................................................. 716 11.1.9. Flow Control Constructs ............................................................ 717 12. Ferramentas de Clientes e APIs do MySQL ........................................................ 720 12.1. API C do MySQL ............................................................................... 720 12.1.1. Tipos de Dados da API C ........................................................... 720 12.1.2. Viso Geral das Funo da API C ............................................... 723 12.1.3. Descrio das Funes da API C ................................................. 726 12.1.4. Instrues Preparadas da API C .................................................. 763 12.1.5. Tipos de Dados de Instrues Preparadas da API C ......................... 764 12.1.6. Viso Geral das Funes de Instrues Preparadas da API C ............ 766 12.1.7. Descrio das Funes de Instruo Preparada da API C .................. 769 12.1.8. Tratando a Execuo de Mltiplas Consultas na API C .................... 786 12.1.9. Manipulando Valores de Data e Hora na API C .............................. 786 12.1.10. Descrio das Funes de Threads da API C ................................ 787 12.1.11. Descrio das Funes do Servidor Embutido da API C ................. 789 12.1.12. Dvidas e problemas comuns ao utilzar a API C ........................... 790 12.1.13. Construindo Programas Clientes ................................................ 791 12.1.14. Como Fazer um Cliente em Threads ........................................... 792 12.1.15. libmysqld, a Biblioteca do Servidor Embutido MySQL .................. 793 12.2. Suporte ODBC ao MySQL ................................................................... 798 12.2.1. Como Instalar o MyODBC ........................................................ 798 12.2.2. Como Preencher os Vrios Campos no Programa de Administrao do ODBC ............................................................................................. 799 12.2.3. Parmetros de Conexo do MyODBC .......................................... 800 12.2.4. Como Relatar Problemas com o MyODBC ................................... 801 12.2.5. Programas que Funcionam com MyODBC .................................... 801 12.2.6. Como Obter o Valor de uma Coluna AUTO_INCREMENT no ODBC . 806 12.2.7. Relatando Problemas com MyODBC ........................................... 806 12.3. Conectividade Java (JDBC) ao MySQL .................................................. 807 12.4. API PHP do MySQL ........................................................................... 807 12.4.1. Problemas Comuns com MySQL e PHP ....................................... 807 12.5. API Perl do MySQL ............................................................................ 808 12.5.1. DBI com DBD::mysql ........................................................... 808 12.5.2. A interface DBI ....................................................................... 808 12.5.3. Mais Informaes DBI/DBD ....................................................... 815 12.6. API C++ do MySQL ........................................................................... 815 12.6.1. Borland C++ ........................................................................... 815 12.7. API Python do MySQL ........................................................................ 816 12.8. API Tcl do MySQL ............................................................................. 816 12.9. Eiffel Wrapper do MySQL ................................................................... 816 xi

Manual de Referncia do MySQL

13. Tratamento de Erros no MySQL ...................................................................... 817 13.1. Erros Retornados ................................................................................ 817 14. Estendendo o MySQL .................................................................................... 841 14.1. MySQL Internals ................................................................................ 841 14.1.1. Threads MySQL ...................................................................... 841 14.1.2. Pacotes de Teste do MySQL ....................................................... 841 14.2. Adicionando Novas Funes ao MySQL ................................................. 844 14.2.1. Sintaxe CREATE FUNCTION/DROP FUNCTION ........................ 844 14.2.2. Adicionando Novas Funes Definidas Por Usurio ........................ 845 14.2.3. Adicionando uma Nova Funo Nativa ........................................ 852 14.3. Adicionado Novos Procedimentos ao MySQL .......................................... 853 14.3.1. Anlise de Procedimento ........................................................... 854 14.3.2. Escrevendo um Procedimento ..................................................... 854 A. Problemas e Erros Comuns .............................................................................. 855 A.1. Como Determinar o Que Est Causando Problemas .................................... 855 A.2. Erros Comuns Usando o MySQL ............................................................ 856 A.2.1. Erro: Access Denied ............................................................ 856 A.2.2. Erro: MySQL server has gone away .................................. 856 A.2.3. Erro: Can't connect to [local] MySQL server ............ 857 A.2.4. Erro: Client does not support authentication protocol ................................................................................................. 859 A.2.5. Erro: Host '...' is blocked ............................................ 859 A.2.6. Erro: Too many connections .............................................. 860 A.2.7. Erro: Some non-transactional changed tables couldn't be rolled back ........................................................................... 860 A.2.8. Erro: Out of memory ............................................................ 860 A.2.9. Erro: Packet too large ...................................................... 861 A.2.10. Erros de Comunicao / Comunicao Abortada ........................... 861 A.2.11. Erro: The table is full .................................................. 862 A.2.12. Erro: Can't create/write to file ................................ 863 A.2.13. Erro no Cliente: Commands out of sync .............................. 863 A.2.14. Erro: Ignoring user .......................................................... 864 A.2.15. Erro: Table 'xxx' doesn't exist .................................. 864 A.2.16. Erro: Can't initialize character set xxx ................ 864 A.2.17. Arquivo No Encontrado .......................................................... 865 A.3. Assuntos Relacionados a Instalao ........................................................ 866 A.3.1. Problemas de Ligao com a Biblioteca do Cliente MySQL .............. 866 A.3.2. Como Executar o MySQL Como Um Usurio Normal ..................... 866 A.3.3. Problemas com Permisses de Arquivos ........................................ 867 A.4. Assuntos Relacionados a Administrao .................................................. 868 A.4.1. O Que Fazer Se o MySQL Continua Falhando ................................ 868 A.4.2. Como Recuperar uma Senha de Root Esquecida .............................. 870 A.4.3. Como o MySQL Trata de Discos Sem Espao ................................ 871 A.4.4. Onde o MySQL Armazena Arquivos Temporrios .......................... 872 A.4.5. Como Proteger ou AlterarHow to Protect or Change the MySQL Socket File /tmp/mysql.sock ..................................................................... 872 A.4.6. Problemas Com Fuso Horrio ...................................................... 873 A.5. Assuntos Relacionados a Consultas ......................................................... 873 A.5.1. Caso-Sensitivito em Pesquisas ..................................................... 873 A.5.2. Problemas Usando Colunas DATE ................................................ 873 A.5.3. Problemas com Valores NULL ..................................................... 874 A.5.4. Problemas com alias .............................................................. 876 A.5.5. Deletando Linhas de Tabelas Relacionadas .................................... 876 A.5.6. Resolvendo Problemas Com Registros No Encontrados .................. 876 A.5.7. Problemas com Comparao de Ponto Flutuante ............................. 877 A.6. Assuntos Relacionados ao Otimizador ..................................................... 879 A.6.1. Camo evitar o varredura da tabela,,, .............................................. 879 A.7. Assuntos Relacionados a Definies de Tabelas ........................................ 880 A.7.1. Problemas com ALTER TABLE. ................................................. 880 A.7.2. Como Alterar a Ordem das Colunas em Uma Tabela ........................ 880 A.7.3. Problemas com TEMPORARY TABLE ........................................ 881 B. Contribuio de Programas .............................................................................. 882 B.1. APIs .................................................................................................. 882 xii

Manual de Referncia do MySQL

B.2. Conversores ........................................................................................ 884 B.3. Utilitrios ........................................................................................... 885 C. Colaboradores do MySQL ............................................................................... 887 C.1. Desenvolvedores do MySQL ................................................................. 887 C.2. Coolaboradores do MySQL ................................................................... 891 C.3. Responsveis pela Documentao e Traduo ........................................... 895 C.4. Bibliotecas usadas e incluidas com o MySQL ............................................ 896 C.5. Pacotes que suportam o MySQL ............................................................. 897 C.6. Ferramentas que so usadas para criar o MySQL ....................................... 898 C.7. Responsveis pelo Suporte do MySQL .................................................... 898 D. Histrico de Alteraes do MySQL ................................................................... 900 D.1. Alteraes na distribuio 5.0.0 (Development) ......................................... 900 D.2. Alteraes na distribuio 4.1.x (Alpha) ................................................... 900 D.2.1. Alteraes na distribuio 4.1.2 (not released yet) ........................... 901 D.2.2. Alteraes na distribuio 4.1.1 (01 de Dez de 2003) ....................... 902 D.2.3. Alteraes na distribuio 4.1.0 (03 Apr 2003: Alpha) ..................... 906 D.3. Alteraes na distribuio 4.0.x (Production) ............................................ 909 D.3.1. Alteraes na distribuio 4.0.17 (not released yet) .......................... 909 D.3.2. Alteraes na distribuio 4.0.16 (17 Out 2003) .............................. 911 D.3.3. Alteraes na distribuio 4.0.15 (03 Sep 2003) .............................. 913 D.3.4. Alteraes na distribuio 4.0.14 (18 Jul 2003) ............................... 917 D.3.5. Alteraes na distribuio 4.0.13 (16 May 2003) ............................. 921 D.3.6. Alteraes na distribuio 4.0.12 (15 Mar 2003: Production) ............. 925 D.3.7. Alteraes na distribuio 4.0.11 (20 Feb 2003) .............................. 926 D.3.8. Alteraes na distribuio 4.0.10 (29 Jan 2003) .............................. 927 D.3.9. Alteraes na distribuio 4.0.9 (09 Jan 2003) ................................ 928 D.3.10. Alteraes na distribuio 4.0.8 (07 Jan 2003) .............................. 929 D.3.11. Alteraes na distribuio 4.0.7 (20 Dec 2002) .............................. 930 D.3.12. Alteraes na distribuio 4.0.6 (14 Dec 2002: Gamma) ................. 930 D.3.13. Alteraes na distribuio 4.0.5 (13 Nov 2002) ............................. 931 D.3.14. Alteraes na distribuio 4.0.4 (29 Sep 2002) .............................. 934 D.3.15. Alteraes na distribuio 4.0.3 (26 Aug 2002: Beta) ..................... 935 D.3.16. Alteraes na distribuio 4.0.2 (01 Jul 2002) ............................... 937 D.3.17. Alteraes na distribuio 4.0.1 (23 Dec 2001) .............................. 941 D.3.18. Alteraes na distribuio 4.0.0 (Oct 2001: Alpha) ........................ 942 D.4. Alteraes na distribuio 3.23.x (Recent; still supported) ........................... 944 D.4.1. Alteraes na distribuio 3.23.59 (not released yet) ........................ 944 D.4.2. Alteraes na distribuio 3.23.58 (11 Sep 2003) ............................ 945 D.4.3. Alteraes na distribuio 3.23.57 (06 Jun 2003) ............................. 945 D.4.4. Alteraes na distribuio 3.23.56 (13 Mar 2003) ............................ 946 D.4.5. Alteraes na distribuio 3.23.55 (23 Jan 2003) ............................. 947 D.4.6. Alteraes na distribuio 3.23.54 (05 Dec 2002) ............................ 948 D.4.7. Alteraes na distribuio 3.23.53 (09 Oct 2002) ............................ 949 D.4.8. Alteraes na distribuio 3.23.52 (14 Aug 2002) ........................... 950 D.4.9. Alteraes na distribuio 3.23.51 (31 May 2002) ........................... 950 D.4.10. Alteraes na distribuio 3.23.50 (21 Apr 2002) .......................... 951 D.4.11. Alteraes na distribuio 3.23.49 .............................................. 952 D.4.12. Alteraes na distribuio 3.23.48 (07 Feb 2002) ........................... 952 D.4.13. Alteraes na distribuio 3.23.47 (27 Dec 2001) .......................... 953 D.4.14. Alteraes na distribuio 3.23.46 (29 Nov 2001) .......................... 954 D.4.15. Alteraes na distribuio 3.23.45 (22 Nov 2001) .......................... 954 D.4.16. Alteraes na distribuio 3.23.44 (31 Oct 2001) ........................... 955 D.4.17. Alteraes na distribuio 3.23.43 (04 Oct 2001) ........................... 956 D.4.18. Alteraes na distribuio 3.23.42 (08 Sep 2001) ........................... 956 D.4.19. Alteraes na distribuio 3.23.41 (11 Aug 2001) .......................... 957 D.4.20. Alteraes na distribuio 3.23.40 .............................................. 958 D.4.21. Alteraes na distribuio 3.23.39 (12 Jun 2001) ........................... 959 D.4.22. Alteraes na distribuio 3.23.38 (09 May 2001) ......................... 959 D.4.23. Alteraes na distribuio 3.23.37 (17 Apr 2001) .......................... 960 D.4.24. Alteraes na distribuio 3.23.36 (27 Mar 2001) .......................... 961 D.4.25. Alteraes na distribuio 3.23.35 (15 Mar 2001) .......................... 961 D.4.26. Alteraes na distribuio 3.23.34a ............................................. 962 D.4.27. Alteraes na distribuio 3.23.34 (10 Mar 2001) .......................... 962 xiii

Manual de Referncia do MySQL

D.4.28. Alteraes na distribuio 3.23.33 (09 Feb 2001) ........................... 963 D.4.29. Alteraes na distribuio 3.23.32 (22 Jan 2001: Production) ........... 964 D.4.30. Alteraes na distribuio 3.23.31 (17 Jan 2001) ........................... 965 D.4.31. Alteraes na distribuio 3.23.30 (04 Jan 2001) ........................... 965 D.4.32. Alteraes na distribuio 3.23.29 (16 Dec 2000) .......................... 966 D.4.33. Alteraes na distribuio 3.23.28 (22 Nov 2000: Gamma) .............. 968 D.4.34. Alteraes na distribuio 3.23.27 (24 Oct 2000) ........................... 970 D.4.35. Alteraes na distribuio 3.23.26 (18 Oct 2000) ........................... 970 D.4.36. Alteraes na distribuio 3.23.25 (29 Sep 2000) ........................... 971 D.4.37. Alteraes na distribuio 3.23.24 (08 Sep 2000) ........................... 972 D.4.38. Alteraes na distribuio 3.23.23 (01 Sep 2000) ........................... 973 D.4.39. Alteraes na distribuio 3.23.22 (31 Jul 2000) ............................ 974 D.4.40. Alteraes na distribuio 3.23.21 .............................................. 975 D.4.41. Alteraes na distribuio 3.23.20 .............................................. 975 D.4.42. Alteraes na distribuio 3.23.19 .............................................. 976 D.4.43. Alteraes na distribuio 3.23.18 .............................................. 976 D.4.44. Alteraes na distribuio 3.23.17 .............................................. 976 D.4.45. Alteraes na distribuio 3.23.16 .............................................. 977 D.4.46. Alteraes na distribuio 3.23.15 (May 2000: Beta) ...................... 978 D.4.47. Alteraes na distribuio 3.23.14 .............................................. 979 D.4.48. Alteraes na distribuio 3.23.13 .............................................. 979 D.4.49. Alteraes na distribuio 3.23.12 (07 Mar 2000) .......................... 980 D.4.50. Alteraes na distribuio 3.23.11 .............................................. 980 D.4.51. Alteraes na distribuio 3.23.10 .............................................. 981 D.4.52. Alteraes na distribuio 3.23.9 ................................................ 981 D.4.53. Alteraes na distribuio 3.23.8 (02 Jan 2000) ............................. 982 D.4.54. Alteraes na distribuio 3.23.7 (10 Dec 1999) ............................ 983 D.4.55. Alteraes na distribuio 3.23.6 ................................................ 983 D.4.56. Alteraes na distribuio 3.23.5 (20 Oct 1999) ............................ 984 D.4.57. Alteraes na distribuio 3.23.4 (28 Sep 1999) ............................ 985 D.4.58. Alteraes na distribuio 3.23.3 ................................................ 986 D.4.59. Alteraes na distribuio 3.23.2 (09 Aug 1999) ........................... 986 D.4.60. Alteraes na distribuio 3.23.1 ................................................ 987 D.4.61. Alteraes na distribuio 3.23.0 (05 Aug 1999: Alpha) .................. 987 D.5. Alteraes na distribuio 3.22.x (Old; discontinued) ................................. 989 D.5.1. Alteraes na distribuio 3.22.35 ................................................ 989 D.5.2. Alteraes na distribuio 3.22.34 ................................................ 990 D.5.3. Alteraes na distribuio 3.22.33 ................................................ 990 D.5.4. Alteraes na distribuio 3.22.32 (14 Feb 2000) ............................ 990 D.5.5. Alteraes na distribuio 3.22.31 ................................................ 990 D.5.6. Alteraes na distribuio 3.22.30 ................................................ 990 D.5.7. Alteraes na distribuio 3.22.29 (02 Jan 2000) ............................. 991 D.5.8. Alteraes na distribuio 3.22.28 (20 Oct 1999) ............................ 991 D.5.9. Alteraes na distribuio 3.22.27 ................................................ 991 D.5.10. Alteraes na distribuio 3.22.26 (16 Sep 1999) ........................... 991 D.5.11. Alteraes na distribuio 3.22.25 .............................................. 992 D.5.12. Alteraes na distribuio 3.22.24 (05 Jul 1999) ............................ 992 D.5.13. Alteraes na distribuio 3.22.23 (08 Jun 1999) ........................... 992 D.5.14. Alteraes na distribuio 3.22.22 (30 Apr 1999) .......................... 993 D.5.15. Alteraes na distribuio 3.22.21 .............................................. 993 D.5.16. Alteraes na distribuio 3.22.20 (18 Mar 1999) .......................... 993 D.5.17. Alteraes na distribuio 3.22.19 (Mar 1999: Production) .............. 993 D.5.18. Alteraes na distribuio 3.22.18 .............................................. 994 D.5.19. Alteraes na distribuio 3.22.17 .............................................. 994 D.5.20. Alteraes na distribuio 3.22.16 (Feb 1999: Gamma) .................. 994 D.5.21. Alteraes na distribuio 3.22.15 .............................................. 994 D.5.22. Alteraes na distribuio 3.22.14 .............................................. 995 D.5.23. Alteraes na distribuio 3.22.13 .............................................. 995 D.5.24. Alteraes na distribuio 3.22.12 .............................................. 995 D.5.25. Alteraes na distribuio 3.22.11 .............................................. 996 D.5.26. Alteraes na distribuio 3.22.10 .............................................. 996 D.5.27. Alteraes na distribuio 3.22.9 ................................................ 997 D.5.28. Alteraes na distribuio 3.22.8 ................................................ 998 xiv

Manual de Referncia do MySQL

D.5.29. Alteraes na distribuio 3.22.7 (Sep 1998: Beta) ......................... 998 D.5.30. Alteraes na distribuio 3.22.6 ................................................ 999 D.5.31. Alteraes na distribuio 3.22.5 ................................................ 999 D.5.32. Alteraes na distribuio 3.22.4 .............................................. 1001 D.5.33. Alteraes na distribuio 3.22.3 .............................................. 1001 D.5.34. Alteraes na distribuio 3.22.2 .............................................. 1001 D.5.35. Alteraes na distribuio 3.22.1 (Jun 1998: Alpha) ..................... 1002 D.5.36. Alteraes na distribuio 3.22.0 .............................................. 1003 D.6. Alteraes na distribuio 3.21.x .......................................................... 1004 D.6.1. Alteraes na distribuio 3.21.33 .............................................. 1004 D.6.2. Alteraes na distribuio 3.21.32 .............................................. 1004 D.6.3. Alteraes na distribuio 3.21.31 .............................................. 1005 D.6.4. Alteraes na distribuio 3.21.30 .............................................. 1005 D.6.5. Alteraes na distribuio 3.21.29 .............................................. 1006 D.6.6. Alteraes na distribuio 3.21.28 .............................................. 1006 D.6.7. Alteraes na distribuio 3.21.27 .............................................. 1006 D.6.8. Alteraes na distribuio 3.21.26 .............................................. 1006 D.6.9. Alteraes na distribuio 3.21.25 .............................................. 1007 D.6.10. Alteraes na distribuio 3.21.24 ............................................ 1007 D.6.11. Alteraes na distribuio 3.21.23 ............................................ 1007 D.6.12. Alteraes na distribuio 3.21.22 ............................................ 1008 D.6.13. Alteraes na distribuio 3.21.21a ........................................... 1009 D.6.14. Alteraes na distribuio 3.21.21 ............................................ 1009 D.6.15. Alteraes na distribuio 3.21.20 ............................................ 1009 D.6.16. Alteraes na distribuio 3.21.19 ............................................ 1009 D.6.17. Alteraes na distribuio 3.21.18 ............................................ 1009 D.6.18. Alteraes na distribuio 3.21.17 ............................................ 1010 D.6.19. Alteraes na distribuio 3.21.16 ............................................ 1010 D.6.20. Alteraes na distribuio 3.21.15 ............................................ 1011 D.6.21. Alteraes na distribuio 3.21.14b ........................................... 1011 D.6.22. Alteraes na distribuio 3.21.14a ........................................... 1011 D.6.23. Alteraes na distribuio 3.21.13 ............................................ 1012 D.6.24. Alteraes na distribuio 3.21.12 ............................................ 1012 D.6.25. Alteraes na distribuio 3.21.11 ............................................ 1013 D.6.26. Alteraes na distribuio 3.21.10 ............................................ 1014 D.6.27. Alteraes na distribuio 3.21.9 .............................................. 1014 D.6.28. Alteraes na distribuio 3.21.8 .............................................. 1014 D.6.29. Alteraes na distribuio 3.21.7 .............................................. 1015 D.6.30. Alteraes na distribuio 3.21.6 .............................................. 1015 D.6.31. Alteraes na distribuio 3.21.5 .............................................. 1015 D.6.32. Alteraes na distribuio 3.21.4 .............................................. 1016 D.6.33. Alteraes na distribuio 3.21.3 .............................................. 1016 D.6.34. Alteraes na distribuio 3.21.2 .............................................. 1017 D.6.35. Alteraes na distribuio 3.21.0 .............................................. 1018 D.7. Alteraes na distribuio 3.20.x .......................................................... 1019 D.7.1. Alteraes na distribuio 3.20.18 .............................................. 1019 D.7.2. Alteraes na distribuio 3.20.17 .............................................. 1019 D.7.3. Alteraes na distribuio 3.20.16 .............................................. 1020 D.7.4. Alteraes na distribuio 3.20.15 .............................................. 1021 D.7.5. Alteraes na distribuio 3.20.14 .............................................. 1021 D.7.6. Alteraes na distribuio 3.20.13 .............................................. 1021 D.7.7. Alteraes na distribuio 3.20.11 .............................................. 1022 D.7.8. Alteraes na distribuio 3.20.10 .............................................. 1022 D.7.9. Alteraes na distribuio 3.20.9 ................................................ 1023 D.7.10. Alteraes na distribuio 3.20.8 .............................................. 1023 D.7.11. Alteraes na distribuio 3.20.7 .............................................. 1023 D.7.12. Alteraes na distribuio 3.20.6 .............................................. 1023 D.7.13. Alteraes na distribuio 3.20.3 .............................................. 1025 D.7.14. Alteraes na distribuio 3.20.0 .............................................. 1025 D.8. Alteraes na distribuio 3.19.x .......................................................... 1026 D.8.1. Alteraes na distribuio 3.19.5 ................................................ 1026 D.8.2. Alteraes na distribuio 3.19.4 ................................................ 1026 D.8.3. Alteraes na distribuio 3.19.3 ................................................ 1027 xv

Manual de Referncia do MySQL

E. Portando para Outros Sistemas ........................................................................ 1028 E.1. Depurando um Servidor MySQL .......................................................... 1029 E.1.1. Compilando o MYSQL para Depurao ....................................... 1029 E.1.2. Criando Arquivos Trace (Rastreamento) ...................................... 1030 E.1.3. Depurando o mysqld no gdb ...................................................... 1030 E.1.4. Usando Stack Trace ................................................................. 1031 E.1.5. Usando Arquivos de Log para Encontrar a Causa dos Erros no mysqld 1032 E.1.6. Fazendo um Caso de Teste Se Ocorre um Corrompimento de Tabela . 1033 E.2. Depurando um cliente MySQL. ............................................................ 1034 E.3. O Pacote DBUG ................................................................................ 1034 E.4. Mtodos de Lock ............................................................................... 1036 E.5. Comentrios Sobre Threads RTS .......................................................... 1037 E.6. Diferena en Entre Alguns Pacotes de Threads ........................................ 1038 F. Variveis de Ambientes do MySQL ................................................................. 1040 G. Sintaxe de Expresses Regulares do MySQL ..................................................... 1041 H. GPL - Licena Pblica Geral do GNU .............................................................. 1044 ndice Remissivo ............................................................................................. 1049

xvi

Preface
Este o Manual de Referncia para o Sistema de Banco de Dados MySQL. Este verso se refere a verso 5.0.6-beta do MySQL Server mas tambm se aplica a verses mais antigas (tais como 3.23 e 4.0-produo) j que as alteraes so sempre indicadas. Tambm h referncia a verso 5.0 (desenvolvimento).

xvii

Captulo 1. Informaes Gerais


O programa MySQL (R) um servidor robusto de bancos de dados SQL (Structured Query Language - Linguagem Estruturada para Pesquisas) muito rpido, multi-tarefa e multi-usurio. O Servidor MySQL pode ser usado em sistemas de produo com alta carga e misso crtica bem como pode ser embutido em programa de uso em massa. MySQL uma marca registrada da MySQL AB. O programa MySQL de Licena Dupla. Os usurios podem escolher entre usar o programa 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 comercial padro da MySQL AB. See Seco 1.4, Suporte e Licenciamento do MySQL. O site web do MySQL (http://www.mysql.com/) dispe das ltimas informaes sobre o programa MySQL. A seguinte lista descreve algumas sees de particular interesse neste manual: Para informaes sobre a empresa por trs do Servidor do Banco de Dados MySQL, veja Seco 1.3, Viso Geral da MySQL AB. Para discusses das capacidades do Servidor do Banco de Dados MySQL, veja Seco 1.2.2, As Principais Caractersticas do MySQL. Para instrues de instalao, veja Captulo 2, Instalao do MySQL. Para dicas sobre a portabilidade do Servidor do Banco de Dados MySQL para novas arquiteturas ou sistemas operacionais, veja Apndice E, Portando para Outros Sistemas. Para informaes sobre a atualizao da verso 4.0, veja Seco 2.5.1, Atualizando da Verso 4.0 para 4.1. Para informaes sobre a atualizao da verso 3.23, veja Seco 2.5.2, Atualizando da Verso 3.23 para 4.0. Para informaes sobre a atualizao da verso 3.22, veja Seco 2.5.3, Atualizando da verso 3.22 para 3.23. Para um tutorial de introduo ao Servidor do Banco de Dados MySQL, veja Captulo 3, Tutorial de Introduo Do MySQL. Para exemplos de SQL e informaes sobre benchmarks, veja o diretrio de benchmarks (sqlbench na distribuio). Para o histrico de novos recursos e correes de erros, veja Apndice D, Histrico de Alteraes do MySQL. Para uma lista de erros atualmente conhecidos e mal-funcionamento, veja Seco 1.8.6, Erros Conhecidos e Deficincias de Projetos no MySQL. Para projetos futuros, veja Seco 1.6, MySQL e o Futuro (o TODO). Para ver a lista de todos os colaboradores deste projeto, veja Apndice C, Colaboradores do MySQL.

Importante: Relatrios de erros (tambm chamados bugs), bem como dvidas e comentrios, devem ser enviados para a lista de email geral do MySQL. See Seco 1.7.1.1, As Listas de Discusso do MySQL. See Seco 1.7.1.3, Como relatar erros ou problemas. 1

Informaes Gerais

O script mysqlbug deve ser usado para gerar comunicados de erros no Unix. (A distribuio do Windows contm um arquivo mysqlbug.txt no diretrio base que pode ser usado como um template para um relatrio de erro. Em distribuies fonte, o script mysqlbug pode ser encontrado no diretrio scripts. Para distribuies binrias, o mysqlbug pode ser encontrado no diretrio bin (/usr/bin para o pacote RMP do servidor MySQL. Se voc encontrou um erro de segurana no Servidor MySQL, voc deve enviar um email para <security@mysql.com>.

1.1. Sobre Este Manual


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

1.1.1. Convenes Usadas Neste Manual


Este manual utiliza algumas convenes tipogrficas: constant Fonte de largura fixa usada para nomes de comandos e opes; instrues SQL; nomes de bancos de dados, tabelas e colunas; cdigo C e Perl; e variveis de ambiente. Exemplo: ``Para ver como o mysqladmin funciona, execute-o com a opo --help.'' filename Fonte de largura fixa com aspas usada para nomes e caminhos de arquivos. Exemplo: ``A distribuio instalada sobre o diretrio /usr/local.'' 2

Informaes Gerais

c Fonte de largura constante com aspas tambm usada para indicar sequncias de caracteres. Exemplo: ``Para especificar um meta caracter, use o caractere %.''

italic Fonte Itlica usada para dar nfase, como aqui.

boldface Fonte em negrito usada em cabealhos de tabela e indicar nfase especial.

Quando um comando deve ser executado por um programa, ele indicado por um prompt antes do comando. Por exemplo, shell> indica um comando que executado do seu shell atual e mysql> indica um comando que executado no programa cliente mysql; shell> digite um comando shell aqui mysql> digite um comando mysql aqui A ``shell'' seu interpretador de comando. No Unix, ele normalmente um programa como sh ou csh. No Windows, o equivalente o command.com ou cmd.exe, normalmente executado como um console do Windows. Comandos Shell so mostrados usando a sintaxe do Shell Bourne. Se voc usa um shell do estilo csh, pode ser necessrio alterar algum de seus comandos. Por exemplo, a sequncia para configurar uma varivel de ambiente e executar um comando se parece com o listado abaixo na sintaxe Bourne Shell: shell> NOMEVAR=valor algum_comando Para csh ou tcsh, execute a sequncia desta forma: shell> setenv NOMEVAR valor shell> algum_comando Frequentemente, nomes de bancos de dados, tabelas e colunas devem ser substitudos nos comandos. Para indicar que as substituies so necessrias, este manual usa nome_db, nome_tbl e nome_col. Por exemplo, voc pode encontrar uma expresso assim: mysql> SELECT nome_col FROM nome_bd.nome_tbl; Isso significa que se voc estiver trabalhando numa expresso similar, forneceria seu prprio 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 manual utiliza letras maisculas. Em descries de sintaxe, colchetes ([ e ]) so usados para indicar palavras ou clusulas opcionais. Por exemplo, na seguinte instruo, IF EXISTS opcional: DROP TABLE [IF EXISTS] nome_tbl Quando elementos da sintaxe possuem mais de uma alternativa, elas so separados por barras verticais (|). Quando um menbro de um conjunto de opes pode ser escolhido, as alternativas so listadas em colchetes ([ e ]): 3

Informaes Gerais

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) Quando um membro de um conjunto de opes deve ser selecionado, as alternativas so listadas dentro de chaves ({ e }): {DESCRIBE | DESC} nome_tbl {nome_col | metacar}

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


MySQL, o mais popular sistema de gerenciamento de banco de dados SQL Open Source, desenvolvido, distribudo e tem suporte da MySQL AB. A MySQL AB uma empresa comercial, fundada pelos desenvolvedores do MySQL, cujos negcios fornecer servios relacionados ao sistema de gerenciamento de banco de dados MySQL. See Seco 1.3, Viso Geral da MySQL AB. O web site do MySQL (http://www.mysql.com/) fornece informaes mais recentes sobre e programa MySQL e a MySQL AB. O MySQL um sistema de gerenciamento de bancos de dados. Um banco de dados uma coleo de dados estruturados. Ele pode ser qualquer coisa desde uma simples lista de compras a uma galeria de imagens ou a grande quantidade de informao da sua rede coorporativa. Para adicionar, acessar, e processar dados armazenados em um banco de dados de um computador, voc necessita de um sistema de gerenciamento de bancos de dados como o Servidor MySQL. Como os computadores so muito bons em lidar com grandes quantidades de dados, o gerenciamento de bancos de dados funciona como a engrenagem central na computao, seja como utilitrios independentes ou como partes de outras aplicaes. O MySQL um sistema de gerenciamento de bancos de dados relacional. Um banco de dados relacional armazena dados em tabelas separadas em vez de colocar todos os dados um s local. Isso proporciona velocidade e flexibilidade. A parte SQL do ``MySQL'' atenda pela ``Structured Query Language - Linguagem Estrutural de Consultas''. SQL linguagem padro mais comum usada para acessar banco de dados e definida pelo Padro ANSI/ISO SQL. (O padro SQL est vem evoluindo desde 1986 e existem diversas verses. Neste manual, ''SQL-92'' se refere ao padro liberado em 1992, ''SQL-99'' se refere ao padro liberado em 1999, e ''SQL:2003'' se refere a verso do que esperamos que seja liberado no meio de 2003. Ns usamos o termo ''o padro SQL'' indicando a verso atual do Padro SQL em qualquer momento). O MySQL um software Open Source. Open Source significa que possvel para qualquer um usar e modificar o programa. Qualquer pessoa pode fazer download do MySQL pela Internet e us-lo sem pagar nada. Se voc quiser, voc pode estudar o cdigo fonte e alter-lo para adequ-lo s suas necessidades. O MySQL usa a GPL (GNU General Public License - Licena Pblica Geral GNU) http://www.fsf.org/licenses, para definir o que voc pode e no pode fazer com o software em diferentes situaes. Se voc sentir desconforto com a GPL ou precisar embutir o MySQL em uma aplicao comercial voc pode adquirir a verso comercial licenciada conosco. See Seco 1.4.3, Licenas do MySQL. Por que usar o Banco de Dados MySQL? O servidor de banco de dados MySQL extremamente rpido, confivel, e fcil de usar. Se isto o que voc est procurando, voc deveria experiment-lo. O Servidor MySQL tambm tem um conjunto de recursos muito prticos desenvolvidos com a cooperao de nossos 4

Informaes Gerais

usurios. Voc pode encontrar comparativos de performance do Servidor MySQL com outros gerenciadores de bancos de dados na nossa pgina de benchmark See Seco 5.1.4, O Pacote de Benchmark do MySQL. O Servidor MySQL foi desenvolvido originalmente para lidar com bancos de dados muito grandes de maneira muito mais rpida que as solues existentes e tem sido usado em ambientes de produo de alta demanda por diversos anos de maneira bem sucedida. Apesar de estar em constante desenvolvimento, o Servidor MySQL oferece hoje um rico e proveitoso conjunto de funes. A conectividade, velocidade, e segurana fazem com que o MySQL seja altamente adaptvel para acessar bancos de dados na Internet. As caractersticas tcnicas do MySQL Para informaes tcnicas avanadas, veja Captulo 6, Referncia de Linguagem do MySQL. O Programa de Banco de Dados MySQL um sistema cliente/servidor que consiste de um servidor SQL multi-tarefa que suporta acessos diferentes, diversos programas clientes e bibliotecas, ferramentas administrativas e diversas interfaces de programao (API's). Tambm concedemos o Servidor MySQL como uma biblioteca multi-tarefa que voc pode ligar sua aplicao para chegar a um produto mais rpido, menor e mais fcilmente gerencivel. MySQL tem muitos softwares de colaboradores disponvel. bem provvel que sua aplicao ou linguagem favorita j suporte o Servidor de Banco de Dados MySQL. A pronncia oficial do MySQL ``Mai Ess Que Ell'' (e no MAI-SEQUEL). Mas ns no ligamos se voc pronunciar MAI-SEQUEL ou de outra forma qualquer.

1.2.1. Histria do MySQL


Quando comeamos, tnhamos a inteno de usar o mSQL para conectar s nossas tabelas utilizando nossas rpidas rotinas de baixo nvel (ISAM). Entretanto, depois de alguns testes, chegamos a concluso que o mSQL no era rpido e nem flexvel o suficiente para nossas necessidades. Isto resultou em uma nova interface SQL para nosso banco de dados, mas com praticamente a mesma Interface API do mSQL. Esta API foi escolhida para facilitar a portabilidade para cdigos de terceiros que era escrito para uso com mSQL para ser portado facilmente para uso com o MySQL. A derivao do nome MySQL no bem definida. Nosso diretrio base e um grande nmero de nossas bibliotecas e ferramentas sempre tiveram o prefixo ``my'' por pelo menos 10 anos. A filha de Monty tambm ganhou o nome My. Qual das duas originou o nome do MySQL continua sendo um mistrio, mesmo para ns. O nome do golfinho do MySQL (nosso logo) Sakila. Sakila foi escolhido pelos fundadores da MySQL AB de uma enorme lista de nomes sugeridos pelos usurios em nosso 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 razes em SiSwati, a lngua local de Swaziland. Sakila tambm o nome de uma cidade em Arusha, Tanzania, prxima ao pas de orgem de Ambrose, Uganda.

1.2.2. As Principais Caractersticas do MySQL


A seguinte lista descreve algumas das caractersticas mais importantes do Progrma de Banco de Dados MySQL. See Seco 1.5.1, MySQL 4.0 in a Nutshell. Portabilidade e Escrito em C e C++.

Informaes Gerais

Testado com um amplo faixa de compiladores diferentes. Funciona em diversas plataformas. See Seco 2.2.3, Sistemas Operacionais suportados pelo MySQL. Utiliza o GNU Automake, Autoconf, e Libtool para portabilidade. APIs para C, C++, Eiffel, Java, Perl, PHP, Python, Ruby e Tcl esto disponveis. See Captulo 12, Ferramentas de Clientes e APIs do MySQL. Suporte total a multi-threads usando threads diretamente no kernel. Isto significa que se pode facilmente usar mltiplas CPUs, se disponvel. Fornece mecanismos de armazenamento transacional e no transacional. Tabelas em disco (MyISAM) baseadas em rvores-B extremamente rpidas com compresso de ndices. relativamente fcil se adicionar outro mecanismo de armazenamento. Isto til se voc quiser adicionar uma interface SQL a um banco de dados caseiro. Um sistema de alocao de memria muito rpido e baseado em processo(thread). Joins muito rpidas usando uma multi-join de leitura nica otimizada. Tabelas hash em memria que so usadas como tabelas temporrias. Funes SQL so implementadas por meio de uma biblioteca de classes altamente otimizada e com o mximo de performance. Geralmente no h nenhuma alocao de memria depois da inicializao da pesquisa. O cdigo do MySQL foi testado com Purify (um detector comercial de falhas de memria) e tambm com o Valgrind, uma ferramenta GPL (http://developer.kde.org/~sewardj/). Disponvel como verso cliente/servidor ou embutida(ligada).

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. See Seco 6.2, Tipos de Campos. Registros de tamanhos fixos ou variveis.

Comandos e Funes Completo suporte a operadores e funes nas partes SELECT e WHERE das consultas. Por exemplo: mysql> SELECT CONCAT(first_name, " ", last_name) -> FROM nome_tbl -> WHERE income/dependents > 10000 AND age > 30; Suporte pleno s clusulas SQL GROUP BY e ORDER BY. Suporte para funes 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 disponveis como definidos no padro SQL92. DELETE, INSERT, REPLACE, e UPDATE retornam o nmero de linhas que foram alteradas 6

Informaes Gerais

(afetadas). possvel retornar o nmero de linhas com padro coincidentes configurando um parmetro quando estiver conectando ao servidor. O comando especfico do MySQL SHOW pode ser usado para devolver informaes sobre bancos de dados, tabelas e ndices. O comando EXPLAIN pode ser usado para determinar como o otimizador resolve a consulta. Nomes de funes no conflitam com nomes de tabelas ou colunas. Por exemplo, ABS um nome de campo vlido. A nica restrio que para uma chamada de funo, espaos no so permitidos entre o nome da funo e o ( que o segue. See Seco 6.1.7, Tratamento de Palavras Reservadas no MySQL. Voc pode misturar tabelas de bancos de dados diferentes na mesma pesquisa (como na verso 3.22).

Segurana Um sistema de privilgios e senhas que muito flexvel, seguro e que permite verificao baseada em estaes/mquinas. Senhas so seguras porque todo o trfico de senhas criptografado quando voc se conecta ao servidor.

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 o Servidor MySQL com 60.000 tabelas e aproximadamente 5.000.000.000 de linhas. So permitidos at 32 ndices por tabela. Cada ndice pode ser composto de 1 a 16 colunas ou partes de colunas. O tamanho mximo do ndice de 500 bytes (isto pode ser alterado na compilao do MySQL). Um ndice pode usar o prefixo de campo com um tipo CHAR ou VARCHAR.

Conectividade Os clientes podem se conectar ao servidor MySQL usando sockets TCP/IP, em qualquer plataforma. No sistema Windows na famlia NT (NT, 2000 ou XP), os clientes podem se conectar usando named pipes. No sistema Unix, os clientes podem se conectar usando arquivos sockets. A interface Connector/ODBC fornece ao MySQL suporte a progras clientes que usam conexo ODBC (Open-DataBase-Connectivity). Por exemplo, voc pode usar o MS Access para conectar ao seu servidor MySQL. Os clientes podem ser executados no Windows ou Unix. O fonte do Connector/ODBC est disponvel. Todas as funes ODBC so suportadas, assim como muitas outras. See Seco 12.2, Suporte ODBC ao MySQL.

Localizao O servidor pode apresentar mensagem de erros aos clientes em vrias lnguas. See Seco 4.7.2, Mensagens de Erros em Outras Lnguas. Suporte total para vrios conjuntos de caracteres, que incluem ISO-8859-1 (Latin1), big5, ujis e mais. Por exemplo, os caracteres Escandinavos , , so permitidos em nomes de tabelas e colunas. Todos os dados so armazenados no conjunto de caracteres escolhido. Todas as comparaes em colunas de seqncias caso-insensitivo. A ordenao feita de acordo com o conjunto de caracteres escolhido (o modo sueco por padro). possvel alterar isso quando o servidor MySQL iniciado. Para ver um exemplo de vrias ordenaes avanadas, procure pelo cdigo de ordenao Tcheca. O Servidor MySQL suporta diversos conjuntos de caracteres que podem ser especificados em tempo de 7

Informaes Gerais

compilao e execuo. Clientes e Ferramentas O servidor MySQL foi construdo com suporte para instrues SQL que verificam, otimizam e reparam tabelas. Estas instrues esto disponveis a partir da linha de comando por meio do cliente myisamcheck, O MySQL inclui tambm o myisamchk, um utilitrio muito rpido para realizar estas operaes em tabelas MyISAM. See Captulo 4, Administrao do Bancos de Dados MySQL. Todos os programas MySQL podem ser chamados com as opes --help ou -? para obter ajuda online.

1.2.3. Estabilidade do MySQL


Esta seo discute as questes ``Quo estvel o MySQL?'' e ``Posso depender do MySQL neste projeto?''. Tentaremos deixar claro estes assuntos e responder algumas das questes mais importantes que dizem respeito a muito de nossos usurios. A informao nesta seo baseada em dados colhidos da lista de discusso, que muito ativa na identificao de problemas e assim como nos relatos de tipos de uso. Originalmente, o cdigo vem do incio dos anos 80, fornecendo um cdigo estvel e o formato de tabelas ISAM permanece compatvel com verses anteriores. Na TcX, a predecessora da 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, nossos novos usurios rapidamente encontraram algumas partes de ``cdigo sem testes''. Desde ento, cada distribuio nova teve menos problemas de portabilidade (mesmo com os novos recursos implementados em cada uma destas verses) Cada distribuio do Servidor MySQL foi sendo usado, e os problemas tem ocorrido somente quando os usurios comeam a usar o cdigo das ``reas cinzentas.'' Naturalmente, novos usurios no sabem o que so as reas cinzentas; esta seo tenta indicar aquelas que so conhecidas atualmente. As descries lidam com a Verso 3.23 e 4.0 do Servidor MySQL. Todos os erros conhecidos e relatados so corrigidos na ltima verso, com a exceo dos bugs listados na seo de erros, os quais so relacionados ao desenho. See Seco 1.8.6, Erros Conhecidos e Deficincias de Projetos no MySQL. O Servidor MySQL escrito em mltiplas camadas com mdulos independentes. Alguns dos novos mdulos esto listados abaixo com indicaes de quo bem-testado foi cada um deles. Replicao --- Gamma Grandes grupos de servidores usando replicao esto em uso, com bom resultados. O trabalho no aprimoramento dos recursos de replicao continua no MySQL 4.x. Tabelas InnoDB --- Estvel (na 3.23, 3.23.49) O mecanismo de armazenamento transacional InnoDB foi declarado estvel na rvore do MySQL 3.23, a partir da verso 3.23.49. InnoDB tem sido usado em sistema de produo grandes e com carga pesada. Tabelas BDB --- Gamma O cdigo do Berkeley DB muito estvel, mas ainda estamos melhorando 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 outro tipos de tabela. Pesquisas Full-text --- Beta Pesquisa full-text funcionam mas ainda no so largamente usadas. Melhoramentos importantes 8

Informaes Gerais

forma implementados no MySQL 4.0. MyODBC 3.51 (usa ODBC SDK 3.51) --- Estvel Em grande uso na produo. Alguns problemas apresentados parecem ser relacionados a aplicao e independente do driver ODBC ou do servidor de banco de dados. Recuperao automtica de tabelas MyISAM --- Gamma Este status se aplica apenas ao novo cdigo que confere no mecanismo de armazenamento MyISAM que verifica, na inicializao, se a tabela foi fechada corretamente e executa uma conferncia/reparo automtico da tabela em caso negativo. Bulk-insert --- Alpha Novo recurso nas tabelas MyISAM no MySQL 4.0 para inseres mais rpidas de vrios registros. Locking --- Gamma Esse mdulo muito dependente do sistema. Em alguns sistemas existem certos problemas por utilizar o locking padro do SO (fcntl(). Nestes casos, voc deve executar o mysqld com o parmetro --skip-external-locking. So conhecidos alguns problemas ocorridos em alguns sistemas Linux e no SunOS quando utiliza-se sistemas de arquivos montados em NFS. Clientes que pagam recebem suporte direto e de alta qualidade da MySQL AB. A MySQL AB tambm fornece uma lista de discusso como um recurso da comunidade onde qualquer pessoa pode tirar suas dvidas. Erros so normalmente corrigidos com um patch; para erros srios, normalmente lanada uma nova distribuio.

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 o novo MyISAM no MySQL verso 3.23 o tamanho mximo foi expandido at 8 milhes de terabytes (2 ^ 63 bytes). Com este tamanho de tabela maior permitido, o tamanho mximo efetivo das tabelas para o banco de dados MySQL normalmente limitado pelas restries do sistema operacional quanto ao tamanho dos arquivos, no mais por limites internos do 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 ( possvel 4GB com patch) 4G (pode ser alterado com parmetro) 4G 8T (?)

No Linux 2.2 voc pode ter tabelas maiores que 2 GB usando o patch LFS para o sistema de arquivos ext2. No Linux 2.4 j existem patches para o sistema de arquivos ReiserFS para ter suporte a arquivos maiores. A maioria das distribuies atuais so baseadas no kernel 2.4 e j incluem todos os patches Suporte a Arquivos Grandes (Large File Support - LFS) exigidos. No entanto, o tamanho mximo disponvel ainda depende de diversos fatores, sendo um deles o sistema de arquivos usado 9

Informaes Gerais

para armazenar as tabelas MySQL. Para um viso mais detalhada sobre LFS no Linux, d uma olha na pgina Andreas Jaeger's "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 tamanho mximo em torno de 4G. Voc pode verificar o tamanho mximo da tabela com o comando SHOW TABLE STATUS ou com o myisamchk -dv nome_tabela See Seco 4.6.8, Sintaxe de SHOW. Se voc precisa de tabelas maiores que 4G (e seu sistema operacional suporta arquivos grandes), a instruo CREATE TABLE permite as opes AVG_ROW_LENGHT e MAX_ROWS. Use estas opes para criar uma tabela que possa ter mais de 4GB. See Seco 6.5.3, Sintaxe CREATE TABLE. Voc pode tambm alterar isso mais tarde com ALTER TABLE. See Seco 6.5.4, Sintaxe ALTER TABLE. Outros modos se contornar o limite do tamanho do arquivo das tabelas MyISAM so os seguintes: Se sua tabela grande ser somente leitura, voc poder usar o myisampack para unir e comprimir vrias tabelas em uma. mysisampack normalmente comprime uma tabela em pelo menos 50%, portanto voc pode obter, com isso, tabelas muito maiores. See Seco 4.8.4, myisampack, O Gerador de Tabelas Compactadas de Somente Leitura do MySQL. Outra opo para contornar o limite de tamanho de arquivos do sistema operacional para arquivos de dados MyISAM usando a opo RAID. See Seco 6.5.3, Sintaxe CREATE TABLE. O MySQL inclu uma biblioteca MERGE que permite acessar uma coleo de tabelas idnticas como se fosse apenas uma. See Seco 7.2, Tabelas MERGE.

1.2.5. Compatibilidade Com o Ano 2000 (Y2K)


O Servidor MySQL no apresenta nenhum problema com o ano 2000 (Y2K compatvel) O Servidor MySQL usa funes de tempo Unix que tratam datas at o ano 2037 para valores TIMESTAMP; para valores DATE e DATETIME, datas at o ano 9999 so aceitas. Todas as funes de data do MySQL esto no arquivo sql/time.cc e codificadas com muito cuidado para ser compatvel com o ano 2000. No MySQL verso 3.22 e posterior, o novo tipo de campo YEAR pode armazenar anos 0 e 1901 at 2155 em 1 byte e mostr-lo usando 2 ou 4 dgitos. Todos os anos de 2 dgitos so considerados estar na faixa de 1970 at 2069; o que significa que se voc armazenar 01 em uma coluna YEAR, O Servidor MySQL o tratar como 2001.

O seguinte demonstrao simples ilustra que o MySQL Server no tem nenhum problema com datas at depois do ano 2030: mysql> DROP TABLE IF EXISTS y2k; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE y2k (date DATE, -> date_time DATETIME, -> time_stamp TIMESTAMP); Query OK, 0 rows affected (0.00 sec) mysql> -> -> -> -> INSERT INTO y2k VALUES ("1998-12-31","1998-12-31 ("1999-01-01","1999-01-01 ("1999-09-09","1999-09-09 ("2000-01-01","2000-01-01 10 23:59:59",19981231235959), 00:00:00",19990101000000), 23:59:59",19990909235959), 00:00:00",20000101000000),

Informaes Gerais

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

O valor da coluna TIMESTAMP final zero porque o ano final (2050) excede o TIMESTAMP maximo. O tipo de dados TIMESTAMP, que usado para armazenar a hora atual, suporta valores na faixa de 19700101000000 a 20300101000000 em mquinas 32 bits (valor com sinal). Em mquinas de 64 bits, TIMESTAMP trata valores at 2106 (valores sem sinal). O exemplo mostra que os tipos DATE e DATETIME no tem problemas com as datas usadas. Eles iro conseguir trabalhar com datas at o ano 9999. Embora o MySQL Server seja seguro em relao ao ano 2000, voc pode ter problemas se voc us-lo com aplicaes que no so seguras com o ano 2000. Por exemplo, muitas aplicaes antigas armazenam ou manipulam anos usando valores de 2 digitos (que so ambguos) em vez de 4 dgitos. Este problema pode ser aumentado por aplicaes que usam valores como 00 ou 99 como indicadores de valores ``perdidos''. Infelizmente, estes problemas pode ser difceis de corrigir, cada um deles pode usar um conjunto diferente de convenes e funes de tratamento de datas. Assim, apesar do Servidor MySQL no ter problemas com o ano 2000, de responsabilidade de sua aplicao fornecer datas que no sejam ambguas. Veja Seco 6.2.2.1, Assuntos referentes ao ano 2000 (Y2K) e Tipos de Data para as regras do Servidor MySQL para lidar com entrada de datas ambguas que contenham valores de ano com 2 dgitos.

1.3. Viso Geral da MySQL AB


MySQL AB a companhia dos fundadores e principais desenvolvedores do MySQL. A MySQL AB foi estabelecida originalmente na Sucia por David Axmark, Allan Larsson e Michael ``Monty'' Widenius. Os desenvolvedores do servidor MySQL so todos empregados pela companhia. ny Ns somo uma organizao virtual com pessoas em uma dzia de pases. Nos comunicamos extensivamente na internet todos os dias uns com os outros e com nossos usurios, agentes de suporte e parceiros. Ns nos dedicamos a desenvolver o programa MySQL e propagar nosso banco de dados a novos usurios.A MySQL AB detm os direitos autorais do cdigo fonte do MySQL, do logo e da marca 11

Informaes Gerais

MySQL e deste manual. See Seco 1.2, Viso Geral do Sistema de Gerenciamento de Banco de Dados MySQL. A ideologia do MySQL mostra nossa dedicao ao MySQL e ao Open Source. Ns desejamos que o Programa de Banco de Dados MySQL seja: O melhor e o mais usado banco de dados no mundo. Acessvel e disponvel para todos. Fcil de usar. Melhorado continuamente, permanecendo rpido e seguro. Divertido de se usar e aprimorar. Livre de erros (bugs).

A MySQL AB e sua equipe: Promovem a filosofia Open Source e suporte comunidade Open Source. Tem como objetivo serem bons cidados. Tem preferncia por parceiros que compartilhem nossos valores e idias. Respondem e-mails e do suporte. So uma empresa virtual, conectada com outras. Trabalha contra patentes de sistemas.

O site do MySQL (http://www.mysql.com/) fornece as ltimas informaes sobre o MySQL e a MySQL AB. A propsito, a parte ``AB'' do nome da companhia o acrnimo para a palavra suca ``aktiebolag'', ou ``sociedade annima.'' Ela traduzida para ``MySQL, Inc.'' De fato, MySQL Inc. e MySQL GmbH so exemplos de subsidirias da MySQL AB. Elas esto localizadas nos EUA e Alemanha, respectivamente.

1.3.1. O Modelo de Negcio e Servios da MySQL AB


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

1.3.1.1. Suporte
A MySQL AB gerenciada pelos fundadores e principais desenvolvedores do banco de dados MySQL. Os desenvolvedores tem o compromisso de dar suporte aos clientes e outros usurios com objetivo de manterem contato com as suas necessiades e problemas. Todo o nosso suporte dado por desenvolvedores qualificado. Dvidas mais complicadas so respondidas por Michael Monty 12

Informaes Gerais

Widenius, principal autor do MySQL Server. See Seco 1.4.1, Suporte Oferecido pela MySQL AB. Para maiores informaes e pedido de suporte de diversos nveis, http://www.mysql.com/support/ ou contate nossos vendedores em <sales@mysql.com>. veja

1.3.1.2. Treinamento e Certificao


A MySQL AB distribui o MySQL e treinamentos relacionados mundialmente. Oferecemos tanto cursos abertos quanto fechados voltado para a necessidade especfica da sua empresa. O Treinamento do MySQL tambm est disponvel por meio de seus parceiros, os Centros de 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 a ltima verso do MySQL. Nossos instrutores so apoiados por nossa equipe de desenvolvimento para garantir a qualidade do treinamento e o desenvolvimento contnuo do material de nossos cursos. Isto tambm assegura que nenhuma questo surgida durante o curso fique sem resposta. Fazendo nossos cursos de treinamento permitir que voc alcance os objetivos de seu aplicativo MySQL. voc tambm ir: Economizar tempo. Melhorar o desempenho de seus aplicativos. Reduzir ou eliminar a necessidade de hardware adicional, baixando o custo. Melhorar a segurana. Aumentar a satisfao dos clientes e colabloradores. Preparar-se para Certificao MySQL.

Se voc estiver interessado em nosso treinamento como um participante em portencial ou como um parceiro de treinamento, viste a seo de treinamento em http://www.mysql.com/training/ ou contate nos em: <training@mysql.com>. Para detalhes sobre o Programa http://www.mysql.com/certification/. de Certificao MySQL, veja

1.3.1.3. Consultoria
A MySQL AB e seus Parceiros Autorizados oferecem servios de consultoria para usurios do Servidor MySQL e queles que utilizam o Servisdor MySQL embutido em seus programas, em qualquer parte do mundo. Nossos consultores podem ajud-lo projetando e ajustando o seu banco de dados, criar consultas eficientes, ajustar sua plataforma para uma melhor performance, resolver questes de migrao, configurar replicao, criar aplicaes transacionais robustas, e mais. Tambm ajudamos os nossos clientes com o Servidor MySQL embutido em seus produtos e aplicaes para desenvolvimento em larga-escala. Nossos consultores trabalham em colaborao com a nossa equipe de desenvolvimento, o que assegura a qualidade tcnica de nossos servios profissionais. Os servios de consultoria varia de sesses de 2 dias a projetos que gastam semanas e meses. Nosso peritos no apenas cobrem o Servidor MySQLeles tambm conhecem sobre linguagens de programao e scripts tais como PHP, Perl e mais. Se estiver interessado em nossos servios de consultoria ou quiser se tornar nosso parceiro, visite a seo sobre consultaria em nosso web site em http://www.mysql.com/consulting/ ou contate nossa equipe de consultoria em <consulting@mysql.com>. 13

Informaes Gerais

1.3.1.4. Licenas Comerciais


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

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 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 identificar seus produtos e promoverem os seus negcios. Se voc est interessado em se tornar um Parceiro da MySQL AB, envie-nos um email para <partner@mysql.com>. A palavra MySQL e o logomarca do golfinho da MySQL so marcas registradas da MySQL AB. See Seco 1.4.4, Logomarcas e Marcas Registradas da MySQL AB. Estas marcas registradas representam um valor significante que os fundadores do MySQL construiram ao longo dos anos. O web site do MySQL (http://www.mysql.com/) popular entre desenvolvedores e usurios. Em Outubro de 2001, obtivemos mais de 10 milhes e views. Nossos visitantes representam um grupo que tomam decises de compra e fazem recomendes de software e hardware. Vinte por cento de nossos vistantes autorizam decises de compra e apenas nove por cento no esto envolvidos com a rea de compras. Mais de 65% fizeram uma ou mais compras online no ltimo semaster e 70% planejam fazer uma compra nos prximos meses.

1.3.2. Informaes para Contato


O web site do MySQL (http://www.mysql.com/) fornece as ltimas informaes sobre MySQL e MySQL AB. Para servios de imprensa e questes no cobertas por nossas releases de nottcias (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, respostas precisas para as suas questes tcnicas sobre o programa MySQL. Para mais informaes, veja Seco 1.4.1, Suporte Oferecido pela MySQL AB. Em nosso site na web, veja 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 http://www.mysql.com/training/. Se voc tiver acesso restrito Internet, conte a equipe de treinamento da MySQL AB via e-mail em <training@mysql.com>. See Seco 1.3.1.2, Treinamento e Certificao. Para informaes sobre o Progrma de Certificao MySQL, http://www.mysql.com/certification/. See Seco 1.3.1.2, Treinamento e Certificao. veja

Se voc estiver interessado em consultoria, visite a seo de consultorias de nosso web site em http://www.mysql.com/consulting/. Se voc tiver restries acesso a internet, contate a equipe de consultores da MySQL AB via e-mail em <consulting@mysql.com>. See Seco 1.3.1.3, Consultoria. Licenas comerciais podem ser compradas online em https://order.mysql.com/. L voc tambm encontrar informaes de como enviar um fax da sua ordem de compra para a MySQL AB. Mais in14

Informaes Gerais

formaes sobre licenas podem ser encontradas em http://www.mysql.com/products/pricing.html. Se voc tiver duvidas em relao a licenciamento ou quiser cota para negociao de um alto volume de licenas, preencha o formulrio de contato em nosso site web (http://www.mysql.com/) ou envie um email para <licensing@mysql.com> (para questes sobre licenciamento) ou para <sales@mysql.com> (para pedidos de compra). See Seco 1.4.3, Licenas do MySQL. Se voc est interessado em fazer parceira com a MySQL <partner@mysql.com>. See Seco 1.3.1.5, Parcerias. AB, envie um e-mail para

Para mais detalhes sobre a poltica da marca MySQL, visite http://www.mysql.com/company/trademark.html ou envie um e-mail para <trademark@mysql.com>. See Seco 1.4.4, Logomarcas e Marcas Registradas da MySQL AB. Se voc est interessado em qualquer um dos trabalhos da MySQL AB lista na seo de trabalhos (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 final de sua mensagem de email. Para discusses gerais entre nosso muitos usurios, direcione a sua ateno para a lista de discusso apropriada. See Seco 1.7.1, Listas de Discusso MySQL. Relatrios de erros (geralmente chamados bugs), assim como questes e comentrios, devem ser enviados para a lista de email geral do MySQL. See Seco 1.7.1.1, As Listas de Discusso do MySQL. Caso voc encontre um bug de segurana importante no MySQL Server, envie-nos um e-mail para <security@mysql.com>. See Seco 1.7.1.3, Como relatar erros ou problemas. Se voc tiver resultados de benchmarks que podemos publicar, contate-nos via e-mail em <benchmarks@mysql.com>. Se voc tiver sugestes a respeito de adies ou conexes para este manual, envie-os para a equipe do manual via e-mail em <docs@mysql.com>. Para questes ou comentrios sobre o funcionamento ou cotedo do web site da MySQL (http://www.mysql.com/), envie um e-mail para <webmaster@mysql.com>. A MySQL AB tem uma poltica de privacidade que pode ser lida em http://www.mysql.com/company/privacy.html. Para qualquer questes a respeito desta poltica, 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.

1.4.1. Suporte Oferecido pela MySQL AB


O suporte tcnico do MySQL AB significa respostas individualizadas as seus problemas particulares diretamente dos engenheiros de software que codificaram o MySQL. Tentamos ter uma viso ampla e inclusiva de suporte tcnico. Qualquer problema envolvendo o MySQL importante par ns se for importante para voc. Normalmente os clientes procuram ajuda em como comandos e utilitrios diferentes funcionam, remover gargalos de desempenhos, restaurar sistemas com falhas, entender impactos do sistema operacional e rede no MySQL, configurar melhor prticas de backup e restaurao, utiluizaar APIs, e assim por diante. Nosso suporte cobre apenar o servidor MySQL e nossos prprios utilitrios, e no produtos de terceirosque acessam o servidor MySQL, embora tentamos ajudar com eles quando podemos. Informaes detalhadas sobre nossas vrias opes de suporte dado em Suporte tcnico como seguro de vida. Voc pode viver felizsem ele durante anos, mas quando sua hora chegar ele de grande importncia, mas j muito tarde para adquir-lo. Se voc utiliza o MySQL Server para aplicaes importantes e encontrar dificuldades repentinas, voc pode gastar 15

Informaes Gerais

horas tentando resolver os problemas sozinho. Voc pode precisar de acesso imediato aos responsveis pela soluo de problemas do MySQL dsiponveis, contratados pela MySQL AB.

1.4.2. Copyrights e Licenas Usadas pelo MySQL


MySQL AB possui os direitos sobre o cdigo fonte do MySQL, as logomarcas e marcas registradas do MySQL e este manual. See Seco 1.3, Viso Geral da MySQL AB. Diversas licenas so relevantes a distribuio do MySQL: 1. Todo o cdigo especfico do MySQL no servidor, a biblioteca mysqlclient e o cliente, assim como a biblioteca GNU readline coberta pela GNU General Public License. See Apndice H, GPL - Licena Pblica Geral do GNU. O texto desta licena podee ser encontrado no arquivo COPYING na distribuio. A biblioteca GNU getopt coberta pela GNU Lesser General Public License. Veja http://www.fsf.org/licenses/. Algumas partes da fonte (a biblioteca regexp) coberta por um copyright no estilo Berkeley. Verses mais antiga do MySQL (3.22 e anteriror) esto sujeitos a uma licena estrita (http://www.mysql.com/products/mypl.html). Veja a documentao da verso especfica para mais informao. O manual de referncia do MySQL atualmente no distribudo sob uma licecna no estilo da GPL. O uso deste manual est sujeito aos seguintes termos: A converso para outros formatos permitido, mas o contedo atual no pode ser alterado ou editado de modo algum. Voc pode criar uma cpia impressa para seu prprio uso pessoal. Para todos os outros usos, como venda de cpias impressas ou uso (de partes) do manual em outra publicao, necessrios um acordo com a MySQL AB previamente escrito.

2. 3. 4.

5.

Envie-nos email para <docs@mysql.com> para maiores informaes ou se voc estiver interessado em fazer a traduo. Para informaes sobre como as licenas do MySQL funcionam na prtica, de uma olhada em Seco 1.4.3, Licenas do MySQL. Veja tambm Seco 1.4.4, Logomarcas e Marcas Registradas da MySQL AB.

1.4.3. Licenas do MySQL


O programa MySQL distribudo sob a GNU General Public License (GPL), que provavelmente a melhor licena Open Source conhecida. Os termos formais da licena GPL pode ser encontrado em http://www.fsf.org/licenses/. Veja tambm http://www.fsf.org/licenses/gpl-faq.html e http://www.gnu.org/philosophy/enforcing-gpl.html. Como o programa MySQL distribudo sob a GPL, ele pode ser usa geralmente de graa, mas para certos usos voc pode querer ou precisar comprar lincenas comerciais da MySQL AB em https://order.mysql.com/. Veja http://www.mysql.com/products/licensing.html para mais informaes. Verses mais antigas do MySQL (3.22 e anteriores) esto sujeitos a uma licena mais estrita (http://www.mysql.com/products/mypl.html). Veja a documentao da verso especfica para mais informao. Note que o uso do programa MySQL sob uma licena comercial, GPL ou a antiga licena do MySQL no d automaticamente o direito de usar as marcas registradas da MySQL AB. See Seco 1.4.4, Logomarcas e Marcas Registradas da MySQL AB.

16

Informaes Gerais

1.4.3.1. Usando o Programa MySQL Sob uma Licena Comercial


A licena GPL contagiosa no sentido de que quando um programa ligado a um programa GPL, todo o cdigo fonte para todas as partes do produto resultante tambm devem ser distribudas sob a GPL. Se voc no seguir esta exigncia do GPL, voc quebra os termos da licena e perde o seu direito de usar o programa GPL includo. Voc tambm corre riscos. Voc precisar de uma licena comercial: Quando voc liga um programa com qualquer cdigo GPL do programa MySQL e no que que o produto resultante seja licenciado sob a GPL, talvez porque voc queira criar um produto comercial ou manter fechado o cdigo no GPL adicionado por outras razes. Ao comprar a lincena comercial, voc no est usando o programa MySQL sob GPL embora o cdigo seja o mesmo. Quando voc distribui uma aplicao no GPL que s funciona com o programa MySQL e a entrega com o programa MySQL. Este tipo de soluo considerada mesmo se feita em uma rede. Quando voc distribui cpias do programa MySQL sem fornecer o cdigo fonte como exigido sob a licena GPL. Quando voc quiser dar suporte adional ao desenvolvimento do banco de dados do MySQL mesmo se voc no precisar formalmente de uma licena comercial. Comprar o suporte diretamente da MySQL AB outro bom modo de contribuir com o desenvolvimento do programa MySQL, com vantagens imediatas para voc. See Seco 1.4.1, Suporte Oferecido pela MySQL AB.

Se voc requisita uma licecna, voc precisar de uma para cada instalao do programa MySQL. Ela cobre qualquer nmero de CPUs na mquina, e np h nenhum limite artificial no nmero de clientes que conectam aom servidor de qualquer modo. Para licenas comercias, ,visite o nosso site web em http://www.mysql.com/products/licensing.html. Para contrato de suporte, veja http://www.mysql.com/support/. Se voc tiver necessidades 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 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 produto. Quando voc distribui o cdigo fonte do MySQL junto com outros programas que no so ligados ou dependentes do sistema do MySQL para suas funcionalidades mesmo se voc vender a distribuio comercialmente. Isto chamado agregao na licena GPL. Quando voc no est distribuindo qualquer parte do sistema do MySQL, voc pode us-lo de graa. Quando voc for um Provedos de Servios de Internet (Internet Service Provider - ISP), 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 confiana qie seus provedores tero, de fato, os recursos para resolver qualquer problema que eles possam experimentar com a instalao do MySQL. Mesmo se um provedor no tiver uma licena comercial ara o MySQL Server, seus clientes devem ter acesso de leitura ao fonte da instalao do MySQL para que seus clientes verifiquem que ela est correta. Quando voc usa o banco de dados MySQL em conjunto com um servidor web, voc no precisa de uma licena comercial (uma vez que este no um produto distribudo por voc). Isto ver17

Informaes Gerais

dade mesmo se voc executar um servidor web comercial que utilize MySQL Server, pois voc no est distribuindo qualquer parte do sistema MySQL. No entanto, neste caso ns gostariamos que voc adquirisse o suporte ao MySQL pois o MySQL est ajudandoa sua empresa. Se o seu uso do banco de dados MySQL no exige uma licena comercial, lhe encorajamos a adquirir um suporte da MySQL AB de qualquer forma. Deste modo voc contribui com o desenvolvimento do MySQL e tambm ganha vantegens imediatas. See Seco 1.4.1, Suporte Oferecido pela MySQL AB. Se voc utiliza o bancdo de dados MySQL em um contexto comercial e obtem lucro com o seu uso, pedimos que voc ajude no desenvolvimento do MySQL adquirindo algum nvel de suporte. Sentimos que se banco de dados MySQL ajudou os seus negcios, razovel pedirmos que voc ajude a MySQL AB. (De outra forma, se voc nos pedir suporte, voc no s estar usando de graa algo em que colocamos muito trabalhom mas tambm pedindo que lhe forneamos suporte de graa tambm).

1.4.4. Logomarcas e Marcas Registradas da MySQL AB


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

1.4.4.1. O Logo Original do MySQL


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

1.4.4.2. Logomarcas da MySQL que Podem Ser Usadas Sem Permisso de Alterao
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 so totalmente irrestritas mas, como o nome indica, sujeitos a nossa poltica de marcas registradasque tambm est disponvel em nosso site. Voc deve ler a poltica de marcas registradas se plabeja us-las. As exigncias so basicamente as apresentadas aqui: Use a logomarca que voc preciisa como mostrado no site http://www.mysql.com/. Voc pode mudar sua escala para servir as suas necessidades, mas no pode alterar cores ou o desenho, ou alterar os graficos de forma alguma. Deixe evidente que voc, e no a MySQL AB, o criado e proprietrio do site que mostra a logomarca do MySQL. No use a logomarca em detrimento MySQL AB ou ao valor das marcas registradas da MySQL AB. Nos reservamos o direito de revogar o diretiro de uso da marcas registradas da MySQL AB. Se voc utilizar as maracas em um site da web, faa com que ele contenha um link para http://www.mysql.com/.

18

Informaes Gerais

Se voc utilizar o banco de dados MySQL sob GPL em uma aplicao, sua aplicao deve ser Open Source deve estar apta a conectar a um servidor MySQL.

Contate-nos via e-mail em <trademark@mysql.com> para saber sobre os nosso acordos especiais que sirvam as suas necessidades.

1.4.4.3. Quando Voc Precisa de Permisso de Alterao para Usar as Logomarcas do MySQL?
Voc precisa de permisso escrita da MySQL AB antes de usar as logomarcas do MySQL nos seguintes casos: Quando exibir qualquer logomarca da MySQL AB em qualquer lugar diferente so seu site. Quando exibir qualquer logomarca da MySQL AB exceta as de Uso Condicional mencionadas anteiormente em sites ou outro lugar.

Devido a razes comerciais e legais monitoramos o so das marcas registradas do MySQL em proutos, livros e outros itens. Normalmente exigimos um valor para a exibio das logomarcas da MySQL AB em produtos comerciais, j que achamos razovel que parte dos rendimentos seja retornado para financiar o desenvolvimento do banco de dados MySQL.

1.4.4.4. Logomarcas dos Parceiros da MySQL AB


As logomarcas de parceria do MySQL podem ser usados apenas por companhias e pessoas que possuem um acordo de parceria por escrito com a MySQL AB. Parceiras incluem certificao com treinador ou consultor do MySQL. Para mais informaes, Seco 1.3.1.5, Parcerias.

1.4.4.5. Usando a Palavra MySQL em Texto Impresso ou Apresentao


A MySQL AB considera bem vindas as referncias ao banco de dados MySQL mas deve ser indicado que a palavra MySQL uma marca registrada da MySQL AB. Por isto, voc deve 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 registrada da MySQL AB. Para mais informaes, veja nossa poltica de marcas registradas em http://www.mysql.com/company/trademark.html.

1.4.4.6. Usando a Palavra MySQL em Nomes de Companhias e Produtos


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

1.5. Mapa de Desenvolvimento do MySQL


Esta seo fornece uma amostra do mapa de desenvolvimento do MySQL, incluindo principais 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 mais requisitados esto listada na tabela a seguir. Feature Unions Subqueries R-trees 19 MySQL version 4.0 4.1 4.1 (para tabelas MyISAM)

Informaes Gerais

Stored procedures Views Cursors Foreign keys Triggers Full outer join Constraints

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 disponvel em sua verso de produo. O MySQL 4.0 est disponvel 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 mutios sites. Os principais novos recursos do MySQL Server 4.0 so trabalhados em conjunto com os usurios corporativos e da comunidade, melhorando o programa de banco de dados MySQL como uma soluo para misses crticas e sistemas de bancos de dados de alta carga. Outros novos recursos visam os usurios de bancos de dados embutidos. O MySQL 4.0 foi declarado estvel para uso em produo a partir da verso 4.0.12 em Maro de 2003. Isto significa que, no futuro, apenas correo de erros sero feitas para a distribuio da srie 4.0 e apenas correo de erros crticos sero feitas para a antiga srie 3.23. See Seco 2.5.2, Atualizando da Verso 3.23 para 4.0. Novos recursos para o MySQL est sendo adicionado ao MySQL 4.1 que tambm est disponvel (verso alfa). See Seco 1.5.2, MySQL 4.1 in a Nutshell.

1.5.1.1. Recursos Disponveis 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. See Seco 6.9, Cache de Consultas do MySQL. A verso 4.0 aumenta a velocidade do MySQL Server em um nmero e reas tais como INSERTs em bloco, buscas em ndices empacotados, criao de ndices FULLTEXT, e COUNT(DISTINCT).

Introduo ao Servidor MySQL Embutido A nova biblioteca do Servidor Ebutido pode ser facilmente usada em aplicaes standalone e embarcadas. O servidor embutido fornce uma alternativa para o uso do MySQL em um ambiente cliente/servidor. See Seco 1.5.1.2, Servidor Embutido MySQL.

Mecanismo de armazenamento InnoDB como padro O mecanismo de armazenamento InnoDB oferecido como um recurso padro do servidor MySQL. Isto significa suporte a transaes ACID, chaves estrangeiras com UPDATE/DELETE em cacata e lock de registro agora so recursos padres. See Seco 7.5, Tabelas InnoDB.

Novas fncionalidades A melhora das propriedades de busca FULLTEXT do MySQL Server 4.0 habilita indexao FULLTEXT de grandes partes de texto com linguagem natural e binria de lgica de busca. Voc pode personalizar o tamanho mnimo de palavras e definir a sua prpria lista de pala20

Informaes Gerais

vras de parasa em qualquer linguagem humana, habilitando um novo conjunto de aplicaes a serem construdas no MySQL Server. See Seco 6.8, Pesquisa Full-text no MySQL. Compatibilidade com os padres, portabilidade e migrao Recursos para simplificar a migrao de outros sistemas de banco de dados para o MySQL Server incluem TRUNCATE TABLE (como no Oracle) Muitos usurios tambm ficaro satisfeitos ao perceber que o MySQL Server agora suporta a instruo UNION, um recurso padro SQL muito esperado. O MySQL agora pode ser executado nativamente na plataforma Novell NetWare 6.0. See Seco 2.6.8, Notas Novell NetWare.

Internacionalizao Nossos usurios alemes, austracos e suios notaro que o MySQL agora suporta um novo conjunto de caracteres, latin1_de, que assegura que a Ordenao em alemo classificar palavras com umlauts na mesma ordem das agendas telefnicas alems.

Aprimoramento da Usabilidade No porcesso de construo de recursos para novos usurios, no esquecemos os pedidos de nossa leal comunidade de usurios. A maioria dos parmetros mysqld (opes de inicializao) agora podem ser definidas se finalizar o servidor. Isto um recurso conveniente para Administradores de Bancos de Dados (DBAs). See Seco 5.5.6, Sintaxe de SET. Instrues DELETE e UPDATE multi-tabelas foram adicionadas. Foi adicionado suporte ao mecanismo de armazenamento MyISAM para link simblico no nvel de tabela (e no apenas a nvel de banco de dados como antes) e para habilitar o tratamento de links simblicos no Windows por padro. SQL_CALC_FOUND_ROWS e FOUND_ROWS() so novas funes que tornaram possvel encontrar o nmeros de linhas que uma consulta SELECT que inclui uma clusula LIMIT teria retornado se a clusula no fosse utilizada.

A seo de novidades deste manual inclui uma lista mais aprofundada dos recursos. See Seco D.3, Alteraes na distribuio 4.0.x (Production).

1.5.1.2. Servidor Embutido MySQL


libmysqld faz o MySQL Server adequado para uma grande rea de aplicaes. Usando a biblioteca do servidor MySQL embutido, pode embarcar o MySQL Server em vrios aplicativos e dispositivos eletrnicos, onde o usurio final no tm conhecimento de possuir um banco de dados bsico. O servidor MySQL embutido ideal para uso nos bastidores em aplicaes de Internet, quiosques pblicos, responsvel por unidades de combinao hardware/software, servidores Internet de alta performance, banco de dados de auto-conteno distribudos em CDROM, e assim por diante Muitos usurios da libmysqld se benficiaro da iLicena Dual do MySQL. Para aqueles que no desejam ser limitar pela GPL, o software tambem est disponvel sob uma licena comercial. A biblioteca embutida do MySQL tambm usa a mesma interface que a biblioteca do cliente normal, sendo ento conveniente e fcil de usar. See Seco 12.1.15, libmysqld, a Biblioteca do Servidor Embutido MySQL.

1.5.2. MySQL 4.1 in a Nutshell


MySQL Server 4.0 prepara a criao de novos recursos como subqueries e Unicode (implementado 21

Informaes Gerais

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

1.5.2.1. Recursos Disponveis no MySQL 4.1


Os recursos listados nesta seo esto implementados no MySQL 4.1. Outros poucos recursos esto planejados para o MySQL 4.1. See Seco 1.6.1, Novos Recursos Planejados Para a Verso 4.1. A maioria dos novos recursos em codificao, como stored procedures, estaro disponveis no MySQL 5.0. See Seco 1.6.2, Novos Recursos Planejados Para a Verso 5.0. Suporte a subqueries e tabelas derivadas Uma subquery uma instruo SELECT aninhada dentro de outras instrues. Uma tabela dericada (unnamed view) uma subquery na clusula FROM de outras instrues. See Seco 6.4.2, Sintaxe de Subquery.

Aumento na velocidade Protocols binrios mais rpidos com instrues preparadas e parmetros de ligao. See Seco 12.1.4, Instrues Preparadas da API C. Indexao BTREE agora suportado por tabelas HEAP, aumentando de forma significante o tempo de resposta para busca que no so exatas.

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 nico comando. Suporte aos tipos espaciais OpenGIS (dados geogrficos). See Captulo 10, Extenses Espacias em MySQL. A replicao pode ser feita sobre conexo SSL.

Compatibilidade aos padres, portabilidade e migrao O novo protocolo cliente/servidor adiciona a possibilidade de se passar mltiplos avisos ao cliente, no lugar se um nico resultado. Isto faz com que o trabalho como uma grande carga de dados seja muito mais fcil de rastrear. SHOW WARNINGS exibe avisos para o ltimo comando. See Seco 4.6.8.9, SHOW WARNINGS | ERRORS.

Internacionalizao Para suportar nossa base de usurio sempre em expanso usando linguagens locais nas aplicaes, o programa MySQL agora oferece suporte Unicode extensivo por meio dos conjunto de caracteres utf8 e ucs2. Os conjuntos de caracteres agora podem ser definidos por colunas, tabelas e banco de dados. Isto permite um alto grau de flexibilidade no desenho das aplicaes, particularmente para sites-web multi-linguagens. Para documentao sobre este suporte a conjunto de caracters aprimorados, veja Captulo 9, Conjunto de Caracteres Nacionais e Unicode.

Aprimoramento da usabilidade

22

Informaes Gerais

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 que a informao sempre aplicvel para aquela verso do servidor em particular. Como esta informao est disponvel executando uma instruo SQL, outros clientes tambm podero ser escritos para acess-la. Por exemplo, o cliente mysql de linha de comando foi modificado para ter esta capacidade. No novo protocolo cliente/servidor, vrias instrues podem ser feitas com uma nica chamada. See Seco 12.1.8, Tratando a Execuo de Mltiplas Consultas na API C. O novo protocolo cliente/servidor tambm suporta retorno de vrios resultados. Isto pode ocorrer como resultado de enviar vrias instrues, por exemplo (Veja o item anterior). Uma nova sintaxe INSERT ... ON DUPLICATE KEY UPDATE ... tem sido implementada. Isto lhe permite executar um UPDATE em um registro existente se o um INSERT criasse uma chave (ndice) primria (PRIMARY) ou nica (UNIQUE) (index) duplicada. See Seco 6.4.3, Sintaxe INSERT. Projetamos uma nova funo de agrupamento GROUP_CONCAT(), adicionando a capacidade de concatenar colunas de registros agrupados em uma nica string de resultado, o que extremamente til. See Seco 6.3.7, Funes e Modificadores para Usar com Clusulas GROUP BY.

A seo de novidades neste manual incluem uma lista mais completa de recursos. See Seco D.2, Alteraes na distribuio 4.1.x (Alpha).

1.5.2.2. Stepwise Rollout


Novos recursos esto sendo adicionados ao MySQL 4.1. A verso Alfa j st disponvel para download. See Seco 1.5.2.3, Pronto para Uso em Desenvolvimento Imediato. O conjunto de recursos que esto sendo adicionados a verso 4.1 esto, na maioria, corrigidos. Desenvolvimento adicional j est em andamento na verso 5.0. O MySQL 4.1 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 erros so realizados0) e Gamma (indicando que ima distribuio de produo est quase pronta). No fim deste processo, o MySQL 4.1 se tornar o nova distribuio de produo).

1.5.2.3. Pronto para Uso em Desenvolvimento Imediato


O MySQL 4.1 est atualmente no estgio alfa e os binrios esto disponveis para download em http://www.mysql.com/downloads/mysql-4.1.html. Todas as distribuies binrias passaram por nossos extensivos teste sem nenhum erro na plataforma em que testamos. See Seco D.2, Alteraes na distribuio 4.1.x (Alpha). Para aqueles que desejam usar o fonte mais recente do desenvolvimento do MySQL 4.1, deixamos nosso repositrio do BitKeeper publicamente disponvel. See Seco 2.3.4, Instalando pela rvore de fontes do desenvolvimento.

1.5.3. MySQL 5.0, A Prxima Distribuio de Desenvolvimento


O novo desenvolvimento para o MySQL est focado na distribuio 5.0, comrecursos como Stored Procedures entre outros. See Seco 1.6.2, Novos Recursos Planejados Para a Verso 5.0. Para aqueles que desejam dar uma olhada no desenvolvimento do MySQL, deixamos o nosso repositrioo do BitKeeper para o MySQL verso 5.0 disponvel publicamente. See Seco 2.3.4, Instalando pela rvore de fontes do desenvolvimento.

23

Informaes Gerais

1.6. MySQL e o Futuro (o TODO)


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

1.6.1. Novos Recursos Planejados Para a Verso 4.1


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

1.6.2. Novos Recursos Planejados Para a Verso 5.0


Os seguintes recursos esto planejados para incluso no MySQL 5.0. Note que como possuimos diversos desenvolvedores que esto trabalhando em diferentes projetos, havero tambm muitos recursos adicionais. H tambm um pequena chance qie alguns destes recursos sejam adicionados ao MySQL 4.1. Para uma lista do que j est feito no MySQL 4.1, veja Seco 1.5.2.1, Recursos Disponveis no MySQL 4.1. Para aqueles que desejam dar uma olhada nas novidades do desenvolvimento do MySQL, deixamos nosso repositrio BitKeeper para o MySQL verso 5.0 publicamente disponvel. See Seco 2.3.4, Instalando pela rvore de fontes do desenvolvimento. Stored Procedures Stored procedures esto sendo implementadas atualmente. Este esforo baseado no SQL99, o que tem m sintaxe bsica similar (mas no idntica) a do Oracle PL/SQL. Ns tambm implementaremos o framework do SQL-99 para enganchar em linguagens externas e (onde possvel) compatibilidade com p.ex. PL/SQL e T-SQL.

Nova funcionalidade Suporte a cursores elementares. A habilidade de especificar explicitamente para tabelas MyISAM que um ndice deve ser criado como um ndice RTREE. Na verso 4.1, ndices RTREE so usados internamente para dados geomtricos (tipos de dados GIS), mas no podem ser criados no pedido. Registros de tamanhos dinmicas para tabelas HEAP.

Compatibilidade com o padro, portabilidade e migrao 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 mecanismos de armazenamento do MyISAM, mas ainda no est disponvel a nvel de usurio).

Aumento na velocidade 24

Informaes Gerais

SHOW COLUMNS FROM nome_tabela (usado pelo cliente mysql para permitir expanses de nomes de colunas) no deve abrir a tabela, apenas o arquivo de definio. ISto exigir menos memria e ser muito mais rpido. 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): Registro de tamanhos dinmoicos. Tratamento de registro mais rpido (menos cpia).

Internacionalizao 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 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 MERGE ativa, o que possivelmente corrompe a tabela.

1.6.3. Novos Recursos Planejados Para a Verso 5.1


Novas funcionalidades Suporte FOREIGN KEY para todos os tipos de tabelas. Restries a nvel de colunas. Replicao seguro a falhas. Backup online com baixa queda de desempenho. O backup online tornar mais fcil adicionar um novo slave de replicao sem desligar o master.

Aumento de velocidade Novo formato dos arquivos de definio e tabelas baseados em texto (arquivos .frm) e uma cache de tabelas para a definio de tabelas. Isto nos permitir fazer consultas mais rpidas da estruturas de tabela e dar um suporte a chaves estrangeiras mais eficiente. Otimizar o tipo BIT para gastar 1 bit (agora BIT gasta 1 byte; e tratado como um sinnimo para TINYINT.)

Aprimoramento da usabilidade Adicionar opes ao protocolo cliente/servidor para obter notas de progresso para longos comandos em execuo. Implementar RENAME DATABASE. Para tornar isto seguro para todos os mecanismos de armazenamento, ele deve funcionar como a seguir: Cria um novo banco de dados. 25

Informaes Gerais

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 manipuladores de arquivos mais gerais e tornar mais fcil adicionar extenses tipo RAID.

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


Novas funcionalidade Comando como do Oracle CONNECT BY PRIOR ... para estruturas de busca tipo rvore (hierrquica) 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 fim do arquivo se o arquivo tiver lock de leitura. Permitir a atualizao de variveis nas instrues UPDATE. Por exemplo: UPDATE TABLE foo SET @a=a+b,a=@a, b=@a+c. Alterar quando as variveis de usurios so atualizadas e assim pode se us-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 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 valor de chave primria, linhas existentes correspondendo s chaves primrias so atualizadas para o restante das colunas de entrada. No entanto, colunas faltosas na insero dos registros de entradas no so alteradas. Para tabelas com chaves primrias, se um registro de entrada no contm um valor de chave primria ou estr faltando alguma parte da chave, o registro tratado como um LOAD DATA INFILE ... REPLACE 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.

Novas funes para tyrabalhar com tipos de colunas SET: ADD_TO_SET(valor,conjunto)

26

Informaes Gerais

REMOVE_FROM_SET(valor,conjunto)

Se voc abortar o mysql no meio de uma consulta, voc deve abrir outra conexo e matar a consulta antiga em execuo. Alternativamente, deve ser feita um tentativa de deteco deste problema no servidor. Adicione um interface do mecanismo de armazenamento para informaes da tabela assim que voc puder us-la como uma tabela de sistema. Isto seria um pouco mais lento se voc pedisse informaes sobre todas as tabelas, mas muito flexvel. SHOW INFO FROM tbl_name para informaes bsicas 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. Opes DELETE e REPLACE para a instruo UPDATE (isto deletar registros quando se tiver um erro de chave duplicada durante a atualizao). Altera o formato de DATETIME para armazenar fraes de segundo. Possibilitar o uso da nova biblioteca regexp GNU em vez da atual (a biblioteca GNU deve ser muito mais rpida que a antiga).

Compatibilidade com os padres, portabilidade e migrao No adicionar valores DEFAULT automticos as colunas. Enviar um erro ao usar um INSERT que no contenha uma coluna que no tenha um DEFAULT. Adicionar as funes de agrupamento ANY(), EVERY() e SOME(). No padro SQL isto s funciona em colunas booleanas, mas podemos extend-las para funcionar em qualquer coluna/expresso tratando valores 0 como FALSE e valores diferentes de 0 como TRUE. Corrigir para que o tipo de MAX(coluna) seja o mesmo do tipo da coluna: mysql> mysql> mysql> mysql> CREATE TABLE t1 (a DATE); INSERT INTO t1 VALUES (NOW()); CREATE TABLE t2 SELECT MAX(a) FROM t1; SHOW COLUMNS FROM t2;

Aumento de velocidade No permitir mais que um nmero definido de threads faam a recuperao do MyISAM ao mesmo tempo. Alterar INSERT ... SELECT para usar inseres concorrentes opcionalmente. Adicionar uma opo para descarregar paginas de chaves para tabelas com delayed keys se elas no forem usados por um tempo. Permitir joins em partes de chaves (otimizao). Adicionar simulao de pread()/pwrite() no Windows para permitir inseres concorrentes. Um analizador de arquivos de log que possam analizar informaes sobre quais tabelas so usadas com mais frequncia, a frequncia com que joins multi-tables so executados, etc. Isto deve ajudar os usurios a identificar reas ou projetos de tabelas que podiam ser otimizados para executar consultas muito mais eficientes.

Internacionalizao Aprimoramentos de usabilidade 27

Informaes Gerais

Retorna os tipos dos campos originais ao se fazer SELECT MIN(coluna) ... GROUP BY. Possibilita especificar long_query_time com uma granularidade em microsegundos. Ligue o cdigo myisampack no servidor assim ele poder realizar operaes PACK e COMPRESS. Adicionar uma cache de chaves temporria durante INSERT/DELETE/UPDATE para podermos fazer um recuperao se o ndice ficar cheio. Se voc realizar um ALTER TABLE em uma tabela que ligada simbolicamente a outro disco, crie tabelas tenporrias neste disco. Implementar um tipo DATE/DATETIME que trate as informaes de fusos horrios de forma apropriada e assim lidar com datas em diferentes fusos horrios ser mais fcil. Corrigir o configure para se poder compilar todas as bibliotecas (como no MyISAM) sem threads. Permitir variveis SQL em LIMIT, como em LIMIT @a,@b. Sada automtica do mysql para um navegador web. LOCK DATABASES (com diversas opes). Muito mais variveis para SHOW STATUS. Leitura e atualizao de registros. Selects em 1 tabela e select com joins. Nmero de tabelas na select. Nmero de consultas ORDER BY e GROUP BY. mysqladmin copy database novo-banco_dados; exige que o comando COPY seja adicionado ao mysqld. Lista de processos deve mostar o nmero de consultas/threads. SHOW HOSTS para xibir informaes sobre a cache de nome de mquina. 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 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 INSERT DELAYED. Colunas refernciadas em uma clusula UPDATE iro conter os valores antigos antes da atualizao iniciar.

Novos sistemas operacioais. Portar os clientes MySQL para LynxOS.

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


Implementar funo: get_changed_tables(timeout,table1,table2,...) Alterar leitura atravs de tabelas para usar mapeamento de memria quando possvel. Atualmente somente tabelas compactadas usam mapeamento de memria. 28

Informaes Gerais

Tornar o cdigo de timestamp automtico melhor. Adicionar timestamps para o log de atualizaes com SET TIMESTAMP=#; Usar mutex de leitura/escrita em alguns lugares para obter maior velocidade. Views simples (inicialmente em uma tabela, depois em qualquer expresso). See Seco 1.8.4.6, Views. Fechar algumas tabelas automaticamente se uma tabela, tabela temporria ou arquivos temporrios obtiverem o erro 23 (no pode abrir arquivos suficientes). Melhor propagao de constantes. Quando uma ocorrncia de nome_col=n encontrada em uma expresso, para algumas constantes n, substitua outras ocorrncias de nome_col dentro da expresso por n. Atualmente, isto feito somente para alguns casos simples. Alterar todas expresses const com expresses calculadas se possvel. Chave otimizadora = expresso. No momento somente a chave = campo ou a chave = constante so otimizadas. Melhorar o cdigo de algumas das funes de cpia 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 argumentos em uma funo. Utilizar nomes de clculo completos na parte de ordenao. (For ACCESS97) MINUS, INTERSECT e FULL OUTER JOIN. (Atualmente UNION [na 4.0] e LEFT OUTER JOIN so suportados). 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. LIMIT negativo para recuperar dados do fim. Alarmes em funes clientes de conexo, leitura e escrita. Por favor, perceba as alteraes ao mysqld_safe: de acordo com o FSSTND (que o Debian tenta seguir) arquivos PID dever ir em /var/run/<progname>.pid e arquivos de log em / var/log. Seria timo se voc puder colocar o diretrio de dados na primeira declarao de "pidfile" e "log", para que a colocao destes arquivos possa ser alterada com uma simples instruo. Permitir um cliente requisitar log. Adicionar uso de zlib() a LOAD DATA INFILE, para permitir que as instrues leiam arquivos compactados com gzip. Corrigir ordenao e agrupamento de colunas BLOB (parcialmente resolvida agora). Alterar para o uso de semforos quando contar threads. Devemos primeiro implementar uma biblioteca de semforos para a MIT-pthreads. Adicionar suporte pleno para JOIN com parnteses. Como uma alternativa para uma thread / conexo gerencie uma fila de threads para manipular as pesquisas. Permitir obter mais de um bloqueio com GET_LOCK. Quando isto for feito, sero, tambm, tratados os possveis deadlocks que essa alterao ir acarretar. 29

Informaes Gerais

O tempo fornecido de acordo com a quantidade de trabalho, e no tempo real.

1.6.6. Novos Recursos que No Planejamos Fazer


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

1.7. Fontes de Informaes do MySQL


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

1.7.1.1. As Listas de Discusso do MySQL


Para se inscrever ou cancelar a inscrio de qualquer uma das listas de email descritas nesta seo, visite http://lists.mysql.com/. Por favor, no envie mensagem sobre inscrio ou cancelamento para qualquer das listas de emasil, porque tais mensagens so distribudas automaticamente para milhares de outros usurios. Seu site local pode ter muitas inscries para uma lista de email do MySQL. Se sim, o site 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 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 de correio separada no seu programa de emails, configure um filtro com base nos cabealhos das mensagens. Voc pode tambm usar os cabealhos List-ID: ou Entregar-Para: para identificar suas mensagens. Existe tambm as seguintes listas de discusso sobre MySQL atualmente: announce Esta para anuncio de novas verses do MySQL e programas relacionados. Esta uma lista com baixo volume na qual todos usuarios do MySQL deveriam se inscrever. mysql A principal lista para discusses MySQL em geral. Note que alguns tpicos so mais bem discutidos em listas mais especializadas. Se voc enviar para a lista errada voc pode no obter resposta. mysql-digest A lista mysql na forma resumida. Isto significa que voc ir receber todas mensagens individuais, enviadas na forma de uma grande mensagem uma nica vez ao dia. bugs Esta lista s ser do seu interesse se voc quiser ficar informado sobre assuntos relatados desde a ltima distribuio do MySQL ou se voc quiser estar ativamente envolvido no processo de busca e correo de erros. See Seco 1.7.1.3, Como relatar erros ou problemas. bugs-digest

30

Informaes Gerais

Uma verso resumida da lista bugs. internals Uma lista para pessoas que trabalham no cdigo do MySQL. Nesta lista pode-se discutir desenvolvimento do MySQL e pos-patches. internals Uma verso resumida da lista internals. mysqldoc Esta lista para pessoas que trabalham na documentao do MySQL: pessoas da MySQL AB, tradutores e outros membros da comunidade. mysqldoc-digest Esta uma verso resumida da lista mysqldoc. benchmarks Esta lista para qualquer um interessado em assuntos de desempenho. Discusses concentradas em desempenho de banco de dados (no limitado ao MySQL) mas tambm inclue categorias ,com desempenho do kernel, sistema de arquivos, sistema de disco e outros. benchmarks Esta uma verso resumida da lista benchmarks. packagers Esta lista para discusses sobre empacotamento e distribuio do MySQL. Este o frum usado pela pessoas que mantm a distribuio para troca de idias de pacotes do MySQL e para assegurar que o MySQL esteja o mais parecido possvel em todas as plataformas e sistemas operacionais suportados. packagers-digest Esta uma verso resumida da lista packagers. java Discusso sobre o servidor MySQL e Java. mais usada para discusses sobre o driver JDBC, incluindo MySQL Connector/J. java-digest Uma verso resumida da lista java. win32 Esta a lista para todos os tpicos relacionados ao MySQL em sistemas operacionais Microsoft, como o Win95, Win98, NT e Win2000. win32-digest Uma verso resumida da lista win32. myodbc Lista para todos os tpicos relacionados a conectividade do MySQL com ODBC.

31

Informaes Gerais

myodbc-digest Uma verso resumida da lista myodbc.

mysqlcc Esta lista sobre todos os tpicos relativos ao cliente grfico MySQL Control Center.

mysqlcc-digest Esta lista uma verso resumida da lista mysqlcc.

plusplus Lista sobre todos os tpicos relacionados programao da API C++ para o MySQL.

plusplus-digest Uma verso resumida da lista plusplus.

msql-mysql-modules Lista sobre o Suporte MySQL no Perl com o msql-mysql-modules que chamado DBDmysql.

msql-mysql-modules-digest Lista resumida sobre a verso do msql-mysql-modules.

Se voc no obtiver uma resposta para suas questes na lista de mensagens do MySQL, uma opo pagar pelo suporte da MySQL AB, que ir colocar voc em contato direto com desenvolvedores MySQL. See Seco 1.4.1, Suporte Oferecido pela MySQL AB. 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 podemos garantir a qualidade destas. <mysql-france-subscribe@yahoogroups.com> Lista de mensagens na lngua 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. Envie subscribe mysql-de your@email.address para esta lista. Voc pode encontrar informaes sobre esta lista de mensagens em 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. <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: 32

Informaes Gerais

Comece pesquisando o manual MySQL online em: http://www.mysql.com/doc/ Ns tentaremos manter o manual atualizado, frequentemente atualizando-o com solues para novos problemas encontrados! O apndice de histrico de mudanas (http://www.mysql.com/doc/en/News.html) pode ser til j que bem possvel que uma verso mais nova ja tenha a soluo para o seu problema. Procure no banco de dados de bugs em http://bugs.mysql.com/ para ver se o erro j foi relatado/ resolvido. 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 pesquisar todas as pginas Web (incluindo o manual) que esto localizados em http://www.mysql.com/.

Se voc no puder encontrar uma resposta no manual ou nos arquivos, confira com seu expert em MySQL local. Se voc continua no encontrando uma resposta para sua questo, v em frente e leia a prxima seo para saber como enviar email para lista de email do 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 http://bugs.mysql.com/. Se voc logar no sistema, voc poder entrar novos relatrios. Escrever um bom relatrio de erro exige pacincia, e faz-lo de forma apropriada economiza tempo para ns e para voc. Um bom relatrio de erros contendo um teste de caso para o bug ir torn-lo muito mais fcil para corrig-lo no prximo release. Esta seo ir ajud-lo a escrever seu relatrio corretamente para que voc no perca seu tempo fazendo coisas que no iro ajudar-nos muito ou nada. Ns encorajamos todo mundo a usar o script mysqlbug para gerar um relato de erros (ou um relato sobre qualquer problema), se possvel. mysqlbug pode ser encontrado no diretrio scripts na distribuio fonte, ou, para uma distribuio binria, no diretrio bin no diretrio de instalao do MySQL. Se voc no puder utilizar o mysqlbug (por exemplo, se voc o estiver executando no Windows), ainda de vital importncia que voc incluia todas as informaes necessrias listadas nesta seo (o mais importante uma descrio do sistema operacional e a verso do MySQL). O script mysqlbug lhe ajudar a gerar um relatrio determinando muitas das seguintes informaes automaticamente, mas se alguma coisa importante estiver faltando, por favor fornea-o junto de sua mensagem! Por favor leita esta seo com cuidado e tenha certeza que todas as informaes descritas aquie esto includas no seu relatrio. De preferncia, voc deve testar o problema usando a ltima verso de produo ou desenvolvimento 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 includo no relatrio de erros. 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 mudanas de cdigo forem necessrias enviaremos um patch para corrigir o problema. O lugar comum para relatar erros e problemas http://bugs.mysql.com. Se voc encontrar um erro <security@mysql.com>. de segurana no MySQL, envie um email para

Se voc tiver um relatrio de erro que possa ser repetido, relate-o no banco de dados de bugs em http://bugs.mysql.com. Note que mesmo neste caso bom executar o script mysqlbug primeiro para ter informaes sobre o sistema. Qualquer erro que pudermos repetir tem uma grande chance de ser corrigido na prxima distribuio do MySQL. Para relatar outros problemas, voc pode usar a lista de email do MySQL.

33

Informaes Gerais

Lembre-se que possvel responder a uma mensagem contendo muita informao, mas no 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 principio : Se voc est em dvida sobre declarar alguma coisa, declare-a ! milhares de vezes mais rpido e menos problemtico escrever um pouco de linhas a mais no seu relatrio do que ser forado a perguntar de novo e esperar pela resposta porque voc no forneceu informao sufiente da primeira vez. Os erros mais comuns acontecem porque as pessoas no indicam o nmero da verso da distribuio do MySQL que esto usando, ou no indicam em qual plataforma elas tem o MySQL instalado (Incluindo o nmero da verso da plataforma). Essa informao muito relevante, e em 99% dos casos o relato de erro intil sem ela! Frequentemente ns recebemos questes como, ``Por que isto no funciona para mim?'' ento ns vemos que aquele recurso requisitado no estava implementado naquela verso do MySQL, ou que o erro descrito num relatrio foi resolvido em uma verso do MySQL mais nova. Algumas vezes o erro dependente da plataforma; nesses casos, quase impossvel corrigir alguma coisa sem conhecimento do sistema operacional e o nmero da verso da plataforma. Lembre-se tambm de fornecer informaes sobre seu compilador, se isto for relacionado ao problema. Frequentemente pessoas encontram erros em compiladores e acreditam que o problema relacionado ao MySQL. A maioria dos compiladores esto sobre desenvolvimento todo o tempo e tornam-se melhores a cada verso. Para determinar se o seu problema depende ou no do compilador, ns precisamos saber qual compilador foi usado. Note que todo problema de compilao deve ser estimado como relato de erros e, consequentemente publicado. de grande ajuda quando uma boa descrio do problema includa no relato do erro. Isto , um bom exemplo de todas as coisas que o levou ao problema e a correta descrio do problema. Os melhores relatrios so aqueles que incluem um exemplo completo mostrando como reproduzir o erro ou o problema See Seco E.1.6, Fazendo um Caso de Teste Se Ocorre um Corrompimento de Tabela. Se um programa produz uma mensagem de erro, muito importante incluir essas mensagens no seu relatrio! Se ns tentarmos procurar por algo dos arquivos usando programas, 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 mensagem de erro; e sim, copiar e colar a mensagem inteira no seu relatrio! Se voc tem um problema com o MyODBC, voc deve tentar gerar um arquivo para rastremento de erros (trace) do MyODBC. See Seco 12.2.7, Relatando Problemas com MyODBC. Por favor lembre-se que muitas das pessoas que lero seu relatrio podem usar um vdeo de 80 colunas. Quando estiver gerando relatrios ou exemplos usando a ferramenta de linha de comando mysql, ento dever usar a opo --vertical (ou a instruo terminadora \G) para sada que ir exceder a largura disponvel para este tipo de vdeo (por exemplo, com a instruo EXPLAIN SELECT; veja exemplo abaixo). Por favor inclua a seguinte informao no seu relatrio: O nmero da verso da distribuio do MySQL que est em uso (por exemplo, MySQL Version 3.22.22). Voc poder saber qual verso vocs est executando, usando o comando mysqladmin version. mysqladmin pode ser encontrado no diretrio bin sob sua instalao do MySQL. O fabricante e o modelo da mquina na qual voc est trabalhando. O nome do sistema operacional e a verso. Para a maioria dos sistemas operacionais, voc pode obter esta informao executando o comando Unix uname -a. Se voc trabalho no Windows, voc pode normalmente conseguir o nome e o nmero da verso com um duplo clique sobre o cone ''Meu Computador'' e em seguida no menu ''Ajuda/Sobre o Windows''. Algumas vezes a quantidade de memria (real e virtual) relevante. Se estiver em dvida, inclua esses valores.

34

Informaes Gerais

Se voc estiver usando uma distribuio fonte do MySQL, necessrio o nome e nmero da verso do compilador usado. Se voc estiver usando uma distribuio binria, necessrio o nome da distribuio. Se o problema ocorre durante a compilao, inclua a(s) exata(s) mensagem(s) de erro(s) e tambm algumas linhas do contexto envolvendo o cdigo no arquivo onde o erro ocorreu. Se o mysqld finalizou, voc dever relatar tambm a consulta que travou o mysqld. Normalmente voc pode encontrar isto executando mysqld com o log habilitado. See Seco E.1.5, Usando Arquivos de Log para Encontrar a Causa dos Erros no mysqld. Se alguma tabela do banco de dados estiver relacionado ao problema, inclua a sada de mysqldump --nodata nome_db nome_tbl1 nome_tbl2.... Isto muito fcil de fazer e um modo poderoso de obter informaes sobre qualquer tabela em um banco de dados que ir ajudar-nos a criar uma situao parecida da que voc tem. Para problemas relacionados velocidade ou problemas com instrues SELECT, voc sempre deve incluir a sada de EXPLAIN SELECT ... e ao menos o nmero de linhas que a instruo SELECT produz. Voc tambm deve incluir a sada de SHOW CREATE TABLE nome_tabela para cada tabela envolvida. Quanto mais informao voc fornecer sobre a sua situao, mais fcil ser para algum ajudar-lo! A seguir um exemplo de um relatrio de erros muito bom (ele deve ser postado com o script mysqlbug): Exemplo de execuo usando a ferramenta de linha de comando mysql (perceba o uso do instruo terminadora \G para instrues cuja largura de sada deva ultrapassar 80 colunas): mysql> SHOW VARIABLES; mysql> SHOW COLUMNS FROM ...\G <saida para SHOW COLUMNS> mysql> EXPLAIN SELECT ...\G <saida para EXPLAIN> mysql> FLUSH STATUS; mysql> SELECT ...; <Uma pequena verso da sada do SELECT, incluindo a hora em que a consulta foi executada> mysql> SHOW STATUS; <saida do SHOW STATUS>

Se um erro ou problema ocorrer quando estiver executando o mysqld, tente fornecer um script de entrada que ir reproduzir a anomalia. Este script deve incluir qualquer arquivo de fonte necessrio. Quanto mais prximo o script puder reproduzir sua situao, melhor. Se voc puder fazer uma srie de testes repetidos, voc poder post-lo para o <bugs@lists.mysql.com> para um tratamento de alta prioridade! Se no puder fornecer o script, voc ao menos deve incluir a sada de mysqladmin variables extended-status processlist na sua mensagem para fornecer alguma informao da performance do seus sistema.

Se voc no puder produzir um caso de teste em algumas linhas, ou se a tabela de testes for muito grande para ser enviada por email para a lista de mensagens (mais de 10 linhas), voc dever dar um dump de suas tabelas usando o mysqldump e criar um arquivo README que descreve seu problema. Crie um arquivo comprimido de seus arquivos usando tar e gzip ou zip, e use o ftp para transferir o arquivo para ftp://support.mysql.com/pub/mysql/secret/. E envie uma pequena descrio do problema para <bugs@lists.mysql.com>.

Se voc achar que o MySQL produziu um resultado estranho para uma consulta, no inclua somente o resultado, mas tambm sua opinio de como o resultado deve ser, e uma conta descrevendo o base de sua opinio. Quando fornecer um exemplo do problema, melhor usar os nomes de variveis, nomes de tabelas, etc. utilizados na sua situao atual do que enviar com novos nomes. O problema pode ser 35

Informaes Gerais

relacionado ao nome da varivel ou tabela! Esses casos so raros, mas melhor prevenir do que remediar. Alm disso, ser mais fcil para voc fornecer um exemplo que use sua situao atual, que o que mais importa para ns. No caso de ter dados que no deseja mostrar para outros, voc pode usar o ftp para transferi-lo para ftp://support.mysql.com/pub/mysql/secret/. Se os dados so realmente confidenciais, e voc no deseja mostr-los nem mesmo para ns, ento v em frente e providencie um exemplo usando outros nome, mas, por favor considere isso como uma nica chance. Inclua, se possvel, todas as opes fornecidas aos programas relevantes. Por exemplo, indique as opes que voc utiliza quando inicializa o daemon mysqld e aquelas que so utilizadas para executar qualquer programa cliente MySQL. As opes para programas como o mysqld e mysql, e para o script configure, so frequentemente chaves para respostas e so muito relevantes! Nunca uma m idia inclu-las de qualquer forma! Se voc usa algum mdulo, como Perl ou PHP por favor fornea o nmero da verso deles tambm. Se sua questo relacionada ao sistema de privilgios, por favor fornea a sada de mysqlaccess, a sada de mysqladmin reload, e todas as mensagens de erro que voc obteve quando tentava conectar! Quando voc testar seus privilgios, voc deve 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. Se voc tiver um patch para um erro, isso bom, mas no assuma que o patch tudo que precisamos, ou que iremos us-lo, se voc no fornecer algumas informaes necessrias, como os casos de testes mostrando o erro que seu patch corrige. Ns podemos encontrar problemas com seu patch ou ns podemos no entend-lo ao todo; se for assim, no podemos us-lo. Se ns no verificarmos exatamente o que o patch quer dizer, ns no poderemos us-lo. Casos de testes iro ajudar-nos aqui. Mostre que o patch ir cuidar de todas as situaes que possam ocorrer. Se ns encontrarmos um caso (mesmo que raro) onde o patch no funcionaria, ele pode ser intil. Palpites sobre qual o erro, porque ocorre, ou do que ele depende, geralmente esto errados. Mesmo o time MySQL no pode adivinhar antecipadamente tais coisas sem usar um debugger para determinar a causa real do erro. Indique na sua mensagem de e-mail que voc conferiu o manual de referncia e o arquivo de mensagens para que outros saibam que voc tentou solucionar o problema. Se voc obter um parse error, por favor confira sua sintaxe com ateno! Se voc no conseguiu encontrar nada errado com ela, extremamente provvel que que sua verso corrente do MySQL no suporte a consulta que voc est utilizando. Se voc estiver usando a verso recente e o manual em http://www.mysql.com/documentation/manual.php no cobrir a sintaxe que voc estiver usando, o MySQL no suporta sua consulta. Neste caso, suas unicas opes so implementar voc mesmo a sintaxe ou enviar uma mensagem para <mysql-licensing@mysql.com> e perguntar por uma oferta para implement-lo! Se o manual cobrir a sintaxe que voc estiver usando, mas voc tiver uma verso mais antiga do MySQL, voc dever conferir o histrico de alteraes do MySQL para ver quando a sintaxe foi implementada. Neste caso, voc tem a opo de atualizar para uma nova verso do MySQL. See Apndice D, Histrico de Alteraes do MySQL. Se voc tiver um problema do tipo que seus dados aparecem corrompidos ou voc obtem erros quando voc acessa alguma tabela em particular, voc dever primeiro checar depois tentar reparar suas tabelas com myisamchk ou CHECK TABLE e REPAIR TABLE. See Captulo 4, Administrao do Bancos de Dados MySQL. Se voc frequentemente obtm tabelas corrompidas, voc deve tentar encontrar quando e porque isto acontece! Neste caso, o arquivo mysql-data-directory/'hostname'.err deve conter algumas informaes sobre o que aconteceu. See Seco 4.10.1, O Log de Erros. Por favor fornea qualquer informao relevante deste arquivo no seu relatrio de erro! Normalmente o mysqld NUNCA dever danificar uma tabela se nada o finalizou no meio de uma atualizao! Se voc puder encontrar a causa do fim do mysqld, se torna muito mais fcil para ns for36

Informaes Gerais

necemos a voc uma soluo para o problema! See Seco A.1, Como Determinar o Que Est Causando Problemas. Se possvel, faa o download e instale a verso mais recente do MySQL para saber se ela resolve ou no o seu problema. Todas verses do MySQL so muito bem testadas e devem funcionar sem problemas! Acreditamos em deixar tudo, o mais comptivel possvel com as verses anteriores, e voc conseguir mudar de verses MySQL em minutos! See Seco 2.2.4, Qual verso do MySQL deve ser usada.

Se voc um cliente de nosso suporte, por favor envio o seu relatrio de erros em <mysql-support@mysql.com> para tratamento de alta prioritrio, bem como para a lista de mensagens apropriada para ver se mais algum teve experincias com (e talvez resolveu) o problema. Para informaes sobre relatar erros no MyODBC, veja Seco 12.2.4, Como Relatar Problemas com o MyODBC. Para solues a alguns problemas comuns, veja See Apndice A, Problemas e Erros Comuns. Quando respostas so enviadas para voc individualmente e no para a lista de mensagens, considerado boa etiqueta resumir as respostas e enviar o resumo para a lista de mensagens para que outras possam ter o benefcio das respostas que voc recebeu que ajudaram a resolver seu problema!

1.7.1.4. Guia para responder questes na lista de discusso


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

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


Em adio as diversas listas de email, voc pode pessoas experientes da comunidade no IRC (Internet Relay Chat). Estes so os melhores canais atualmente conhecidos por ns: freenode (veja http://www.freenode.net/ para servidores) #mysql A princpio so questes sobre o MySQL, mas dvidas sobre outros bancos de dados e SQL so bemvindas. #mysqlphp Questes sobre MySQL+PHP, uma combinao popular. #mysqlperl Questes sobre MySQL+Perl, outra combinao popular.

EFnet (veja http://www.efnet.org/ para servidores) #mysql Questes sobre MySQL.

Se voc est procurando por programas clientes de IRC para conectar a uma rede IRC, d uma olhada no X-Chat (http://www.xchat.org/). X-Chat (licena GPL) est disponvel para as plataformas Unix e Windows. 37

Informaes Gerais

1.8. Qual compatibilidade aos padres o MySQL oferece ?


Esta seo descreve como o MySQL se relaciona aos padres ANSI/ISO SQL. O Servidor MySQL tem muitas extenses aos padres SQL, e aqui voc descobrir quais so elas, e como us-las. Voc ir tambm encontrar informao sobre falta de funcionalidade do Servidor MySQL, e como trabalhar com algumas diferenas. Nosso objetivo no restringir, sem um boa razo, a usabilidade do MySQL Server para qualquer uso. Mesmo se no tivermos os recursos para fazer o desenvolvimento para todos os usos possveis, estamos sempre querendo ajudar e oferecer sugestes para pessoas que esto tentando usar o MySQL Server em novos territrios. Um dos nossos principais objetivos com o produto continuar a trabalhar em acordo com o padro SQL-99, mas sem sacrificar velocidade e confiana. No estamos receosos em adicionar extenses ao SQL ou suporte para recursos no SQL se ele aumentar extremamente a usabilidade do MySQL Server para uma grande parte de nossos usurios. (A nova interface HANDLER no MySQL Server 4.0 um exeemplo desta estratgia. See Seco 6.4.9, Sintaxe HANDLER.) Continuaremos a suportar bancos de dados transacionais e no transacionais para satisfazer tanto o uso pesado na web quanto o uso de misso crtica 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 computacionais pequenos. Continuaremos a extender o MySQL Server para funcionar ainda melhor com banco de dados na ordem de terabytes, assim como tornar possvel compilar uma verso reduzida do MySQL mais apropriadas para handhels e uso embutido. O design compacto do servidor MySQL tornam ambas as direes possveis sem qualquer conflito na rvore fonte. Atualmente no estamos buscando suporte em tempo real (mesmo se voc j puder fazer muitas coisas com nossos servios de replicao). Suporte a banco de dados em cluster est planejado para 2004 pela implementao de um 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?


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 comportamento alterado no MySQL: || um oprador de concatenao de strings em vez de um sinnimo para OR. " tratado como um caracter identificados (com o caracter de aspasr ` do MySQL Server)e no um caracter de string. Voc ainda pode usar ` para citar identificadores no modo ANSI. Uma implicao disto que voc no pode usar aspas duplas para citar um string literal, porque ela ser intepretada como um identificador. Voc pode ter qualquer nmero de espaos entre um nome de funo e o (. Isto faz com que todos nomes de funes sejam tratadas como palavras reservadas. Como resultado, se voc quiser acessar qualquer banco de dados, tabelas ou coluna que uma palavra reservada, voc deve coloc-lo entre aspas. Por exemplo, por haver a funo USER(), o nome da tabela user no 38

Informaes Gerais

banco de dados mysql e a coluna User nesta tabela se torna reservada, assim voc deve coloc-la entre aspas: SELECT "User" FROM mysql."user"; REAL um sinnimo para FLOAT no lugar de um sinnimo de DOUBLE. O nvel de isolamento padro de um transao SERIALIZABLE. See Seco 6.7.6, Sintaxe SET TRANSACTION. Voc pode usar um campo/expresso em GROUP BY que no est na lista de campos.

Executando o servidor em modo ANSI o mesmo que inici-lo com estas opes:

--sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE,ONLY_FULL_GRO No MySQL 4.1, voc pode conseguir o mesmo efeito com estas duas instrues: 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 ltima opo sql_mode tambm pode ser dada com: SET GLOBAL sql_mode="ansi"; No caso acima o sql_mode estar configurado com todas as opes que so relevantes para o modo ANSI. Voc pode verificar o resultado fazendo:

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

1.8.3. Extenses do MySQL para o Padro SQL-92


O MySQL fornece algumas extenses que voc provavelmente no ir encontrar em alguns bancos de dados SQL. Fique avisado que se voc us-las, seu cdigo pode no ser mais portvel para outros servidores SQL. Em alguns casos, voc pode escrever cdigo que inclui extenses MySQL, mas continua portvel, usando comentrios da forma /*! ...*/. Neste caso, o MySQL ir analisar e executar o cdigo com o comentrio como ir fazer com qualquer outra instruo MySQL, mas outros servidores SQL iro ignorar as extenses. 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 verso do MySQL igual ou maior que o nmero de verso usado: CREATE /*!32302 TEMPORARY */ TABLE t (a INT); O exemplo acima significa que se voc tiver uma verso do MySQL 3.23.02 ou mais nova, ento o MySQL ir usar a palavra-chave TEMPORARY Extenses MySQL so listadas abaixo: Os tipos de campo MEDIUMINT, SET, ENUM e os diferentes tipos BLOB e TEXT.

39

Informaes Gerais

Os atributos de campos AUTO_INCREMENT, BINARY, NULL, UNSIGNED e ZEROFILL. Todas comparaes de strings por padro so caso insensitivo, com classificao ordenada determinada pelo conjunto de caracteres corrente (ISO-8859-1 Latin1 por padro). Se voc no gosta disso voc dever declarar suas colunas com o atributo BINARY ou usar o operador BINARY, que fazendo com que as comparaes sejam feitas de acordo com a ordem ASCII usada na mquina servidora do MySQL. O MySQL mapeia cada banco de dados em um diretrio sob o diretrio de dados do MySQL, e tabelas internamente num banco de dados para arquivos no diretrio do banco de dados. Isto tem algumas implicaes: Nomes de bancos de dados e tabelas so caso sensitivoo no MySQL em sistemas operacionais que possuem o sistema de arquivos caso sensitivoo (como na maioria dos sistemas Unix). See Seco 6.1.3, Caso Sensitivo nos Nomes. Nomes de Bancos de dados, tabelas, ndices, campos ou apelidos pode comear com um dgito (porm no podem consistir somente de digitos). Voc pode usar comandos padro do sistemas para fazer backups, renomear, apagar e copiar tabelas. Por exemplo, para renomear uma tabela, renomeie os arquivos .MYD, .MYI e .frm. para o nome da tabela correspondente.

Em algumas 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 em: create table ralph.my_table...IN minha_tablespace. LIKE permitido em campos numricos. O uso de INTO OUTFILE e STRAIGHT_JOIN em uma instruo SELECT. See Seco 6.4.1, Sintaxe SELECT. A opo SQL_SMALL_RESULT em uma instruo SELECT. EXPLAIN SELECT para obter uma descrio de como as tabelas so ligadas. A utilizao de nomes de ndices, ndices em um prefixo de um campo, e uso de INDEX ou KEY em uma instruo CREATE TABLE. See Seco 6.5.3, Sintaxe CREATE TABLE. O uso de TEMPORARY ou IF NOT EXISTS com CREATE TABLE. O uso de COUNT(DISTINCT lista) onde 'lista' maior que um elemento. O uso de CHANGE nome_campo, DROP nome_campo, ou DROP INDEX, IGNORE ou RENAME em uma instruo ALTER TABLE. See Seco 6.5.4, Sintaxe ALTER TABLE. O uso de RENAME TABLE. See Seco 6.5.5, Sintaxe RENAME TABLE. Utilizao de mltiplas clusulas ADD, ALTER, DROP, ou CHANGE em uma instruo ALTER TABLE. O uso de DROP TABLE com as palavras-chave IF EXISTS. Voc pode remover mltiplas tabelas com uma instruo nica DROP TABLE. As clusulas ORDER BY e LIMIT das instrues UPDATE e DELETE. Sintaxe INSERT INTO ... SET col_name = .... A clusula DELAYED das instrues INSERT e REPLACE. A clusula LOW_PRIORITY das instrues INSERT, REPLACE, DELETE e UPDATE. 40

Informaes Gerais

O uso de LOAD DATA INFILE. Em alguns casos essa sintaxe compatvel com o Oracle LOAD DATA INFILE. See Seco 6.4.8, Sintaxe LOAD DATA INFILE. As intrues ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE, e REPAIR TABLE. A instruo SHOW. See Seco 4.6.8, Sintaxe de SHOW. Strings podem ser fechadas pelo " ou ', no apenas pelo '. O uso do meta-caractere de escape \. A instruo SET OPTION. See Seco 5.5.6, Sintaxe de SET. Voc no precisa nomear todos os campos selecionados na parte GROUP BY. Isto fornece melhor performance para algumas consultas especficas, mas muito comuns. See Seco 6.3.7, Funes e Modificadores para Usar com Clusulas GROUP BY. Pode ser especificado ASC e DESC com o GROUP BY. Para tornar mais fcil para usurios que venham de outros ambientes SQL, o MySQL suporta apelidos (aliases) para vrias funes. Por exemplo, todas funes de string suportam as sintaxes ANSI SQL e ODBC. O MySQL entende os operadores || e && como ou(OR) e e(AND) logicos, como na linguagem de programao C. No MySQL, || e OR so sinnimos, assim como && e AND. Devido a esta tima sintaxe, o MySQL no suporta o operador ANSI SQL para concatenao de strings ||; em vez disso, use o CONCAT(). Como CONCAT() aceita vrios argumentos, fcil converter o uso do operador || para MySQL. CREATE DATABASE or DROP DATABASE. DATABASE. See Seco 6.5.1, Sintaxe CREATE

O operador % um sinnimo para MOD(). Isto , N % M equivalente a MOD(N,M). % 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: mysql> SELECT col1=1 AND col2=2 FROM nome_tabela;

A funo LAST_INSERT_ID(). See Seco 12.1.3.32, mysql_insert_id(). Os operadores extendidos REGEXP e NOT REGEXP utilizados em expresses regulares. CONCAT() ou CHAR() com um ou mais de dois argumentos. (No MySQL, estas funes receber qualquer nmero de argumentos.) As funes BIT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(), ENCRYPT(), MD5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS() ou WEEKDAY(). Uso de TRIM() para cortar substrings. o SQL-99 s suporta remoo de caracteres nicos. As funes do GROUP BY: STD(), BIT_OR(), BIT_AND() e BIT_XOR() e GROUP_CONCAT(). See Seco 6.3.7, Funes e Modificadores para Usar com Clusulas GROUP BY. Uso de REPLACE no lugar de DELETE + INSERT. See Seco 6.4.7, Sintaxe REPLACE. As instrues FLUSH, RESET e DO. A possibilidade de configurar variveis em uma instruo com :=:

41

Informaes Gerais

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


Ns tentamos fazer com que o MySQL siguisse os padres ANSI SQL (SQL-92/SQL-99) e o ODBC SQL, mas em alguns casos, o MySQL realiza operaes de forma diferente: Para campos VARCHAR, expaos extras so removidos quando o valor armazenado. See Seco 1.8.6, Erros Conhecidos e Deficincias de Projetos no MySQL. Em alguns casos, campos CHAR so alterados sem perguntas para o tipo de campo VARCHAR. See Seco 6.5.3.1, Alterao de Especificaes de Colunas. Privilgios para uma tabela no so negadas automaticamente quando voc apaga uma tabela. Voc deve usar explicitamente um REVOKE para negar privilgios para uma tabela. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE.

Para uma lista priorizada indicando quando novas extenses sero adicionadas ao MySQL voc deve consultar lista TODO online do MySQL em http://www.mysql.com/doc/en/TODO.html. Esta a ltima verso da lista TODO neste manual. See Seco 1.6, MySQL e o Futuro (o TODO).

1.8.4.1. Subqueries
MySQL Version 4.1 supports subqueries and derived tables (unnamed views). See Seco 6.4.2, Sintaxe de Subquery. For MySQL versions prior to 4.1, most subqueries can be successfully rewritten using joins and and other methods. See Seco 6.4.2.11, Rewriting Subqueries for Earlier MySQL Versions.

1.8.4.2. SELECT INTO TABLE


O MySQL ainda no suporta a extenso SQL do Sybase: SELECT ... INTO TABLE .... MySQL suporta a sintaxe ANSI SQL INSERT INTO ... SELECT ..., que basicamente a mesma coisa. See Seco 6.4.3.1, Sintaxe INSERT ... SELECT. 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 ... SELECT para resolver seu problema.

1.8.4.3. Transaes e Operaes Atmicas


O MySQL Server (verso 3.23-max e todas as verses 4.0 e acima) suportam transaes com os mecanismos de armazenamento transacionais InnoDB e BDB. InnoDB fornece compatibilidade total com ACID. See Captulo 7, Tipos de Tabela do MySQL. Os outros tipos de tabelas no transacionais (tais como MyISAM) no MySQL Server seguem um paradigma diferente para integridade de dados chamado ``Operes Atmicas.'' Em termos de transao, tabelas MyISAM efetivamente sempre operam em modo AUTOCOMMIT=1. Operaes atmicas geralmente oferecem integridade comparvel com a mais alta performance. Com o MySQL Server suportando ambos os paradigmas, o usurio pode decidir se precisa da velo42

Informaes Gerais

cidade das operaes atmicas ou se precisa usar recursos transacionais em seu aplicativo. Esta escolha pode ser feita em uma base por tabela. Como notado, a comparao para tabelas transacionais vs. no transacionais As noted, the trade off for transactional vs. non-transactional table se encontra em grande parte no desempenho. Tabelas transacionais tem uma exigncia de memria e espao em disco significantemente maior e maior sobrecarga da CPU. Tipos de tabelas transacionais como InnoDB oferecem muitos recursos nicos. 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. 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 de tabelas transacionais? 1. No paradigma transacional, se as suas aplicaes so escritas de uma forma que dependente na chamada de ROLLBACK em vez de COMMIT em situaes crticas, ento transaes so mais convenientes. Alm disso, transaes asseguram que atualizaes inacabadas ou atividades corrompidas no sejam executadas no banco de dados; o servidor oferece uma oportunidade para fazer um rollback automtico e seu banco de dados mantido. O MySQL Server, na maioria dos casos, permite a voc resolver potenciais problemas incluindo simples conferncias antes das atualizaes e executando scripts simples que conferem inconsistncias no banco de dados e, automaticamente, repara ou avisa caso isto ocorra. Perceba que apenas usando o log do MySQL ou mesmo adicionando um log extra, pode-se corrigir tabelas perfeitamente sem nenhuma perda de integridade. 2. Mais do que nunco, atualizaes transacionais fatais podem ser reescritas para serem atmicas. De fato podemos dizer que todos problemas de integridade que transaes resolvem podem ser feitas com LOCK TABLES ou atualizaes atmicas, assegurando que voc nunca ir ter uma finalizao automtica da tabela, o que um problema comum em bancos de dados transacionais. Nem mesmo transaes podem prevenir todas as falhas se o servidor cair. Nestes casos mesmo um sistema transacional pode perder dados. A diferena entre sistemas diferentes apenas em quo pequeno o lapso de tempo em que eles podem perder dados. Nenhum sistema 100% seguro, somente ``seguro o suficiente.'' Mesmo o Oracle, com reputao de ser o mais seguro bancos de dados transacionais, tem relatos de algumas vezes perder dados nestas situaes. Para estar seguro com o MySQL Server, voc apenas deve fazer backups e ter o log de atualizaes ligado. Com isto voc pode se recuperar de qualquer situao possvel com bancos de dados transacionais. sempre bom ter backups, independente de qual banco de dados voc usa. O paradigma transacional tem seus benefcios e suas desvantagens. Muitos usurios e desenvolvedores de aplicaes dependem da facilidade com a qual eles podem codificar contornando problemas onde abortar parece ser, ou necessrio. No entanto, se voc novo no paradigma de operaes atmicas ou tem mais familiaridade ou conforto com transaes, considere o benefcio da velocidade que as tabelas no transacionais podem oferece, na ordem de 3 a 5 vezes da velocidade que as tabelas transacionais mais rpidas e otimizadas. Em situaes onde integridade de grande importncia, as atuais caractersticas do MySQL permitem nveis transacionais ou melhor confiana e integridade. Se voc bloquear tabelas com LOCK TABLES todos as atualizaes iro ser adiadas at qualquer verificao de integridade ser feita. Se voc s obter um bloqueio de leitura (oposto ao bloqueio de escrita), ento leituras e inseres podero ocorrer. Os novos registros inseridos no podero ser visualizados por nenhum dos clientes que tiverem um bloqueio de LEITURA at eles liberarem estes bloqueios. Com INSERT DELAYED voc pode enfileirar inseres em uma fila local, at os bloqueios serem liberados, sem que o cliente precise esperar at a insero completar. See Seco 6.4.3.2, Sintaxe INSERT DELAYED. ``Atmico'', no sentido em que ns mencionamos, no mgico. Significa apenas que voc pode estar certo que enquanto cada atualizao especfica est sendo executada, nenhum outro usurio pode interferir com ela, e nunca haver um rollback automtico (que pode acontecer em sistemas basea43

3.

Informaes Gerais

dos em transaes se voc no tiver muito cuidado). O MySQL tambm assegura que nunca ocorrer uma leitura suja. A seguir esto algumas tcnicas para trabalhar com tabelas no transacionais: Loops que precisam de transaes normalmente pode ser codificados com a ajuda de LOCK TABLES, e voc no precisa de cursores para atualizar regitros imeditamente. Para evitar o uso do ROLLBACK, voc pode usar as seguintes estratgias: 1. 2. 3. 4. Use LOCK TABLES ... para fazer um lock todas as tabelas que voc quer acessar. Condies de teste. Atualize se estiver tudo OK. Use UNLOCK TABLES para liberar seus locks.

Isto normalmente um mtodo muito mais rpido que usar transaes com possveis ROLLBACKs, mas nem sempre. A nica situao que esta soluo no pode tratar quando algum mata a threads no meio de uma atualizao. Neste caso, todas os locks sero liberados mas algumas das atualizao podem no ter sido execuadas. Voc tambm pode usar funes para atualizar registros em uma nica operao. Voc pode conseguir uma aplicao muito eficiente usando as seguintes tcnicas: Modifique campos em relao ao seus valores atuais. Atualize apenas aqueles campos que realmente tiveram alteraes.

Por exemplo, quando fazemos atualizaes em alguma informao de cliente, atualizamoa apenas os dados do clientes que alteraram e testamos apenas aqueles com dados alterados ou dados que dependem dos dados alterados, mudaram em comparao com o registro original. O teste dos dados alterados feito com a clusula WHERE na instruo UPDATE. Se o registro no foi atualizado, mandamos ao cliente uma mensagem: ''Some of the data you have changed has been changed by another user.'' Ento mostramos o registro antigo versus o novo em uma janela, assim o usurio pode decidir qual verso do registro de cliente de ser usado. Isto nos d algo similar a lock de colunas mas que, na verdade, melhor porque apenas atualizamos algumas das colunas, usando valores relativos ao seu valor atual. Isto significa que instrues UPDATE comuns se parecem com estas: 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 eficiente e funciona mesmo se outro cliente alterar 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 de gerenciarem identificadores nicos para algumas tabelas. Isto pode ser tratado muito mais eficientemente usando uma coluna AUTO_INCREMENT e tambm uma funo SQL LAST_INSERT_ID() ou a funo da API C mysql_insert_id(). See Seco 12.1.3.32, mysql_insert_id(). Geralmente voc pode codificar evitando lock de registro. Algumas situaes realmente preci44

Informaes Gerais

sam disto, e tabelas InnoDB suportam lock de regitstro. Comoo MyISAM, voc pode usar uma coluna de flag na tabela e fazer algo como a seguir: UPDATE nome_tbl SET row_flag=1 WHERE id=ID; O MySQL retorna 1 para o nmero de linhas afetadas se as linhas foram encontradas e row_flag j no era 1 na linha original. Voc pode pensar nisto como se o MySQL Server tivesse alterado a consulta anterior para: UPDATE nome_tbl SET row_flag=1 WHERE id=ID AND row_flag <> 1;

1.8.4.4. Stored Procedures e Triggers


Steored procedures esto sendo implementadas em nossa verso 5.0 na rvore de desenvolvimento. See Seco 2.3.4, Instalando pela rvore de fontes do desenvolvimento. Este esforo baseado no SQL-99, que tm uma sintaxe bsica similar (mas no idntica) ao Oracle PL/SQL. Em adio a isto, estamoas implementando o framework SQL-99 enganchar em linguagens externas. Uma Stored Procedure um conjunto de comandos SQL que podem ser compilados e armazenados no servidor. Uma fez feito isso, os clientes no necessitam reescrever toda a consulta mas podem fazer referncia stored procedure. Isto fornece melhor performance 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 nvel conceitual tendo bibliotecas de funes no servidor. No entanto, stored procedures aumentam a carga no servidor de banco de dados, j que grande parte do trabalho feito do lado do servidor e menos do lado do cliente (aplicao). Triggers esto programados para serem implementados no MySQL verso 5.1. Um trigger um tipo de stored procedure que chamado quando um evento em particular ocorre. Por exemplo, voc poderia configurar uma stored procedure que disparada toda vez que 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.

1.8.4.5. Chaves Estrangeiras


No MySQL Server 3.23.44 e posterior, tabelas InnoDB suportam verificao de restrio de chaves estrangeiras, incluindo CASCADE, ON DELETE, e ON UPDATE. See Seco 7.5.5.2, Restries FOREIGN KEY. 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 um futuro prximo esta implementao ser estendida para que assim a informao seja armazenada num arquivo de especificao de tabela e possa ser recuperado por mysqldump e ODBC. Em um estgio posterior, restries de chaves estrangeiras sero implementadas para tabelas MyISAM. Note que as chaves estrangeiras no SQL no so usadas para ligar tabelas, mas so usadas para verificar a integridade referencial. Se voc deseja obter resultados de mltiplas tabelas de uma instruo SELECT, voc pode fazer isto ligando tabelas: SELECT * FROM table1,table2 WHERE table1.id = table2.id; See Seco 6.4.1.1, Sintaxe JOIN. See Seco 3.6.6, Utilizando Chaves Estrangeiras. Quando usada como uma restrio, FOREIGN KEYs no precisa ser usado se a aplicao insere duas linhas em tabelas MyISAM na ordem apropriada.

45

Informaes Gerais

Para tabelas MyISAM, voc pode contornar a falta de ON DELETE adicionando a instruo DELETE apropriada a uma aplicao quando voc deletar registros de uma tabela que tem uma chave estrangeira. Na prtica isto mais rpido e muito mais portvel que utilizar chaves estrangeiras. No MySQL Server 4.0 voc pode utilizar delees multi-tabela para apagar linha de muitas tabelas com um comando. See Seco 6.4.5, Sintaxe DELETE. A sintaxe FOREIGN KEY sem ON DELETE ... usada geralmente por aplicaces ODBC para produzir clusulas WHERE automticas. Note que chaves estrangeiras so mal usadas com frequncia, o que pode causar graves problemas. Mesmo quando usado apropriadamente, o suporte a chaves estrangeiras no uma soluo mgica para o problema de integridade referncial, embora possa ajudar. Algumas vantagens das chaves estrangeiras: Assumindo o projeto apropriado das relaes, as restries de chaves estrangeiras tornaro mais difcil para um programador introduzir uma inconsistncia no banco de dados. Usar atualizaes e delees em cascata pode simplificar o cdigo do cliente. Regras de chaves estrangeiras projetados apropriadamente ajudam ao documentar a relao entre as tabelas.

Desvantagens: Erros, que so facis de se ter ao projetar a relao das chaves, podem causar graves problemaspor exemplo, regras circulares ou a combinao errada de uma deleo em cascata. Verificao adicional no banco de dados afeta o desempenho, por esta razo algumas das principais aplicaes comerciais codificam sua lgica no nvel da aplicao. No incomum para um DBA fazer uma topologia complexa de relaes que torna muito difcl, e em alguns casos impossvel, 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 Server. Historicamente o MySQL Server tem sido mais usado em aplicaes e sistemas web onde o desenvolvedor da aplicao tem total controle sobre o uso do banco de dados. claro que o uso aumentou em vrias vezes e ento descobrimos que um crescente nmeros de usurios consideram views como um importante aspecto. Unnamed views (derived tables, uma seubquery na clusula FROM de uma SELECT) j esto implementadas na verso 4.1. Views geralmente so muito teis para permitir aos usurios acessar uma srie de relaes (tabelas) como uma tabela, e limitar o acesso a apenas estas relaes. Views tambm 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 o MySQL Server tem um sofisticado sistema de privilgios. See Seco 4.3, Detalhes Gerais de Segurana e o Sistema de Privilgio de Acesso do MySQL. Muitos SGBD no permitem atualizar nenhum registro em uma view, mas voc tem que fazer as atualizaes em tabelas separadas. Em nosso projeto de implemtao de views, ns buscamos (tanto quanto for possvel dentro do SQL) compatibilidade com ``Codd's Rule #6'' para sistemas de banco de dados relacionais: todos os 46

Informaes Gerais

views que so teoricamente atualizveis, devem se atualizados tambm na prtica.

1.8.4.7. '--' como Incio de Comentrio


Outros bancos de dados SQL usam '--' para iniciar comentrios. O MySQL usa # como o caractere para incio de comentrio, mesmo se a ferramenta de linha de comando mysql remover todas linhas que comeam com '--'. Voc tambm pode usar o comentrio no estilo C /*isto um comentrio*/ com o MySQL Server. See Seco 6.1.6, Sintaxe de Comentrios. O MySQL Server verso 3.23.3 e superior suporta o estilo de comentrio '--' somente se o comentrio for seguido por um caractere de espao (ou por um caracter de controle como uma nova linha). Isto ocorre porque este estilo de comentrio causou muitos problemas com queries SQL geradas automaticamente que usavam algo como o cdigo seguinte, onde automaticamente er inserido o valor do pagamento para !pagamento!: UPDATE nome_tabela SET credito=credito-!pagamento! O que voc acha que ir acontecer quando o valor de pagamento for negativo? Como 1--1 legal no SQL, ns achamos terrvel que '--' signifique incio de comentrio. Usando a nossa implementao deste mtodo de comentrio no MySQL Server Version 3.23.3 e posterior, 1-- Isto um comentrio atualmente seguro. Outro recurso seguro que o cliente de linha de comando mysql remove todas as linhas que iniciam com '--'. A seguinte discusso somente interessa se voc estiver executando uma verso do MySQL inferior a verso 3.23: Se voc tem um programa SQL em um arquivo texto que contm comentrios '--' voc dever usar: shell> replace " --" " #" < arquivo-texto-com-comentrio.sql \ | 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 '--' para #: shell> replace " --" " #" -- arquivo-texto-com-comentario.sql Desfaa utilizando este comando: shell> replace " #" " --" -- arquivo-texto-com-comentario.sql

1.8.5. Como o MySQL Lida com Restries


Como o MySQL lhe permite trabalhar com tabelas transacionais e no transacionais (que no permitem rollback), o tratamento de restries um pouco diferente no MySQL que em outros bancos de dados. Temos que tratar o caso quando voc atualiza diversos registros com uma tabela no transacional que no pode fazer rollback em erros. A filosofia bsica tentar obter um erro para qualquer coisa que possamos detectar em temp de compilao mas tentar recuperar de qualquer erro que abtemos em tempo de execuo. Fazemos isto na maiorioa dos casos, mas no para todos ainda. See Seco 1.6.4, Novos Recursos Planejados Para a Verso em um Futuro Prximo. 47

Informaes Gerais

A opo bsica que o MySQL tem parar a instruo no meio ou fazer o melhor para se recuperar do problema e continuar. A seguir mostramos o que acontece com diferentes tipos de restries.

1.8.5.1. Restries de PRIMARY KEY / UNIQUE


Normalmente voc receber um erro quando tentar fazer um INSERT / UPDATE de um registro que cause uma violao de uma chave primria, chave nica ou chave estrangeira. Se voc estiver usando um mecanismo de armazenamento transacional, como InnoDB, o MySQL automaticamente far um rollback da transao. Se voc estiver usando mecanismos de armazenemento no transacionais o MySQL ir para no registro errado e deiar o resto dos registros se processamento. Para tornar a vida mais fcil o MySQL adicionou suporte a diretiva IGNORE para a maioria dos comandos que podem causar uma violao de chave (como INSERT IGNORE ...). Neste caso o MySQL ir ignorar qualquer violao de chave e continuar com o processamento do prximo registro. Voc pode obter informao sobre o que o MySQL fez com a funo da API mysql_info() API function e em verses posteriores do MySQL 4.1 com o comando SHOW WARNINGS. See Seco 12.1.3.30, mysql_info(). See Seco 4.6.8.9, SHOW WARNINGS | ERRORS. Note que no momento apenas as tabelas InnoDB suportam chaves estrangeiras. See Seco 7.5.5.2, Restries FOREIGN KEY. O suporte a chaves estrangeiras nas tabelas MyISAM est programado para ser includa na arvor de fonte do MySQL 5.0.

1.8.5.2. Restries de NOT NULL


Para poder suportar um fcil tratamento de tabelas no transacionais todos os campos no MySQL tm valores padro. Se voc inserir um valor 'errado' em uma coluna como um NULL em uma coluna NOT NULL ou um valor numrico muito grande em um campo numrico, o MySQL ir atribuir a coluna o 'melhor valor possvel' em vez de dar uma mensagem de erro. Para strings este valor uma string vazia ou a maior string possvel que possa estar na coluna. Isto significa que se voc tentar armazenar NULL em uma coluna que no aceita valores NULL, o MySQL Server armazenar 0 ou '' (strig vazia) nela. Este ltimo comportamento pode, para uma simples insero de registro, ser alterado com a opo de compilao DDONT_USE_DEFAULT_FIELDS.) See Seco 2.3.3, Opes tpicas do configure. Isto faz com que as instrues INSERT gerem um erro a menos que voc explicite valores especficos para todas as colunas que exigem um valor diferente de NULL. A razo para as regras acima que no podemos verificar estas condies antes da consulta comear a executar. Se encontrarmos um problema depois de atualizar algumas linahs, no podemos fazer um rollback j que o tipo de tabela no suporta isto. A opo de parar no to boa como no caso em que a atualizao esteja feita pela metade que provavelmente o pior cenrio possvel. Neste caso melhor 'fazer o possvel' e ento continuar como se 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 das instrues que usam apenas tabelas transacionais no caso de tal instruo fizer uma definio de campo no permitida. O mostrado acima significa que no se deve usar o MySQL para verificar o contedo dos campos, mas deve se faz-lo por meio da aplicao.

1.8.5.3. Restries de ENUM e SET


No MySQL 4.x ENUM no uma restrio real, mas um modo mauis eficiente de armazenar campos que possam apenas conter um conjunto de valores dados. Isto devido as mesmas razes pelas quais NOT NULL no respeitado. See Seco 1.8.5.2, Restries de NOT NULL.

48

Informaes Gerais

Se voc inserir um valor errado em um campo ENUM, ele ser configurado com uma string vazia em um contexto string. See Seco 6.2.3.3, O Tipo ENUM. Se voc inserir uma opo errada em um campo SET, o valor errado ser ignorado. See Seco 6.2.3.4, O Tipo SET.

1.8.6. Erros Conhecidos e Deficincias de Projetos no MySQL


1.8.6.1. Erros da Verso 3.23 Corrigidos em Verses Posteriores do MySQL
Os seguintes erros/bugs conhecidos no esto corrigidos no MySQL 3.23 porque corrig-los involveria a mudana de muito cdigo, o que poderia introduzir outros erros, talvez piores. Os erros so tambm classificados como 'no fatal' ou 'tolervel'. Pode se obter um deadlock ao fazer LOCK TABLE em multiplas tabelas e ento na mesma conexo fizer um DROP TABLE em uma delas enquanto outra thread est tentando bloquear a tabela. Pode-se no entanto fazer um KILL em qualquer uma das threads envolvidas para resolver isto. Corrigido na verso 4.0.12 SELECT MAX(campo_chave) FROM t1,t2,t3... onde uma das trs tabelas est vazia no retorna NULL, mas sim o valor mximo da coluna. Corrigido na verso 4.0.11. DELETE FROM heap_table sem um WHERE no funcionam em tabelas HEAP com lock.

1.8.6.2. Open Bugs / Deficincias de Projeto no MySQL


Os seguintes problemas so conhecidos e tem prioridade muito alta para serem corrigidos: FLUSH TABLES WITH READ LOCK no bloqueia CREATE TABLE ou COMMIT, que pode criar um problema com a posio do log binrio ao se fazer um backup completo de tabelas e do log binrio. ANALYZE TABLE em uma tabela BDB pode, em alguns, casos inutilizar a tabela at que se reinicie o servidor mysqld. Quando isto acontecer voc ir ver o seguinte tipo de erro no arquivo de erros do MySQL. 001207 22:07:56 bdb: log_flush: LSN past current end-of-log

O MySQL aceita parenteses na parte FROM, mas os ignora sem aviso. A razo pela qual no so retornados erros que muitos clientes que geram consultas automaticamente adicionam parentesis na parte FROM mesmo onde eles no so necessrios. 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 que precedem um join LEFT ou antes de um join RIGHT. Isto ser corrigido na verso 5.0 junto com o suporte a parentesis na parte FROM. No execute ALTER TABLE em uma tabela BDB em que voc estiver executando transaes multi-instrues no completadas. (A transao provavelmente ser ignorada). ANALYZE TABLE, OPTIMIZE TABLE e REPAIR TABLE podem causar problemas em tabelas para as quais voc estiver usando INSERT DELAYED. Fazendo um LOCK TABLE .. e FLUSH TABLES .. no garante que no existem transaes no terminadas em progresso na tabela. 49

Informaes Gerais

Tabelas BDB so um pouco lentas para abrir. Se voc tiver vrias tabelas BDB em um banco de dados, gastar muito tempo para usar o cliente mysql no banco de dados se voc no estiver usando a opo -A ou se voc estiver usando rehash. Isto percebido principalmente quando voc tiver um cache de tabelas grandes. A replicao utiliza o log a nivel de consulta: o master grava a consulta no log binrio. Isto um rpido, compacto e eficiente mtodo de registro o que funciona perfeitamente na maioria dos casos. Embora nunca tenhamos ouvido sobre um caso ocorrido, h uma chance terica que o dado no master e slave sejam diferente se uma consulta feita de tal modo que a modificao do dado no determinstica, isto , deixar ao desejo do otimizador de consultas (o que geralmente no uma boa prtica, mesmo fora da replicao!). Por exemplo: 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 estrangeiras com a propriedade ON DELETE CASCADE. REPLACE ... SELECT, INSERT IGNORE ... SELECT se voc tiver valores de chaves duplicados nos dados inseridos.

Se e somente se todos estas consultas NO tiverem clusulas ORDER BY garantindo uma ordem determinstica. 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 diferentes posies, obtendo um nmero diferente na coluna auto_increment), dependendo da escolhe feita pelo otimizador no master e slave. Uma consulta ser otimizada deiferentemente no master e slave apenas se: Os arquivos usados pelas duas consultas no so exatamente a mesma; por exemplo OPTIMIZE TABLE foi executado nas tabelas master e no nas nas tabelas slave (para corrigir isto, desde o MySQL 4.1.1, OPTIMIZE, ANALYZE e REPAIR so escritos no log binrio). A tabela est armazenada em um mecanismo de armazenamento diferente no master e no slave (pode se executar diferentes mecanismos de armazenamento no metre e no slave: por exemplo, InnoDB ne master e MyISAM no slave, se o slave possuir menos espao dispponvel em disco). The MySQL buffers' sizes (key_buffer_size etc) are different on the master and slave. O master e slave executam verses diferentes do MySQL, e o cdigo do toimizador diferente entre estas verses.

Este problema tambm pode afetar a restaurao de um banco de dados usando mysqlbinlog|mysql. O modo mais fcil de evitar este problema em todos os casos adicionar uma clusula ORDER BY para tal consulta no determinstica assegure que os registros so sempre armazenados/modificados na mesma ordem. Nas verses futuras do MySQL adicionaremos automaticamente uma clusula ORDER BY quando necessrio. Os seguintes problemas so conhecidos e sero corrigidos na hora certa: Ao usar funes RPAD, ou qualquer outra funo string que termina adicionando espaos em branco a direita, em uma consulta que preisa usar tabelas temporrias para ser rsolvida, todas as strings resultantes sero cortadas a direita (como em RTRIM). Este um exemplo de uma consulta: SELECT RPAD(t1.field1, 50, ' ') AS f2, RPAD(t2.field2, 50, ' ') AS f1 FROM table1 as t1 LEFT JOIN table2 AS t2 ON

50

Informaes Gerais

t1.record=t2.joinID ORDER BY t2.record; O resultado final deste erro que o usurio no conseguira espaos em branco do lado direito do campo resultante. O comportamento anterior existe em todas as verses do MySQL. A razo disto devido ao fato de tabelas HEAP, que so usadas primeiro para tabelas temporrias, no so capazes de tratar colunas VARCHAR. Este comportamento ser corrigido em uma das distribuies da srie 4.1. Devido ao modo como os arquvos de definies de tabelas so armazenados no se 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 formatos de definio de tabelas. Quando estiver usando SET CHARACTER SET, no permitido usar caracteres especias 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 (+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 tabela, no apagando tudo nas tabelas mapeadas. Voc no pode construir em outro diretrio quando estiver utilizando MIT-pthreads. Como isto necessitaria de alteraes na MIT-pthreads, ns no estamos aptos a corrig-la. BLOB valores no podem ser usados com confiana em GROUP BY, ORDER BY ou DISTINCT. Somente os primeiros bytes (padro 1024) max_sort_length so usados quando estiver comparando BLOBs nestes casos. Isto pode ser alterado com a opo -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 nome_tabela. Clculos so feitos com BIGINT ou DOUBLE (normalmente, ambos tem o tamanho de 64 bits). Depende da preciso utilizada na funo. A regra geral que funes binrias so feitas com preciso BIGINT, IF e ELT() com preciso BIGINT ou DOUBLE e o resto com preciso DOUBLE. Devemos evitar o uso de valores sem sinal maiores que 63 bits (9223372036854775807) para qualquer outra coisa alm de campos binrios! 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 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. Voc s pode ter at 255 colunas ENUM e SET em uma tabela. Em MIN(), MAX() e outras funes de agrupamente, o MySQL atualmente compara as colunas ENUM e SET pelo valor de suas strings ao invs da posio relativa da string no 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 log, a stdout e a stderr continuam redirecionadas para o log antigo. Se voc utiliza --log extensivamente, dever editar o mysqld_safe para logar em 'hostname'.err em vez de 'hostname'.log; assim voc pode facilmente utilizar o espao do log antigo apagando-o e executando mysqladmin refresh. Em instrues UPDATE, colunas so atualizadas da esquerda para a direita. Se voc referenciar a uma coluna atualizada, voc ir obter o valor atualizado em vez do valor original, por exemplo: 51

Informaes Gerais

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 referir a qualquer tabelas temporrias dada mais de uma vez. Por exemplo, a seguinte instruo no funciona. mysql> SELECT * FROM temporary_table, temporary_table AS t2; RENAME no funciona com tabelas temporrias (TEMPORARY) ou tabelas usadas em uma tabelas MERGE. O otimizador pode lidar com o DISTINCT de forma diferente se voc estiver usando colunas 'escondidas' em uma join ou no. Em uma join, colunas escondidas so contadas como parte do resultado (mesmo se elas no so mostradas) enquanto que em queries normais colunas escondidas no participam na comparao DISTINCT. Ns provavelmente iremos alterar isto no futuro para nunca comparar as colunas escondidas quando executando DISTINCT. um exemplo disto : 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 resultado (porque o campo escondido 'id' pode variar). Perceba que isto somente acontece em consultas onde voc no tem colunas ORDER BY no resultado, algo no permitido no SQL-92. Como o MySQL permite trabalhar com tipos de tabelas que no suportam transaes (e assim no pode fazer rollback em dados) algumas coisas funcionam um pouco diferentes de outros servidores SQL em MySQL (Isto serve para garantir que o MySQL nunca necessitar de um rollback para um comando SQL). Porm isto pode ser um pouco estranho em casos que os valores dos campos devem ser verificados na aplicao, mas isto ira fornacer um timo ganho de velocidade assim como permite ao MySQL fazer algumas otimizaes que de outro modo seriam muito difceis para serem feitas. Se voc informar um valor incorreto em uma coluna, o MySQL, em vez de fazer um rollback, aramzenar o melhor valor possvel no campo. Se tentar armazenar um valor fora da faixa em uma coluna numrico, o MySQL ir armazenar o menor ou maior valor possvel no campo. Se tentar armazenar uma string que no comece com um nmero em uma coluna numrica, o MySQL ir armazenar 0 na coluna. Se voc tentar armazenar NULL em uma coluna que no aceita valores nulos, MySQL ir armazenar 0 ou '' (string vazia) na coluna. (Este comportamento pode, entretanto, ser alterado com a opo de compilao -DDONT_USE_DEFAULT_FIELDS). O MySQL permite o armazenamento de alguns valores errados de data em campos do tipo 52

Informaes Gerais

DATE e DATETIME. (Como 2000-02-31 ou 2000-02-00). A idia que no servio do servidor SQL validar datas. Se o MySQL pode armazenar uma data e recuperar extamente a mesma data, ento o MySQL armazenar a data. Se a data estiver totalmente errada, o MySQL ir armazenar a data 0000-00-00 no campo. Se voc especificar um valor no suportado para um campo do tipo enum, ele ser alterado para o valor de erro 'empty string', com valor numrico 0. Se voc definir uma coluna SET com um valor no suportado, o valor ser ignorado.

Se voc executar uma PROCEDURE em uma pesquisa que retorna uma srie vazia, em alguns casos a instruo PROCEDURE no ir transformar as colunas. Criao da tabela do tipo MERGE no verifiva se as tabelas envolvidas so de tipos compatveis. O MySQL ainda no pode lidar com valores NaN, -Inf e Inf em tipos double. Us-los causar problemas na exportao e importao de dados. Uma soluo intermediria alterar NaN para NULL (se for possvel) e -Inf e Inf para o valor double mnimo ou mximo respectivo possvel. Se voc usar ALTER TABLE para primeiro adicionar um ndice UNIQUE a uma tabela usada em uma tabela MERGE e ento usar ALTER TABLE para adicionar um ndice normal na tabela MERGE, a ordem das chaves ser diferente para as tabelas se existir uma chave antiga no nica na tabela. Isto porque o ALTER TABLE coloca chaves UNIQUE antes de chaves normais para ser possvel detectar chaves duplicadas o mais cedo o possvel.

Os seguintes erros so conhecidos em verses mais antigas do MySQL: Voc pode pendurar um processo se voc fizer um DROP TABLE em uma tabela entre outras que esteja travada com LOCK TABLES. No caso seguinte voc pode obter um descarrego de memria para o arquivo core: Tratamento de inseres com atraso tem deixado inseres pendentes na tabela. LOCK table com WRITE FLUSH TABLES

Antes da verso 3.23.2 do MySQL um UPDATE que atualizava uma chave com um WHERE na mesma chave podia falhar porque a chave era usada para procurar por registros e a mesma linha poderia ter encontrado vrios itens: UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY > 100; Um modo de contornar este erro utilizar: mysql> UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY+0 > 100; Isto funcionar porque MySQL no utilizar indices em expresses com a clusula WHERE.

Antes da verso 3.23 do MySQL, todos os tipos numricos tratados como campos de pontos fixos. Isto significa que voc tem que especificar quantas casas decimais um campo de ponto flutuante deve ter. Todos os resultados eram retornados com o nmero correto de casas decimais.

Para erros especficos na plataforma, vejas as sees sobre compilao e portabilidade. See Seco 2.3, Instalando uma distribuio com fontes do MySQL. See Apndice E, Portando para Outros Sistemas. 53

Captulo 2. Instalao do MySQL


Este captulo descreve como obter e instalar o MySQL: Para uma lista de sites no quais voc pode obter o MySQL, veja Seco 2.2.1, Como obter o MySQL. Para saber quais so as plataformas suportadas, veja em Seco 2.2.3, Sistemas Operacionais suportados pelo MySQL. Por favor perceba que nem todas as plataformas suportadas so igualmente boas para executar o MySQL. Algumas so mais robustas e eficientes que outras - ver Seco 2.2.3, Sistemas Operacionais suportados pelo MySQL para detalhes. Vrias verses do MySQL esto disponveis em distribuies binrias e fonte. Ns tambm fornecemos acesso pblico nossa rvore fonte atual para aqueles que desejam ver nossos desenvolvimentos mais recentes e nos ajudar a testar novos cdigos. Para determinar que verso e tipo da distribuio voc deve usar, veja Seco 2.2.4, Qual verso do MySQL deve ser usada. Se ainda restar dvidas, use uma a distribuio binria. Instrues de instalao para distribuies binria e fonte so descritos em Seco 2.2.9, Instalando uma Distribuio Binria do MySQL e Seco 2.3, Instalando uma distribuio com fontes do MySQL. Cada conjunto de instrues inclui uma seo sobre problemas especficos de sistemas que voc pode precisar. Para procedimentos ps-instalao, veja Seco 2.4, Configuraes e Testes Ps-instalao. Estes procedimentos podem ser aplicados caso voc use uma distribuio binria ou fonte do MySQL.

2.1. Instalao rpida padro do MySQL


Este captulo cobre a instalao do MySQL em plataformas onde oferecemos pacotes usando oformato de empacotamento nativo da respectiva plataforma. No entanto, as distribuies binrias do MySQL esto disponveis para muitas outras plataformas, veja Seco 2.2.9, Instalando uma Distribuio Binria do MySQL para instrues gerais de instalao para estes pacotes que se aplicam a todas as plataformas. Veja Seco 2.2, Detalhes Gerais de Instalao para mais informaes sobre quais outras distribuies binrias esto disponveis e como obt-las.

2.1.1. Instalando o MySQL no Windows


O processo de instalao para o MySQL no Windows tem os seguintes passos: 1. 2. 3. 4. Instale a distribuio. Configure um arquivo de opo se necessrio. Selcione o servidor que voc quer usar. Inicie o servidor.

O MySQL para Windows est disponvel em dois formatos de distribuio: A distribuio binria contm um programa de instalao que instala que voc precisa e assim possa iniciar o servidor imediatamente. A distribuio fonte contm todo o cdigo e os arquivos suportados para construir o executvel 54

Instalao do MySQL

usando o compilador VC++ 6.0. See Seco 2.3.7, Instalando o MySQL a partir do Fonte no Windows. Geralmente, a melhor opo a distribuio binria. mais simples e voc no precisa de nenhuma ferramenta adicional para ter o MySQL em execuo.

2.1.1.1. Exigncias do Sistema Windows


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

2.1.1.2. Instalando uma Distribuio Binria do Windows


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

Instalao do MySQL

4. 5. 6.

Finalize o programa WinMySQLAdmin se ele estiver em execuo. Descompacte os arquivos de distribuio em um diretrio temporrio. Execute o programa setup.exe para iniciar o processo de instalao. Se voc quiser instalar em um diretrio diferente do padro (c:\mysql), use o boto Browse para especificar seu diretrio preferido. Se voc no instalar o MySQL no local padro, voc precisar epecificar o local onde voc inicia o servidor. O modo mais fcil de se fazer isto usar um arquivo de opo, como descrito em Seco 2.1.1.3, Preparando o Ambiente MySQL do Windows. Finalize o processo de instalao.

7.

2.1.1.3. Preparando o Ambiente MySQL do Windows


Se voc precisar especificar opes de inicializao quando executar o servidor, voc pode indentifica-los na linha de comando ou coloc-los em um arquivo de opo. Par opes que so usadas sempre que o servidor iniciar, voc achar mais conveniente utilizar um arquivo de opco para especificar a configurao do seu MySQL. Isto particularmente verdade sob as seguintes circunstncias: A localizao do diretrio de instalao ou dados so diferentes dos locais padro (c:\mysql e c:\mysql\data). Voc precisa ajustar as configuraes do servidor. Por exemplo, para usar as tabelas transacionais InnoDB no MySQL verso 3.23, voc deve criar manualmente dois novos diretrios para guardar os arquivos de dados e de log do InnoDB --- por exemplo, c:\ibdata e c:\iblogs. Voc tambm poder adicionar algumas linhas extras ao arquivo de opo, como descrito em Seco 7.5.3, Opes de Inicializao do InnoDB. (A partir do MySQL 4.0, o InnoDB cria os seus arquivos de log e dados no diretrio de dados por padro. Isto significa que voc no precisa configurar o InnoDB explicitamente. Voc ainda deve faz-lo se desejar, e um arquivo de opo ser til neste caso.)

No Windows, o instalador do MySQL coloca o diretrio de dados diretamente sob o diretrio onde voc instalou o MySQL. Se voc quisesse utilizar um diretrio de dados em um local diferente, voc deve copiar todo o contedo do diretrios data para a nova localizao. Por exemplo, por padro, o instalador coloca o MySQL em C:\mysql e o diretrio de dados em C:\mysql\data. Se voc quiser usar um diretrio de dados de E:\mydata, voc deve fazer duas coisas: Mova o diretrio de dados de C:\mysql\data para E:\mydata. Use uma opo --datadir para especificar a nova localizao do diretrio de dados cada vez que voc iniciar o servidor.

Quando o servidor MySQL inicia no Windows, ele procura pelas opes em dois arquivos: O arquivo my.ini no diretrio Windows e o arquivo chamado C:\my.cnf. O diretrio do Windows normalmente chamado C:\WINDOWS ou C:\WinNT. Voc pode determinar a sua localizao exata a partir do valor da varivel de ambiente WINDIR usando o seguinte comando: C:\> echo %WINDIR% O MySQL procura pelas opes primeiro no arquivo my.ini, e ento pelo arquivo my.cnf. No entanto, para evitar confuso, melhor se voc usar apenas um destes arquivos. Se o seu PC usa um boot loader onde o drive C: no o drive de boot, sua nica opo usar o arquivo my.ini. Independente de qual arquivo usar, ele deve ser no formato texto. Um arquivo de opo pode ser criado e modificado com qualquer editor de texto como o programa Notepad. Por exemplo, se o MySQL est instalado em D:\mysql e o diretrio de dados est lo56

Instalao do MySQL

calizado em D:\mydata\data, voc pode criar o arquivo de opo e definir uma seo [mysqld] para especificar valores para os parmetros basedir e datadir: [mysqld] # defina basedir com o seu caminho de instalao basedir=D:/mysql # defina datadir com o local do diretrio de dados, datadir=D:/mydata/data Note que os nome de caminho do Windows so especficados em arquivos de opo usando barras normais em ves de barra invertida. Se voc usar barras invertidas, voc deve us-las em dobro. Outro modo de se gerenciar um arquivo de opo usar a ferramenta WinMySQLAdmin. Voc pode encontrar o WinMySQLAdmin no diretrio bin de sua instalao MySQL, assim como um arquivo de ajuda contendo instrues para us-lo. O WinMySQLAdmin tem a capacidade de editar os seus arquivos de opo, mas note o seguinte: WinMySQLAdmin usa apenas o arquivo my.ini. Se o WinMySQLAdmin encontra o arquivo C:\my.cnf, ele o renomear para C:\my_cnf.bak para disabilit-lo.

Agora voc est pronto para testar o servidor.

2.1.1.4. Selecionando um Servidor Windows


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

Todos os binrios acima so otimizados para processadores Intel modernos mas deve funcionar em qualquer processador Intel i386 ou melhor. Os servidores mysqld-nt e mysqld-max-nt suportam conexes named pipe. Se voc usar um destes servidores, o uso de named pipes est sujeito a estas condies: Os servidores devem ser executados em uma verso do Windows que suporte named pipes (NT, 2000, XP). A partir da verso 3.23.50, named pipes s estaro habilitados se voc iniciar estes servidores com a opo --enable-named-pipe. 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. No Windows 95, estes servidores no podem ser usados.

57

Instalao do MySQL

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 conexes named pipes. Para informaes sobre qual servidor binrio executar, veja Seco 2.1.1.3, Preparando o Ambiente MySQL do Windows. Esta seo lhe d um viso geral da inicializao de um servidor MySQL. A seguinte seo fornce informao mais especfica para verses particulares do Windows. Os exemplos nesta seo assumem que o MySQL est instalado sob a localizao padro, C:\mysql. Ajuste o caminho mostrado nos exemplos se voc tiver o MySQL instalado em 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 na janela do DOS. Se alguma coisa estiver errado com sua configurao, estas mensagens tornaro mais fcil para voc de identificar e corrigir qualquer problema. Tenha certeza que voc est no diretrio onde o servidor localizado e ento entre este comando: shell> mysqld --console Para servidores que incluem suporte InnoDB, voc deve ver as seguintes mensagens assim que o servidor iniciar: InnoDB: The first specified datafile c:\ibdata\ibdata1 did not exist: InnoDB: a new database to be created! InnoDB: Setting file c:\ibdata\ibdata1 size to 209715200 InnoDB: Database physically writes the file full: wait... InnoDB: Log file c:\iblogs\ib_logfile0 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile0 size to 31457280 InnoDB: Log file c:\iblogs\ib_logfile1 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile1 size to 31457280 InnoDB: Log file c:\iblogs\ib_logfile2 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile2 size to 31457280 InnoDB: Doublewrite buffer not found: creating new InnoDB: Doublewrite buffer created InnoDB: creating foreign key constraint system tables InnoDB: foreign key constraint system tables created 011024 10:58:25 InnoDB: Started Quando o servidor finaliza sua sequncia de inicializao, voc deve ver algo como abaixo, que indica que o servidor est pronto para o conexo com o cliente: mysqld: ready for connections Version: '4.0.14-log' socket: '' port: 3306

O servidor continuar a gravar no console qualquer sada de diagnstico adicional que ele produza. Voc pode abrir uma nova janela de console na qual se executar os programas clientes. Se voc omitir a opo --console, o servidor grava a sada do diagnstico no log de erro no diretrio de dados. O log de erro o arquivo com a extenso .err.

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 isto, voc deve ter certeza de que o suporte TCP/IP est instalado na sua mquina antes de iniciar o MySQL. Voc po58

Instalao do MySQL

de encontrar o TCP/IP no seu CD-ROM do Windows. Note que se voc estiver usando uma verso antiga do Win95 (por exemplo, OSR2). prefervel que voc use um pacote antigo Winsock; para o MySQL necessrio o Winsock 2! Voc pode obter o Winsock mais novo em http://www.microsoft.com. O Windows 98 tem a nova biblioteca Winsock 2, portanto no necessrio atualizar a biblioteca. Para iniciar o servidor mysqld, voc deve iniciar uma janela do Prompt (Janela ``MS-DOS'') e digitar: shell> C:\mysql\bin\mysqld Isto ir iniciar o mysqld em segundo plano. Isto , depois do servidor iniciar, voc deve ver outro prompt de comando. (Note que se voc iniciar o servidor deste modo no Windows NT, 2000 ou XP, o servidor ir executar em segundo plano e nenhum prompt de comando aparecer at que o servidor finalize. Por isto, voc deve abrir outro prompt de comando para executar programas clientes enquanto o servidor estriver em execuo.) Voc pode finalizar o servidor MySQL executando: shell> C:\mysql\bin\mysqladmin -u root shutdown Isto chama o utilitrio administrativo do MySQL mysqladmin para conectar ao servidor e mandalo finalizar. O comando conecta como root que a conta administrativa padro no sistema de permisses do MySQL. Por favor, note que o sistema de permisses do MySQL totalmente independente de qualquer login de usurio sob o Windows. Se o mysqld no iniciar, por favor, verifique o log de erro para ver se o servidor escreveu alguma mensagem que possa indicar a causa do problema. Voc pode tambm tentar iniciar o servidor com mysqld --console; neste caso, voc pode obter alguma informao til na tela que pode ajudar a resolver o problema. A ltima opo iniciar o mysqld com --standalone --debug. Neste caso o mysqld ir escrever em um arquivo log C:\mysqld.trace que deve conter a razo pela qual o mysqld no inicia. See Seco E.1.2, Criando Arquivos Trace (Rastreamento). Use mysqld --help para mostrar todas as opes que o mysqld entende!

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


Na famlia NT (Windows NT, 2000 ou XP) o modo recomendado de executar o MySQL instal-lo como um servio do Windows. O Windows ento inicia e para o servidor MySQL automaticamente quando o Windows inicia e para. Um servidor instalado como um servio tambm pode ser controlado a partir da linha de comando usando os comandos NET, ou com o utilitrio grfico Servios. O utilitrio Servios (o Service Control Manager do Windows) pode ser encontrado no Painel de Controle do Windows (em Ferramentas Administrativas no Windows 2000). recomendado que se feche o utilitrio Servios enquanto realiza a operaes de instalao ou remoo do servidor a partir desta linha de comando. Isto evita alguns erros estranhos. Para ter o MySQL funcionando com TCP/IP no Windows NT 4, voc deve instalar o service pack 3 (ou mais novo)! Antes de instalar o MySQL como um servio, voc deve primeiro parar o servidor atual em execuo usando o seguinte commando: shell> C:\mysql\bin\mysqladmin -u root shutdown Isto chama o utilitrio administrativo do MySQL mysqladmin para conectar ao servidor e mandlo parar. O comando conecta com root que a conta administrativa padro no sistema de permisses do MySQL. Por favor, note que o sistema de permisses do MySQL totalmente independente 59

Instalao do MySQL

de qualquer login de usurio sob o Windows. Agora instale o servidor como um servio: shell> mysqld --install Se voc no definir um nome para o servio, ele instalado com o nome MySQL. Uma vez instalado, ele pode ser imediatamente iniciado a partir do utilitrio Servios, ou usando o comando NET START MySQL. (Este comando caso insensitivo). Uma vez em execuo, o mysqld pode ser parado usando o utilitrio de Servios ou usando 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 servidor, tente instal-lo usando seu caminho compelto: shell> C:\mysql\bin\mysqld --install A partir do MySQL 4.0.2, voc pode especificaro nome do servio depois da opo --install. A partir do MySQL 4.0.3, voc pode especificar uma opo --defaults-file depois do nome do servio para indicar onde o servidor deve obter opes ao iniciar. A regras que determinam o nome do servio e os arquivos de opo que o servidor usa so as seguintes: Se voc especificar um nome de servio depois da opo --install, o servidor ignora o grupo de opo [mysqld] em vez de ler opes do grupo que tem o mesmo nome que o servio. O servidor le opes do arquivo de opes padro. Se voc especificar uma opo --defaults-file depois do nome de servio, o servidor ignora o arquivo de opes padro e l opes apenas a partir do grupo [mysqld] do arquivo indicado. Se voc no especificar um nome de servio, o servidor usa o nome padro do MySQL e o servidor l as opes do grupo [mysqld] no arquivo de opes padro.

Nota: Antes do MySQL 4.0.17, um servidor instalado como um servio do Windows tinha problema na inicializao se o seu caminho ou nome do servio possuisse espaos. Por esta razo, evite instalar o MySQL em um diretrio como C:\Program Files ou usar um nome de servio contendo espao. No caso normal que voc instala o servidor com --install mas nenhum nome de servio, o servidor instalado com um nome de servio de MySQL. Como um exemplo mais complexo, considere o seguinte comando: shell> C:\mysql\bin\mysqld --install mysql --defaults-file=C:\my-opts.cnf Aqui, um nome de servio dado depois de opo --install. Se nenhuma opo -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 de opo para ser usado pelo programa cliente mysql.) No entanto, como a opo --defaults-file est presente, o servidor l as opes apenas a partir do arquivo indicado, e apenas do grupo de opo [mysqld]. Voc tambm pode especificar as opes como ``Parmetros de inicializao'' no utilitrio de Servios do Windows antes de voc iniciar o servio MySQL. Uma vez que o servidor MySQL instalado, o Windows ir iniciar o servio automaticamente sempre que o Windows inicia. O servio tambm pode ser iniciado imediatamente a partir do utilitrio Servios ou usando o comando NET START MYSQL. O comando NET no caso sensitivo. 60

Instalao do MySQL

Note que quando executado como um servio, o mysqld no tm acesso a um console e ento nenhuma mensagem pode ser vista. Se o mysqld no iniciar, verifique o log de erros par ver se o servidor gravou alguma mensagem l indicando a causa do problema. O log de erro est localizado no diretrio c:\mysql\data. o arquivo com um sufixo .err. Quando o mysqld est executando como um servio, ele pode ser parado usando o utilitrios Servios, o comando NET STOP MYSQL, ou o comando mysqladmin shutdown. Se o servip estiver em execuo quando o Windows desliga, o Windows ir parar o servidor automaticamente. A partir do MySQL verso 3.23.44, voc pode escolher entre instalar o servidor como um servio Manual se voc no deseja que os servios sejam executados automaticamente durante o processo de inicializao. Para fazer isto, use a opo --install-manual em vez da opo --install. shell> C:\mysql\bin\mysqld --install-manual Para remover um servio que est instalado como um servio, primeiro pare-o se ele estiver em execuo. Ento use a opo --remove para remov-lo: shell> mysqld --remove Um problema com a finalizao automtica do servio MySQL que, para verses do MySQL anteriores a 3.23.49, o Windows esparava apenas por alguns segundos para o desligamento completo, e matava os processos do servidor de banco de dados se o tempo limite fosse excedido. Isto potencialmente causava problemas. (Por exemplo, o mecanimo de armazenamento InnoDB dever fazer uma recuperao de falhas na prxima inicializao). A partir do MySQL 3.23.49, o Windows ir esperar mais para que a finalizao do MySQL Server esteja completa. Se voc notar que ainda no o suficiente para a sua instalao, no seguro executar o MySQL Server como um servio. Em vez disso, execute-o a partir do prompt de comando, e finalize-o com mysqladmin shutdown. A alterao para avisar para o Windows para esperar mais quando parar o servidor MySQL funciona apenas com o Windows 2000 e XP, mas no para o Windows NT. No NT, o Windows espera apenas 20 segundos para que o servio seja finalizado, e depois desso ele mata o processo do servio. Voc pode aumentar este padro abrindo o Editor de Registro (\winnt\system32\regedt32.exe) e editar o valor de WaitToKillServiceTimeout em HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control na rvore do Registro. Especifique o novo valor mais largo em milisegundos (por exemplo 12000 para que o Windows NT espere at 120 segundos). Se voc no quiser iniciar o mysqld como um servio, voc pode inici-lo a partir da linha de comando do mesmo modo que em verses do Windows que no so baseados no NT. Para instrues use Seco 2.1.1.6, Iniciando o MySQL no Windows 95, 98, ou Me.

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 TCP/IP, independente da plataforma: Named pipes atualmente mais lento que TCP/IP em muitas configuraes do Windows. Alguns usurios encontraram problemas ao finalizar o servidor MySQL quando era usado named pipes.

A partir da verso 3.23.50, named pipes s est habilitado para o mysqld-nt e mysql-max-nt se eles forem iniciados com a opo --enable-named-pipe. Voc pode forar que um cliente MySQL use named pipes especificando a opo --pipe ou especificando . como nome de mquina. Use a opo --socket para especificar o nome do pipe. No MySQL 4.1, voc deve usar a opo --protocol=PIPE. 61

Instalao do MySQL

Voc pode testar se o MySQL est funcionando executando qualquer dos seguintes comandos: 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 existe um problema com seu DNS. Neste caso, inicie o mysqld com a opo --skip-name-resolve e use somente localhost e nmeros IP na coluna Host das tabelas de permisses do MySQL. Existem duas verses da ferramenta de linha de comando MySQL: Binario mysql mysqlc Descrio Compilado em Windows nativo, oferecendo capacidades de edio de texto muito limitadas. Compilado com o compilador Cygnus GNU, que oferece edio readline.

Se voc desejar usar o mysqlc, deve ter uma cpia da biblioteca cygwinb19.dll em algum lugar que o mysqlc possa encontr-la. Se sua distribuio do MySQL no tiver esta biblioteca instalada no mesmo diretrio que o mysqlc (o diretrio bin sob o diretrio base sa dua instalao do MySQL). Se sua distribuio no tem a biblioteca cygwinb19.dll no diretrio bin, olhe no diretrio lib para encontr-lo e copi-lo para o seu diretrio de sistema no Windows. (\Windows\system ou um lugar parecido). Os privilgios padres no Windows do a todos usurios locais privilgios totais para todos os bancos de dados sem necessidade de especificar uma senha. Para deixar o MySQL mais seguro, voc deve configurar uma senha para todos os usurio e remover a linha na tabela mysql.user que tem Host='localhost' e User=''. Voc tambm deve adicionar uma senha para o usurio root. O exemplo seguinte exemplo inicia removendo o usurio annimo que tem todos os privilgios, e ento configura uma senha para o usurio root: C:\> C:\mysql\bin\mysql mysql mysql> DELETE FROM user WHERE Host='localhost' AND User=''; mysql> FLUSH PRIVILEGES; mysql> QUIT C:\> C:\mysql\bin\mysqladmin -u root password your_password Depois de configurar a senha, se voc desejar desligar o servidor mysqld, voc pode usar o 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 o comando mysqladmin para configurar uma senha ir falhar com um erro: parse error near 'SET password'. A correo para este problema atualizar para uma verso mais nova do MySQL. Com as verses atuais do MySQL voc pode facilmente adicionar novos usurios e alterar privilgios com os comandos GRANT e REVOKE. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE.

2.1.2. Instalando o MySQL no Linux


O modo recomendado para instalar o MySQL no Linux usando um arquivo RPM. Os RPMs do MySQL atualmente so construdos na verso 7.3 do sistema Suse Linux mas deve funcionar em outras verses de Linux que suportam rpm e usam glibc.

62

Instalao do MySQL

Se voc tiver problemas com um arquivo RPM (por exemplo, se voc receber o erro ``Sorry, the host 'xxxx' could not be looked up''), veja Seco 2.6.2.1, Notas Linux para distribuies binrias. Na maioria dos casos, voc s precisa instalar os pacotes servidor MySQL e o cliente MySQL para ter uma instalao funcional do MySQL. Os outros pacotes no so exigidos para uma instalao padro. Se voc quiser executar um servidor MySQL Max que tenha capacidades adicionais, voc deve instalar o RPM MySQL-Max depois de instalar o RPM MySQL-server. See Seco 4.8.5, mysqld-max, om servidor mysqld extendido. Se voc tiver um dependncia de falha ao tentar instalar os pacotes do MySQL 4.0 (ex.: ``error: removing these packages would break dependencies: libmysqlclient.so.10 is needed by ...''), voc tambm deve instalar o pacote MySQL-shared-compat, o qual inclui ambas as bibliotecas para compatibilidade com verses anteriores (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 aplicaes dinamicamente para economizar espao em disco. Se estas bibliotecas compartilhadas esto em pacotes separados (ex.; MySQL-shared), suficiente simplesmente deixar estes pacotes instalados e apenas atualizar os pacotes do servidor e cliente MySQL (que so estaticamente ligados e no dependem de bibliotecas compartilhadas). Para distribuies 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 pacote compatvel com MySQL-shared. Os seguintes pacotes RPM esto disponveis: MySQL-server-VERSION.i386.rpm O servidor MySQL. Voc ira precisar dele a no ser que voc apenas queira se conectar a um servidor MySQL executando em outra mquina. Note que este pacote era chamado MySQLVERSION.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, porque o RPM MySQL-Max depende dele. MySQL-client-VERSION.i386.rpm Os programas clientes padres do MySQL. Provavelmente voc sempre instalar este pacote. MySQL-bench-VERSION.i386.rpm Testes e comparativos de performances (benchmarks). Necessita do Perl e mdulos do BDBmysql. MySQL-devel-VERSION.i386.rpm As bibliotecas e arquivos include necessrios se voc precisa para compilar outros clientes MySQL, como nos mdulos Perl. MySQL-shared-VERSION.i386.rpm Este pacote contm as bibliotecas compartilhadas (libmysqlclient.so*) que certas linguagens e aplicaes nencessrias para carregar dinmicamente e usar o MySQL. MySQL-shared-compat-VERSION.i386.rpm Este pacote inclui o biblioteca compartilhada para MySQL 3.23 e MySQL 4.0. Instale este pacote em vez do MySQL-shared, se voc tiver aplicaes instaladas que so dinmicamente ligadas ao MySQL 3.23 mas voc quer atualizar para o MySQL 4.0 sem quebrar as dependncias da 63

Instalao do MySQL

biblioteca. Este pacote esta disponvel 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 para tentar construir RPMs para outras arquiteturas (por exemplo, Alpha ou SPARC). Para ver todos os arquivo em um pacote RPM, (por exemplo, um RPM MySQL-server), execute: shell> rpm -qpl MySQL-server-VERSION.i386.rpm Para realizar uma instalao mnima padro, execute: 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 verificar a integridade e autenticidade dos pacotes antes de installos. Se voc quiser aprender mais sobre este recurso, veja Seco 2.2.2, Verificando a Integridade do Pacote Usando MD5 Checksums ou GnuPG. O RPM coloca dados sob o /var/lib/mysql. O RPM tambm cria as entradas apropriadas em / etc/rc.d/ para iniciar o servidor automaticamente na hora do boot. (Isto significa que se voc realizou uma instalao anterior e fez alteraes em seu script de inicializao, voc pode desejar criar uma cpia do script para que voc no perca ao instalar um RPM mais novo). Veja Seco 2.4.3, Inicializando e parando o MySQL automaticamente. para mais informaes sobre como o MySQL pode ser iniciado automaticamente na inicializao do sistema. Se voc quiser instalar o RPM do MySQL em uma distribuio Linux mais antiga que no suporte scripts de inicializao no /etc/init.d (diretamente ou via link simblico), voc deve criar um link simblico que aponte para a localizao onde o seu script de instalao est atualmente instalado. Por exemplo, se esta localizao for /etc/rc.d/init.d, use estes comandos antes de intalar o RPM para criar /etc/init.d como um link simblico que aponte l: shell> cd /etc; ln -s rc.d/init.d . No entanto, todas as distribuies de Linux atuais j devem suportar este novo layout de diretrio que usa /etc/init.d j que ele exigido para compatibilidade LBS (Linux Standard Base). Se o arquivo RPM que voc instalar inclui o MySQL-server, o daemon mysqld deve estar pronto e em execuo aps a instalao. Agora voc j deve poder iniciar o MySQL. See Seco 2.4, Configuraes e Testes Ps-instalao. Se alguma coisa der errado, voc encontrar maiores informaes no captulo de instalao. See Seco 2.2.9, Instalando uma Distribuio Binria do MySQL.

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'') usando um pacote do binrio do Mac OS X PKG em vez da distribuio binrio em tarball. Note que verses mais antigas do Mac OS X (ex.: 10.1.x) no so suportadas por este pacote. Este pacote est localizado dentro de um arquivo de imagem de disco (.dmg). que voc primeiro 64

Instalao do MySQL

precisa montar com um duplo clique em sua cone no Finder. Ele deve ento montar a imagem e exibir o seu contedo. NOTA: Antes de proceder com a instalao, tenha certeza que voc finalizou todas as instncias do MySQL em execuo usando o MySQL Manager Aplication (no Mac OS X Server) ou via mysqladmin shutdown na linha de comando. Para relamente instalar o MySQL PKG, de um duplo clique na cone do pacote. Isto inicia o Mac OS Package Installer, que ir guia-lo pela instalao do MySQL. O Mac OS X PKG do MySQL ir se instalar em /usr/local/mysql-<version> e tambm instalr um link simblico /usr/local/mysql, apontando para a nova localizao. Se um diretrio chamado /usr/local/mysql j existe, ele ser renomeado para / usr/local/mysql.bak em primeiro lugar. Adicionalmente, ele ir instalar a tabela de permisses do banco de dados MySQL executando mysql_install_db depois da instalao. O layout de instalao similar a aquele da distribuio binria, todos os binrios do MySQL esto localizados no diretrio /usr/local/mysql/bin. O socket MySQL ser colocado em / tmp/mysql.sock por padro. See Seco 2.2.5, Layouts de Instalao. A instalao do MySQL exige uma conta de usurio do Mac OS X chamada mysql (uma conta de usurio com este nome existe por padro no Mac OS X 10.2 e acima). Se voc estiver executando o MAC OS X Server, voc j ter uma verso do MySQL instalado: Mac OS X Server 10.2-10.2.2 vem com o MySQL 3.23.51 instalado Mac OS X Server 10.2.3-10.2.6 vem com o MySQL 3.23.53 Mac OS X Server 10.3 vem com o MySQL 4.0.14

Esta seo do manual cobre a instalao apenas do MySQL Mac OS X PKG oficial. Leia o ajuda da Apple sobre a instalao do MySQL (Execute o aplicativo ``Help View'', selecione a ajuda do ``Mac OS X Server'' e faa uma busca por ``MySQL'' e leia o item entitulado ``Installing MySQL''). Note especialmente, que a verso pr-instalada do MySQL no Mac OS X Server iniciado 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 http://www.entropy.ch, voc pode simplesmente seguir as intrues de atualizao para pacotes usando o layout de instalao dos binrio como dados em suas pginas. Se voc est atualizado da verso 3.23.xx de Marc ou do verso Mac OS X Server do MySQL para o MySQL PKG oficial, voc tambm deve converter a tabela de privilgios do MySQL existente para o formato atual, porque alguns novos privilgios de segurana foram adicionados. See Seco 2.5.6, Atualizando a Tabela de Permisses. Se voc preferisse iniciar automaticamente o MySQL durante o boot do sistema, voc tambn precisa instalar o MySQL Startup Item. A partir do MySQL 4.0.15, ele parte do disco de instalao do Mac OS X como um pacote de instalao separado. Simplesmente de um duplo clique no cone MySQLStartupItem.pkg e siga as instrues para instal-lo. Note que isto s precisa ser feito uma vez! No h necessidade de se instalar o Startup Item toda vez que se atualizar o pacote do MySQL. Devido a um erro no instalador de pacotes do Mac OS X, algumas vezes voc pode ver a mensagem de erro You cannot install this software on this disk. (null) no dilogo de seleo do disco de destino. Se este erro ocorrer, simplesmente clique no boto Go Back uma vez para retornar a tela anterior. Agora clique em Continue para avanar para a seleo do disco de destino novamente - agora voc deve estar apto a escolher o disco destino corretamente. Ns informamos este erro a Apple e eles esto investigando este problema. O Startup Item ser instalado em /Library/StartupItems/MySQL. Ele adiciona uma vari65

Instalao do MySQL

vel MYSQLCOM=-YES- ao arquivo de configurao do sistema (/etc/hostconfig). Se voc desejasse diasbilitar a inicializao automtica do MySQL, simplesmente altere o valor desta varivel para MYSQLCOM=-NO-. No Mac OS X Server, o script de instalao do Startup Item disabilitar automaticamente a inicializao da instalao padro do MySQL alterando a varivel MYSQL em /etc/hostconfig para MYSQL=-NO-. Isto para evitar conflitos na inicializao. No entanto, ele no desliga um servidor MySQL aj em execuo. Depois da instalao, voc pode iniciar o MySQL executando os seguintes comandos em um janela de terminal. Note qye voc preceisa ter privilgios de administrador para realizar esta tarefa. Se voc tiver instalado o Startup Item: shell> sudo /Library/StartupItems/MySQL/MySQL start (Enter your password, if necessary) (Press Control-D or enter "exit" to exit the shell) Se voc no tiver instalado o Startup Item, digite a seguinte sequncia de comandos: shell> shell> (Enter (Press shell> (Press cd /usr/local/mysql sudo ./bin/mysqld_safe your password, if necessary) Control-Z) bg Control-D or enter "exit" to exit the shell) conectar ao servidor MySQL, ex.: executando /

Agora voc deve conseguir se usr/local/mysql/bin/mysql

Se voc instalar o MySQL pela primeira vez, lembre-se de consigurar uma senha para o usurio root do MySQL! Isto feito com os seguintes comandos: /usr/local/mysql/bin/mysqladmin -u root password <password> /usr/local/mysql/bin/mysqladmin -u root -h `hostname` password <password> Por favor, tenha certeza que o comando hostname na segunda linha est entre crases (`), assim a shell pode substitu-la com a sada deste comando (o nome da mquina deste sistema)! Voc tambm pode querer adicionar aliases ao seu arquivo de resursos do sheel para acessar mysql e mysqladmin da linha de comando: alias mysql '/usr/local/mysql/bin/mysql' alias mysqladmin '/usr/local/mysql/bin/mysqladmin' De forma alternativa, voc pode simplesmente adicionar /usr/local/mysql/bin a sua varivel de ambiente PATH, ex.: adicionando o seguinte ao arquivo $HOME/.tcshrc: setenv PATH ${PATH}:/usr/local/mysql/bin Note que instalar um novo MySQL PKG no remove o diretrio de uma instalao mais antiga. Infelizmente o Mac OS X Installer ainda no oferece a funcionalidade exigida para atualizar apropriadamente pacotes instalados anteriormente. Depois de copiar os arquivos de banco de dados do MySQL sobre os da verso anterior e inicializar o nova verso com sucesso, voc deve remover os arquivos da instalao antiga para economizar espao em disco. Adicionalmente voc tambm deve remover verses mais antigas do diretrio do Package Receipt localizados em /Library/Receipts/mysql-<version>.pkg.

66

Instalao do MySQL

2.1.4. Instalando o MySQL no NetWare


A partir da verso 4.0.11, o MySQL est disponvel para a Novell NetWare na forma de pacote do binrio. Para servir o MySQL, o servidor NetWare deve suprir estas exigncias: NetWare verso 6.5, ou NetWare 6.0 com Support Pack 3 instalado (Voc pode obt-lo em http://support.novell.com/filefinder/13659/index.html). O sistema deve obedecer as exigncias mnimas da Naveel para executar a respectiva verso do NetWare. Os dados do MySQL, assim com os seus binrios, devem ser instalados em um volume NSS; volumes tradicionais no so suportados.

O pacote binrio para o NetWare pode ser obtido em http://www.mysql.com/downloads/. Se voc estiver executando o MySL no NetWare 6.0, sugerimos que voc utilize a opo -skip-external-locking na linha de comando. Tambm ser necessrio utilizar CHECK 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


1. Se voc estiver atualizando de um instaao anterior, para o servidor MySQL. Isto feito a partir do console do servidor, usando: SERVER: 2. 3. mysqladmin -u root shutdown

Conecte-se no servidor alvo a partir de uma mquina cliente com acesso ao local onde voc instalar o MySQL. Extraia o pacote zip binrio em seu servidor. Tenha certeza de permitir que os caminhos no arquivo zip sejam usados. seguro simplesmente extrair os arquivos para SYS:\. Se voc estiver atualizando de uma instalando anterior, voc pode precisar copiar os diretrios de dados (ex.: SYS:MYSQL\DATA) agora, assim como my.cnf se voc o tiver costumizado. Voc pode ento deletar a cpia antiga do MySQL.

4.

Voc pode desejar renomear o diretrio para algo mais consistente e fcil de usar. Recomendamos usar o SYS:MYSQL; exemplos no manual o usaro para se referir ao diretrio de instalao em geral. No console do servidor, adicione um caminho de busca no diretrio contendo os NLMs do MySQL. Por exemplo: SERVER: SEARCH ADD SYS:MYSQL\BIN

5.

6. 7. 8.

Instale o banco de dados inicial, se necessrio, digitando mysql_install_db no console do servidor. Inicie o servidor MySQL usando mysqld_safe no console do servidor. Para finalizar a instalao, voc tambm deve adicionar os seguintes comandos ao autoexec.ncf. Por exemplo, se sua instalao do MySQL est em SYS:MYSQL e voc quiser que o MySQL inicie automaticamente, voc pode adicionar estas linhas: #Starts the MySQL 4.0.x database server SEARCH ADD SYS:MYSQL\BIN MYSQLD_SAFE

67

Instalao do MySQL

Se voc estiver usando NetWare -skip-external-locking:

6.0,

voc

deve

adicionar

parmetro

#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, verifique a existencia de comandos de inicializao do MySQL em autoexec.ncf, e edite ou delete-os se necessrio.

2.2. Detalhes Gerais de Instalao


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

2.2.2. Verificando a Integridade do Pacote Usando MD5 Checksums ou GnuPG


Depois de fazer o download do pacote MySQL que serve s suas necessidades e antes de tentar instal-lo, voc deve ter certeza de que ele esta intacto e no foi manipulado. A MySQL AB oferece dois tipos de verificao de integridade: MD5 checksums e assinaturas criptografadas usando GnuPG, o GNU Privacy Guard. Verificando o MD5 Checksum Depois de fazer o download do pacote, voc deve verificar se o MD5 checksum corresponde a aquele fornecido na pgina de download do MySQL. Cada pacote tem um checksum individual, que voc pode verificar com o seguinte comando: 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 GNU Text Utilities, que est disponvel para uma grande faixa de plataformas. Voc pode fazer o download do cdigo fonte em http://www.gnu.org/software/textutils/. Se voc tiver o OpenSSL instalado, voc tambm pode usar o comando openssl md5 <pacote>. Uma implementao do comando md5 para DOS/Windows est disponvel em 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 verificar se o resultado do checksum corresponde a aquele impresso no pgina de download logo abaixo do respectivo pacote.

68

Instalao do MySQL

A maioria do sites mirrors tambm oferecem um arquivo chamado MD5SUMS, que tambm inclui o MD5 checksums para todos os arquivos includos no diretrio Downloads. Note no entanto que muito fcil de modificar este arquivo e ele no um mtodo muito confivel. Caso esteja em dvida, voc deve consultar diferentes sites mirroers e comparar os resultados. Verificao de Assinatura Usando GnuPG Um mtodo de verificao de integridade de um pacote mais confivel o uso de assinaturas 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 OpenPGP/GnuPG e como obter e instalar o GnuPG em seus sistema. A maioria das distribuies de Linux j vm com o GnuPG instalado por padro. A partir do MySQL 4.0.10 (Fevereiro de 2003), a MySQL AB comeou a assinar o seus pacotes de download com GnuPG. Assinaturas criptografadas so um mtodo bem mais confivel de verificao da integridade e autenticidade de um arquivo. Para verificar a assinatura de um pacote especfico, voc primeiro precisa obtter uma cpia da chave pblica GPG da MySQL AB (<build@mysql.com>). Voc tambm pode cort-la e col-la diretamente daqui ou obt-la em http://www.keyserver.net/. Key ID: pub 1024D/5072E1F5 2003-02-03 MySQL Package signing key (www.mysql.com) <build@mysql.com> Fingerprint: A4A9 4068 76FC BD3C 4567 70C8 8C71 8D3B 5072 E1F5 Public Key (ASCII-armored): -----BEGIN PGP PUBLIC KEY BLOCK----Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org mQGiBD4+owwRBAC14GIfUfCyEDSIePvEW3SAFUdJBtoQHH/nJKZyQT7h9bPlUWC3 RODjQReyCITRrdwyrKUGku2FmeVGwn2u2WmDMNABLnpprWPkBdCk96+OmSLN9brZ fw2vOUgCmYv2hW0hyDHuvYlQA/BThQoADgj8AW6/0Lo7V1W9/8VuHP0gQwCgvzV3 BqOxRznNCRCRxAuAuVztHRcEAJooQK1+iSiunZMYD1WufeXfshc57S/+yeJkegNW hxwR9pRWVArNYJdDRT+rf2RUe3vpquKNQU/hnEIUHJRQqYHo8gTxvxXNQc7fJYLV K2HtkrPbP72vwsEKMYhhr0eKCbtLGfls9krjJ6sBgACyP/Vb7hiPwxh6rDZ7ITnE kYpXBACmWpP8NJTkamEnPCia2ZoOHODANwpUkP43I7jsDmgtobZX9qnrAXw+uNDI QJEXM6FSbi0LLtZciNlYsafwAPEOMDKpMqAK6IyisNtPvaLd8lH0bPAnWqcyefep rv0sxxqUEMcM3o7wwgfN83POkDasDbs3pjwPhxvhz6//62zQJ7Q7TXlTUUwgUGFj 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. Veja a documentao de GPG para mais informaes de como trabalhar com chaves pblicas. 69

Instalao do MySQL

Depois de fazer o download e importar a chave publica criada, faa o download do pacote MySQL desejado e da assinatura correspondente, que tambm est disponvel na pgina de download. A assinatura tem a extenso .asc. Por exemplo, a assinatura de mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz seria mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz.asc. Tenha certeza que ambos os arquivos esto armazenados no mesmo diretrio e ento execute o seguinte comando para verificar 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. Verificando Assinatura Usando RPM Para pacotes RPM, no h assinaturas separadas - pacotes RPM atualmente tm uma assinatura GPG includa e MD5 checksum. Voc pode verific-los executando o seguinte comando: 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: GPG#5072e1f5) (mesmo se voc a importou para detro de sua pasta de chaves publicas GPG), voc precisa import-las para dentro de sua pasta de chaves RPM primeiro. RPM 4.1 no utiliza mais ias suas pastas de chaves GPG (e o prprio GPG), mas mantm sua prpria pasta de chaves (porque ele um aplicativo do sistema e a pasta de chaves pblicas do GPG um arquivo especfico do usurio). Para importar a chave pblica do MySQL em uma pasta de chaves RPM, use os seguintes comandos: shell> rpm --import <pubkey> Exemplo: shell> rpm --import mysql_pubkey.asc Caso voc note que as assinaturas MD5 checksum ou GPG no coincidem, tente primeiro fazer o download do pacote respectivo mais uma vez, talvez de outro site mirror. Se voc no obter sucesso na verificao da integridade do pacote repetidas vezes, notifique-nos sobre tais incidentes incluindo o nome completo do pacote e o site que voc tem utilizado para 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 possvel 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 mesmos usamos e desenvolvemos o software primeiramente no Linux (SuSE e red Hat), FreeBSD e Sun Solaris (Verses 8 e 9). Perceba que para alguns sistemas operacionais, o suporte nativo a thread funciona somente nas ltimas verses. O MySQL compila com sucesso nas seguintes combinaes de sistema operacional/paco70

Instalao do MySQL

te de thread: AIX 4.x com threads nativas. See Seco 2.6.6.4, Notas IBM-AIX. Amiga. BSDI 2.x com o pacote includo MIT-pthreads. See Seco 2.6.4.5, Notas BSDI Verso 2.x. BSDI 3.0, 3.1 e 4.x com threads nativas. See Seco 2.6.4.5, Notas BSDI Verso 2.x. SCO OpenServer with a recent port of the FSU Pthreads package. See Seco 2.6.6.9, Notas SCO. SCO UnixWare 7.0.1. See Seco 2.6.6.10, Notas SCO Unixware Version 7.0. DEC Unix 4.x com threads nativas. See Seco 2.6.6.6, Notas Alpha-DEC-UNIX (Tru64). FreeBSD 2.x com o pacote includo MIT-pthreads. See Seco 2.6.4.1, Notas FreeBSD. FreeBSD 3.x e 4.x com threads nativas. See Seco 2.6.4.1, Notas FreeBSD. FreeBSD 4.x com Linuxthreads. See Seco 2.6.4.1, Notas FreeBSD. HP-UX 10.20 com o pacote includo MIT-pthreads ou DCE threads. See Seco 2.6.6.2, Notas HP-UX Verso 10.20. HP-UX 11.x com as threads nativas. See Seco 2.6.6.3, Notas HP-UX Verso 11.x. Linux 2.0+ com LinuxThreads 0.7.1+ ou glibc 2.0.7+. See Seco 2.6.2, Notas Linux (Todas as verses). Mac OS X Server. See Seco 2.6.5, Notas Mac OS X. NetBSD 1.3/1.4 Intel e NetBSD 1.3 Alpha (Necessita GNU make). See Seco 2.6.4.2, Notas NetBSD. Novell NetWare 6.0. See Seco 2.6.8, Notas Novell NetWare. OpenBSD > 2.5 com threads nativas. OpenBSD < 2.5 com o pacote includo MIT-pthreads . See Seco 2.6.4.3, Notas OpenBSD. OS/2 Warp 3, FixPack 29 e OS/2 Warp 4, FixPack 4. See Seco 2.6.7, Notas OS/2. SGI Irix 6.x com threads nativas. See Seco 2.6.6.8, Notas SGI Irix. Solaris 2.5 e superior com threads nativas nas plataformas SPARC e x86. See Seco 2.6.3, Notas Solaris. SunOS 4.x com o pacote includo MIT-pthreads. See Seco 2.6.3, Notas Solaris. Tru64 Unix Windows 9x, Me, NT, 2000 e XP. See Seco 2.6.1, Notas Windows.

Perceba que nem todas as plataformas so apropriadas para executar o MySQL. Os seguintes fatores determinam se uma certa plataforma apropriada para uma misso crtica pesada: Estabilidade geral da biblioteca thread. Uma plataforma pode ter excelente reputao, entretanto, se a biblioteca thread instvel no cdigo que usado pelo MySQL, mesmo se todo o resto for perfeito, o MySQL ir ser to estvel quanto a biblioteca thread. A habilidade do kernel e/ou a biblioteca thread tirar vantagem do SMP em sistemas multi71

Instalao do MySQL

processados. Em outras palavras, quando um proceesso cria uma thread, deve ser possvel para aquela thread executar em uma CPU diferente que o processo original. A habilidade do kernel e/ou a biblioteca thread executar vrias threads que adiquire/libera um bloqueio mutex sobre uma pequena regio crtica frequentemente sem trocas de contexto excessivos. Em outras palavras, se a implementao de pthread_mutex_lock() requisitar a CPU muito rapidamente, isto ir afetar o MySQL tremendamente. Se esse detalhe no estiver sendo cuidado, adicionar CPUs extras podem deixar o MySQL mais lento. Estabilidade e performance geral do sistema de arquivos. Habilidade do sistema de arquivos em lidar com arquivos grandes de forma eficiente, se suas tabelas forem grandes. Nosso nvel de experincia aqui na MySQL AB com a plataforma. Se ns conhecemos bem uma plataforma, introduzimos otimizaes/correoes especficas para ela habilitadas na hora da compilao. Ns tambm podemos fornecer conselhos sobre como configurar seu sistema otimizadamente para o MySQL. O volume de testes feitos internamente de configuraes similares. O nmero de usurios que tem executado o MySQL com sucesso naquela plataforma em configuraes similares. Se esse nmero for alto, as chances de se ter alguma surpresa especfica da plataforma fica muito menor.

Baseado nos critrios acima, as melhores plataformas para a execuo do MySQL at este ponto so o x86 com SuSe Linux 8.2, kernel 2.4 e ReiserFS (ou qualquer distribuio Linux 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 melhorando. Ns tambm acreditamos que em certo ponto iremos estar aptos para incluir todas as outras plataformas em que o MySQL compila e executa, mas no to bem e com o mesmo nvel de estabilidade e performance, na categoria superior. Isto necessitar de algum esforo da nossa parte em cooperao com os desenvolvedores dos componentes do Sistema Operacional/Biblioteca que o MySQL depende. Se voc tiver interesse em melhorar algum de nossos componentes, est em uma posio para influenciar seu desenvolvimento, e precisa de instrues mais detalhadas sobre o que o MySQL necessita para uma melhor execuo, envie um e-mail para lista de email ``insternals'' do MySQL. See Seco 1.7.1.1, As Listas de Discusso do MySQL. Por favor, perceba que a comparao acima no para dizer que um SO melhor ou pior que o outro em geral. Ns estamos falando sobre a escolha de um SO para um propsito dedicado: executar o MySQL, e comparamos as plataformas levando isto em considerao. Desta forma, o resultado desta comparao seria diferente se ns inclussemos mais detalhes. E em alguns casos, a razo de um SO ser melhor que o outro pode ser simplesmente porque colocamos mais esforo nos testes e otimizao para aquela plataforma em particular. Estamos apenas colocando nossas observaes para ajudlo na deciso de qual plataforma usar o MySQL na sua configurao.

2.2.4. Qual verso do MySQL deve ser usada


A primeira deciso a ser feita se voc deve usar a ltima verso de desenvolvimento ou a ltima verso estvel: Normalmente, se voc estiver usando o MySQL pela primeira vez ou tentando port-lo para algum sistema em que no exista distribuio binria, recomendamos o uso da verso estvel (atualmente Verso 5.0.6-beta). Repare que todos os lanamentos do MySQL so conferidos com os testes comparativos de performance e um conjunto extenso de testes antes de cada lanamento. Seno, caso voc esteja trabalhando com um antigo sistema e quiser atualiz-lo, mas no que correr o risco com uma atualizao sem correes, voc deve faze-lo do mesmo ramo que voc est usando (onde aenas o ltimo nmero da verso mais novo que o seu). Ns temos tentado 72

Instalao do MySQL

corrigir somente erros fatais e torn-los menores, com alteraes relativamente seguras para aquela verso. A segunda deciso a ser feita se voc deseja usar uma distribuio fonte ou binria. Na maioria dos casos provavelmente voc dever usar a distribuio binria, se alguma existir para sua plataforma, ser normalmente muito mais fcil para instalar do que a distribuio em cdigo fonte. Nos seguites casos voc provavelmente ser mais bem servido com uma instalao baseada em cdigo fonte: Se voc desejar instalar o MySQL em algum lugar expecfico. (O padro das distribuies binrias estar``pronto para rodar'' em qualquer lugar, mas talvez voc deseje ainda mais flexibilidade). Para estar apto e satisfazer diferentes requisies dos usurios, estaremos fornecendo duas verses binrias diferentes; Uma compilada com os manipuladores de tabelas no transacionais (um binrio rpido e pequeno) e um configurado com as mais importantes opes extendidas como tabelas transacionais. Ambas verses so compiladas da mesma distribuio fonte. Todos clientes MySQL nativos pode conectar com ambas verses do MySQL. A distribuio binria extendida marcada com o sufixo -max e configurada com as mesmas opes de mysqld-max. See Seco 4.8.5, mysqld-max, om servidor mysqld extendido. Se voc deseja usar o RPM MySQL-Max, primeiramente voc deve instalar o RPM MySQLserver padro. Se voc deseja configurar mysqld com alguns recursos extras que NO esto nas distribuies binrias. Segue abaixo a lista das opes extras mais comuns que voc pode querer usar: --with-innodb --with-berkeley-db (padro para o MySQL 4.0 e seguintes) --with-raid (no disponvel para todas as plataformas) --with-libwrap --with-named-z-lib (Isto feito para alguns dos binrios) --with-debug[=full]

A distribuio binria padro normalmente compilada com suporte para todos conjuntos de caracteres e deve funcionar em uma variedade de processadores para a mesma famlia do processador. Se voc precisar de um servidor MySQL mais rpido voc pode querer recompil-lo com suporte para somente o conjunto de caracteres que voc precisa, usar um compilador melhor (como pgcc) ou usar opes de compiladores para usar otimizaes para seu processador.

Se voc encontrar um erro e relat-lo para o time de desenvolvimento do MySQL voc provavelmente receber um patch que ser necessrio aplic-lo para a distribuio fonte para ter o bug corrigido. Se voc deseja ler (e/ou modificar) o cdigo C e C++ que o MySQL, voc pode obter uma distribuio fonte. O cdigo fonte sempre o manual final. Distribuies fontes tambm contem mais testes e exemplos que as distribuies binrias.

O esquema de nomes do MySQL usa nmeros de verses que consistem de tres nmeros e um sufixo. Por exemplo, um nome de lanamento como mysql-4.1.0-alpha interpretado da seguinte maneira:

73

Instalao do MySQL

O primeiro nmero (4) a verso principal e tambm descreve o formato dos arquivos. Todas releases da Verso 4 tem o mesmo formato de arquivo. O segundo nmero (1) o nvel da distribuio. O terceiro nmero (0 o nmero da verso do nvel de distribuio. Este incrementado para cada nova distribuio. Normalmente voc desejar a ltima verso para o nvel de publicao que tiver escolhido. O sufixo (alpha) indica o nvel de estabilidade da verso. Os possveis sufixo so: alpha indica que a verso contm grandes sees de novos cdigos que no foram 100% testados. Bugs conhecidos (normalmente no tem nenhum) devem estar documentados na seo News. See Apndice D, Histrico de Alteraes do MySQL. Existem tambm novos comandos e extenses na maioria das publicaes alpha. Desenvolvimento ativo que podem envolver maiores alteraes no cdigo pode ocorrer numa verso alpha, mas tudo ser testado antes de fazer a publicao. No podem existir erros conhecidos em nenhuma publicao do MySQL. beta significa que todo o novo cdigo foi testado. No sero adicionados novos recursos que podem causar algum tipo de corrompimento. No deve existir bugs conhecidos. Uma alterao de verso de alpha para beta ocorre quando no existir nenhum relato de erro fatal com uma verso alpha por pelo menos um ms e no planejarmos adicionar nenhum recurso que pode deixar algum antigo comando menos confivel. gamma o beta que j tem sido usado a algum tempo e parece funcionar bem. Apenas pequenas correes so adicionadas. Isto o que muitas empresas chamam de release. Se no existir um sufixo, significa que esta verso j est sendo executada h algum tempo em diferentes locais sem relatos de erros alm dos especficos de certas plataformas. Somente correes de erros crticos so adicionados ao release. Isto o que chamamos de uma distribuio estvel.

No processo de desenvolvimento do MySQL, vrias verses coexistem e esto em um estgio diferente. Naturalmente, correes de erros relevantes de uma srie anterior so propagados. Para a antiga srie 3.23 estvel/de produo, novas verses s so liberadas para erros crticos. A srie atual (4.0) de qualidade estvel/produo. Nenhum novo recurso que possa influenciar a estabilidade do cdigo adicionado. No ramo alpha 4.1 principal, novos recursos so adicionados. Fontes e binrios esto disponveis para uso e teste em sistemas de desenvolvimento. O ramo de desenvolvimento 5.0 s est disponvel para a rvore do BitKeeper.

Todas as verses do MySQL funcionam sobre nossos testes padres e comparativos para garantir que eles so relativamente seguros para o uso. Como os testes padres so extendidos 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: Um pacote de testes interna Faz parte de um sistema de produo para um cliente. Ela tem diversas tabelas com centenas de megabytes de dados. O diretrio mysql-test contm um conjunto extensivo de casos de teste. Ns executamos estes testes para cada servidor binrio.

74

Instalao do MySQL

O pacote de comparativos da MySQL Este executa uma srie de consultas comuns. tambm um teste para ver se o ltimo conjunto de otimizaes fez o cdigo mais rpido. See Seco 5.1.4, O Pacote de Benchmark do MySQL.

O teste crash-me Este tenta determinar quais recursos o banco de dados suporta e quais so suas capacidades e limitaes. See Seco 5.1.4, O Pacote de Benchmark do MySQL.

Outro teste que ns usamos a verso do MySQL mais nova em nosso ambiente de produo interna, em pelo menos uma mquina. Ns temos mais de 100 gigabytes de dados com que trabalhar.

2.2.5. Layouts de Instalao


Esta seo descreve o layout padro dos diretrios criados pela instalo das distribuies binria e fonte. Uma distribuio binria instalada descompactando-a no local de instalao de sua escolha (tipicamente /usr/local/mysql) e cria os seguintes diretrios nesses locais: Diretrio bin data docs include lib scripts share/mysql sql-bench Contedo do diretrio Programas clientes e o servidor mysqld Arquivos Log, bancos de dados Documentao, Log de alteraes Arquivos de cabealho (headers) Bibliotecas mysql_install_db Arquivos de mensagem de erro Benchmarks - testes comparativos

Uma distribuio baseada em cdigo fonte instalada depois de voc configur-la e compil-la. Por padro, a instalao copia os arquivos em /usr/local, nos seguintes subdiretrios: Diretrio bin include/mysql info lib/mysql libexec share/mysql sql-bench var Contedo do diretrio Programas clientes e scripts Arquivos de cabealho (headers) Documentao no formato Info Bibliotecas O servidor mysqld Arquivos com mensagens de erros Benchmarks e o teste crash-me Bancos de dados e arquivos log

Dentro de um diretrio de instalao, o layout de uma instalao baseada em fontes diferencia de uma instalao binria nas seguintes formas: The mysqld server is installed in the libexec directory rather than in the bin directory. The data directory is var rather than data.

75

Instalao do MySQL

mysql_install_db is installed in the /usr/local/bin directory rather than in / usr/local/mysql/scripts. The header file and library directories are include/mysql and lib/mysql rather than include and lib.

You can create your own binary installation from a compiled source distribution by executing the script scripts/make_binary_distribution.

2.2.6. Como e quando as atualizaes so lanadas?


O MySQL est evoluindo muito rapidamente na MySQL AB e ns queremos compartilhar isto com outros usurios MySQL. Sempre que temos alguns recursos teis que outros acham necessio, tentamos fazer um release. Tambm tentamos ajudar usurios que solicitam recursos que so de fcil implementao. Tomamos notas do que nossos usurios licenciados gostariam de ter,especialmente do que nossos clientes com suporte extendido desejam e tentamos ajud-los. No existe uma real necessidade para baixar uma nova release. A seo News ir dizer se a nova verso tem alguma coisa que voc precisa. See Apndice D, Histrico de Alteraes do MySQL. Usamos a seguinte poltica quando estamos atualizando o MySQL: Para cada pequena atualizao, o ltimo nmero na verso incrementado. Quando tiver um maior nmero de novos recursos ou menor incompatibilidade com verses antigas, o segundo nmero na verso incrementado. Quando o formato de arquivo altera, o primeiro nmero aumentado. Verses estveis testadas aparecem na mdia de uma a duas vezes por ano, mas se pequenos bugs so encontrados, uma verso ser lanada apenas com as correes dos erros. Releases funcionais aparecem na mdia a cada 4-8 semanas. Distribuies binrias para algumas plataformas ser feita por ns somente para releases mais importantes. Outras pessoas podem fazer distribuies binrias para outros sistemas mas provavelmente com menos frequencia. Ns normalmente disponibilizamos os patches logo que localizamos e corrigimos pequenos bugs. Eles normalmente so imediatamente disponibilizados em nosso repositrio publico do BitKeeper. Eles sero includos na prxima distribuio. Para bugs no crticos, mas irritantes, disponibilizamos patches se eles so enviados para ns. De qualquer forma, iremos combinar vrios deles em um patch maior. Se existitr, por algum motivo, um bug fatal numa verso criaremos uma nova release o mais cedo possvel. Gostaramos que outras empresas fizessem isto tambm.

A verso estvel atual a 3.23; ns j mudamos o desenvolvimento em atividade para a verso 4.0. Bugs contiuaro a ser corrigidos na verso estvel. No acreditamos em um congelamento completo, pois isto abandona a correes de bugs e coisas que ``devem ser feitas.'' ``Alguma coisa congelada'' significa que talvez possamos adicionar pequenas coisas que ``com certeza no afetar nada que j esteja funcionando.'' 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 semanas e que no tenham sido sustituda por uma nova verso. See Seco 2.2.4, Qual verso do MySQL deve ser usada.

76

Instalao do MySQL

2.2.7. Filosofia das Distribuies - Nenhum Bug Conhecidos nas Distribuies


Colocamos muito tempo e esforo em tornar nossas distribuies livres de erros. Pelo nosso conhecimento, no liberamos uma nica verso do MySSQL com qualquer erro conhecido 'fatal'. Um erro fatal algo que faz o MySQL falhar com o uso normal, traz respostas erradas para consultas normais ou tem um problema de segurana. Ns temos documentados todos os problemas conhecidos, bugs e assuntos que so dependentes das decises de projeto. See Seco 1.8.6, Erros Conhecidos e Deficincias de Projetos no MySQL. Nosso objeto corrigir tudo que possvel, mas sem correr o risco de tornarmos uma verso menos estvel. Em certos casos, isto significa que podemos corrigir um problema na(s) verso(es) de desenvolvimento, mas no o corrigirmos na verso estvel (produo). Naturalmente, documentamos tais problemas para que o usurios esteja ciente. Aqui est um descrio de como nosso processo de contruo funciona: Monitoramos erros de nossa lista de suporte ao cliente, a lista de email externa do MySQL e o banco de dados de bugs em http://bugs.mysql.com/. Todos os erros relatados em verses usadas so inseridos nio banco de dados de bugs. Quando corrigimos um erro, sempre tentamos fazer um caso de teste para ele e inclu-lo em nosso sistema de teste para assegurar que o erro nunca retornar. (Cerca de 90% de todos os erros corrigidos tm um caso de teste.) Tambm criamos casos de teste para todos os novos recursos adicionados ao MySQL. Antes de comearmos a fazer uma nova distribuio do MySQL, asseguramos que todos os erros repetitveis relatados para a verso do MySQL (3.23.x, 4.0.x, etc) esto corrigidos. Se algo for impossvel de corrigir (devido a alguma deciso de projeto interno no MySQL), documentaremos isto no manual. See Seco 1.8.6, Erros Conhecidos e Deficincias de Projetos no MySQL. Ns fazemos uma construo para todas as plataformas para as quais suportamos binrios (mais de 15 plataformas) e executamos nosso pacote de teste e benchmarks para todas elas. No publicaremos um binrio para uma plataforma na qual os testes do pacote de benchmarks falharam. Se for um erro geral na fonte, o corrigimos e fazemos as contrues mais os teste em todos os sistemas novamente. Se ns, durante a o porcesso de construo e teste (que leva de 2 a 3 dias) recebermos um relatrio sobre um erro fatal (por exemplo, um que cause um core dump), o corrigiremos e reiniciaremos o processo de construo). Depois de publicarmos os binrios em http://www.mysql.com/, enviamos um email de anncio nas listas de email mysql e announce. See Seco 1.7.1.1, As Listas de Discusso do MySQL. A mensagem de anncio contm uma lista de todas as alteraes da distribuio e qualquer problema conhecido com ela. (A seo 'problemas conhecidos' na notas das distribuies s tem sido necessria em algumas da distribuies.) Para darmos acesso rapidamente aos nossos usurios dos ltimos recursos do MySQL, fazemos uma nova distribuio do MySQL a cada 4-8 semanas. Instantneos do cdigo finte so contrudos diariamente e esto disponveios em http://downloads.mysql.com/snapshots.php. Se, depois da distribuio estar pronta, recebermos qualquer relatrio que houve (depois de tudo) qualquer coisa criticamente errada com a construo em uma plataforma especfica, corrigiremo-na imediatamente e liberaremos um nova distribuio 'a' para aquela plataforma. Graas aos nosso grande base de usurios, problemas so encontrados rapidamente.

77

Instalao do MySQL

Nosso registro para boas distribuies feitas muito boa. Nas ltimas 150 distribuies, tivemos que fazer uma nova contruo para menos de 10 distribuies (em 3 destes casos, o erro era uma biblioteca glibc com problema em uma de nossas mquinas que levamos um longo tempo para encontrar.

2.2.8. Binrios MySQL compilados pela MySQL AB


Como um servio, ns na MySQL AB fornecemos um conjunto de distribuies binrias do MySQL que so compiladas no nosso site ou em sites onde os clientes cordialmente nos do acesso as suas mquinas. Em adio aos binrios forncedios em formatos de pacotes especficos da plataforma (veja Seco 2.1, Instalao rpida padro do MySQL), oferecemos distribuies binrios para outras plataformas atravs de arquivos tar compactados (.tar.gz). Estas distribuies so geradas usando o script Build-tools/Do-compile que compila o cdigo fonte e cria o arquivo binrio em tar.gz usando scripts/make_binary_distribution. Estes binrios so configurados e construdos com os seguintes compiladores e opes. Binrios construdos 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 pu=pentiumpro -felide-constructors" ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile -enable-assembler --disable-shared -with-client-ldflags=-all-static -with-mysqld-ldflags=-all-static Linux 2.4.xx Intel Itanium 2 com ecc (Intel C++ Itanium Compiler 7.0) CC=ecc CFLAGS="-O2 -tpp2 -ip -nolib_inline" CXX=ecc CXXFLAGS="-O2 -tpp2 -ip -nolib_inline" ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile Linux 2.4.xx Intel Itanium com ecc (Intel C++ Itanium Compiler 7.0) CC=ecc CFLAGS=-tpp1 CXX=ecc CXXFLAGS=-tpp1 ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile Linux 2.4.xx alpha com ccc (Compaq C V6.2-505 / Compaq C++ V6.3-006) CC=ccc CFLAGS="-fast -arch generic" CXX=cxx CXXFLAGS="-fast arch generic -noexceptions -nortti" ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile -with-mysqld-ldflags=-non_shared -with-client-ldflags=-non_shared --disable-shared 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 78 -mc-

Instalao do MySQL

-with-mysqld-ldflags=-all-static Linux 2.4.xx x86_64 (AMD64) com gcc 3.2.1 CXX=gcc ./configure --prefix=/usr/local/mysql -with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --disable-shared Sun Solaris 8 x86 com gcc 3.2.3 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data -libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile -disable-shared --with-innodb Sun Solaris 8 sparc com gcc 3.2 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --enable-assembler --with-named-z-libs=no -with-named-curses-libs=-lcurses --disable-shared Sun Solaris 8 sparc 64bit com gcc 3.2 CC=gcc CFLAGS="-O3 -m64 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -m64 -fno-omit-frame-pointer -felide-constructors fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --enable-assembler --with-named-z-libs=no -with-named-curses-libs=-lcurses --disable-shared Sun Solaris 9 sparc com gcc 2.95.3 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --enable-assembler -with-named-curses-libs=-lcurses --disable-shared Sun Solaris 9 sparc com cc-5.0 (Sun Forte 5.0) CC=cc-5.0 CXX=CC ASFLAGS="-xarch=v9" CFLAGS="-Xa -xstrconst -mt -D_FORTEC_ -xarch=v9" CXXFLAGS="-noex -mt -D_FORTEC_ -xarch=v9" ./configure --prefix=/usr/local/mysql -with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --enable-assembler --with-named-z-libs=no -enable-thread-safe-client --disable-shared IBM AIX 4.3.2 ppc com gcc 3.2.3 CFLAGS="-O2 -mcpu=powerpc -Wa,-many " CXX=gcc CXXFLAGS="-O2 mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions fno-rtti" ./configure --prefix=/usr/local/mysql -with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --with-named-z-libs=no --disable-shared IBM AIX 4.3.3 ppc com xlC_r (IBM Visual Age C/C++ 6.0) 79 -

Instalao do MySQL

CC=xlc_r CFLAGS="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192" CXX=xlC_r CXXFLAGS ="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192" ./configure --prefix=/usr/local/mysql -localstatedir=/usr/local/mysql/data -libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile -with-named-z-libs=no --disable-shared --with-innodb IBM AIX 5.1.0 ppc com gcc 3.3 CFLAGS="-O2 -mcpu=powerpc -Wa,-many" CXX=gcc CXXFLAGS="-O2 mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions fno-rtti" ./configure --prefix=/usr/local/mysql -with-extra-charsets=complex --with-server-suffix="-pro" -enable-thread-safe-client --enable-local-infile -with-named-z-libs=no --disable-shared HP-UX 10.20 pa-risc1.1 com gcc 3.1 CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc CXXFLAGS="-DHPUX -I/opt/dce /include -felide-constructors fno-exceptions -fno-rtti -O3 -fPIC" ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile --with-pthread --with-named-thread-libs=-ldce --with-lib-ccflags=-fPIC -disable-shared HP-UX 11.11 pa-risc2.0 64 bit com aCC (HP ANSI C++ B3910B A.03.33) CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile -disable-shared HP-UX 11.11 pa-risc2.0 32bit com aCC (HP ANSI C++ B3910B A.03.33) CC=cc CXX=aCC CFLAGS="+DAportable" CXXFLAGS="+DAportable" ./configure --prefix=/usr/local/mysql -localstatedir=/usr/local/mysql/data -libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile -disable-shared --with-innodb Apple Mac OS X 10.2 powerpc com gcc 3.1 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --disable-shared FreeBSD 4.7 i386 com gcc 2.95.4 CFLAGS=-DHAVE_BROKEN_REALPATH ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile -enable-assembler --with-named-z-libs=not-used --disable-shared QNX Neutrino 6.2.1 i386 with gcc 2.95.3qnx-nto 20010315 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors 80 -

Instalao do MySQL

fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --disable-shared Os seguintes binrios so contrudos em sistemas de terceiros gentilmente cedidos para a MySQL AB pou outros usurios. Pou favor, note que eles s so fornecidos como cortesia. Uma vez que a MySQL AB no tem total controle sobre estes sistemas, ns podemos fornecer apenas suporte limitado para os binrios construdos nestes sistemas. SCO Unix 3.2v5.0.6 i386 com gcc 2.95.3 CFLAGS="-O3 -mpentium" LDFLAGS=-static CXX=gcc CXXFLAGS="-O3 mpentium -felide-constructors" ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile -with-named-z-libs=no --enable-thread-safe-client -disable-shared SCO OpenUnix 8.0.0 i386 com CC 3.2 CC=cc CFLAGS="-O" CXX=CC ./configure --prefix=/usr/local/mysql -with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --with-named-z-libs=no -enable-thread-safe-client --disable-shared Compaq Tru64 OSF/1 V5.1 732 alpha com cc/cxx (Compaq C V6.3-029i / DIGITAL C++ V6.1-027) CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast inline speed -speculate all" CXX="cxx -pthread" CXXFLAGS="-O4 ansi_alias -fast -inline speed -speculate all -noexceptions nortti" ./configure --prefix=/usr/local/mysql -with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --with-prefix=/usr/local/mysql -with-named-thread-libs="-lpthread -lmach -lexc -lc" -disable-shared --with-mysqld-ldflags=-all-static SGI Irix 6.5 IP32 com gcc 3.0.1 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXXFLAGS="-O3 fno-omit-frame-pointer -felide-constructors -fno-exceptions fno-rtti" ./configure --prefix=/usr/local/mysql -with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --disable-shared 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 costumava fornecer no passado. Estes binrios no so mais atualizados, mas as opes de compilao so mantidas aqui com o propsito de referncia. Linux 2.2.xx sparc com egcs 1.1.2 CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" 81 CXX=gcc CXX-

Instalao do MySQL

FLAGS="-O3 -fno-omit-frame-pointer -felide-constructors fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --enable-assembler --disable-shared Linux 2.2.x com x686 com gcc 2.95.2 CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro felide-constructors -fno-exceptions -fno-rtti" ./configure -prefix=/usr/local/mysql --enable-assembler -with-mysqld-ldflags=-all-static --disable-shared -with-extra-charsets=complex SunOS 4.1.4 2 sun4c com gcc 2.7.2.1 CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" ./configure -prefix=/usr/local/mysql --disable-shared -with-extra-charsets=complex --enable-assembler SunOS 5.5.1 (e acima) sun4u com egcs 1.0.3a ou 2.90.27 ou gcc 2.95.2 e mais novo CC=gcc CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex -enable-assembler SunOS 5.6 i86pc com gcc 2.8.1 CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure -prefix=/usr/local/mysql --with-low-memory -with-extra-charsets=complex BSDI BSD/OS 3.1 i386 com gcc 2.7.2.1 CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex BSDI BSD/OS 2.1 i386 com gcc 2.7.2 CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex AIX 2 4 com gcc 2.7.2.2 CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex -

Qualquer que tenha mais opes otimizadas para qualquer das configuraes listadas acima pode sempre envi-los para a lista de email ``internals'' do MySQL. See Seco 1.7.1.1, As Listas de Discusso do MySQL. Distribuies RPM que anteceda o MySQL verso 3.22 so contribuies dos usurios. Os RPMs gerados por ns da MySQL AB s comearam a ser fornecidos a partir da verso 3.22 do MySQL. Se voc deseja compilar uma verso para depurao do MySQL, voc deve adicionar -with-debug ou --with-debug=full para as linhas de configurao acima e remover qualquer opo -fomit-frame-pointer. Para distribuies do Windows, por favor, veja Seco 2.1.1, Instalando o MySQL no Windows.

2.2.9. Instalando uma Distribuio Binria do MySQL


82

Instalao do MySQL

Este captulo cobre a instalao da distribuio binria do MySQL (.tar.gz Archives) para vrias plataformas (veja MySQL binaries para uma lista detalhada). Em adio a estes pacotes genricos, tambm oferecemos binrios em formatos de pacote especficos da plataforma para plataformas selecionadas. Veja Seco 2.1, Instalao rpida padro do MySQL para mais informaes sobre como\ intal-los. As distribuies genricas do MySQL esto empacotados com arquivos GNU tar com compactao gzip (.tar.gz). Voc precisa das seguintes ferramentas para instalar um distribuio binria do MySQL: GNU gunzip para descompactar a distribuio. Um tar razovel para descompactar a distribuio. Sabemos que o GNU tar funciona. Algumas implementaes tar que vm pr-instaladas como o sistema operacional (ex. Sun tar) possuem problemas (com nome de arquivos grandes, por exemplo) Neste caso, voc deve instalar o GNU tar primeiro.

Se voc tiver problemas, sempre use mysqlbug ao enviar dvidas para a lista de email do MySQL. Mesmo se o problema no for um bug, mysqlbug colhe informaes do sistema que ajudaro os outros a solucionar o seu problema. Se no usar mysqlbug, voc ter diminuda a probabilidade de conseguir a soluo do seu problema. Voc encontrar o mysqlbug no diretrio bin depois de descompactar a distribuio. See Seco 1.7.1.3, Como relatar erros ou problemas. Os comando bsicos que voc deve executar para instalar e usar uma distribuio binria do MySQL so: shell> shell> shell> shell> shell> shell> shell> shell> shell> shell> shell> groupadd mysql useradd -g mysql mysql cd /usr/local gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf ln -s full-path-to-mysql-VERSION-OS mysql cd mysql scripts/mysql_install_db chown -R root . chown -R mysql data chgrp -R mysql . bin/mysqld_safe --user=mysql &

Se a sua verso do MySQL mais antiga que a 4.0, substitua bin/safe_mysqld por bin/ mysqld_safe no comando final. Voc pode adicionar novos usurios usando o script bin/mysql_setpermission se voc instalar os mdulos Perl DBI e DBD-mysql. Uma descrio mais detalhada apresentada a seguir. Para instalar uma distribuio binria, siga estes passos, ento proceda com a Seco 2.4, Configuraes e Testes Ps-instalao, para a configurao da ps istalao e testes: 1. Escolha o diretrio sob o qual voc deseja descompactar a distribuio e a mova para dentro dele. No exemplo a seguir, descompactamos a distribuio sob /usr/local e criamos um diretrio /usr/local/mysql dentro do qual o MySQL instalado. (As seguintes instrues, consequentemente, assumem que voc tem permisso para criar arquivos em / usr/local. Se este diretrio protegido, voc precisar realizar a instalao como root.) Obtenha um arquivo de distribuio de um dos sites listados em Seco 2.2.1, Como obter o MySQL. As distribuies binrias do MySQL so fornecidas como arquivos tar compactados e tem nomes como mysql-VERSO-SO.tar.gz, onde VERSO um nmero (por exemplo, 83

2.

Instalao do MySQL

3.21.15) e SO indica o tipo de sistema operacional para o qual a distribuio pretendida (por exemplo, pc-linux-gnu-i586). 3. Se voc ver uma distribuio binria marcada com o sufixo -max, significa que o binrio tem suporte para tabelas transacionais e outros recursos. See Seco 4.8.5, mysqld-max, om servidor mysqld extendido. Note que todos os binrios so contrudos a partir da mesma distribuio fonte do MySQL. Adicione um usurio e grupo para o mysqld ser executado: shell> groupadd mysql shell> useradd -g mysql mysql Estes comandos adicionam o grupo mysql e o usurio mysql. A sintaxe para useradd e groupadd podem diferir um pouco nas diversas verses de Unix. Eles tambmpodem ser chamado adduser e addgroup. Voc pode desejar criar o grupo e usurio com outro nome, diferente de mysql. 5. Chame o diretrio no qual se pretende fazer a instalao: shell> cd /usr/local 6. Descompacte a distribuio, que criar o diretrio de instalao. Ento crie um link simblico para aquele diretrio: shell> gunzip < /path/to/mysql-VERSO-SO.tar.gz | tar xvf shell> ln -s full-path-to-mysql-VERSO-SO mysql O primeiro comando cria um diretrio chamado mysql-VERSO-SO. O segundo comando cria um link simblico para o diretrio. Isto torna a referncia ao diretrio de instalao mais fcil, chamado como /usr/local/mysql. 7. Altere para p diretrio de instalao: shell> cd mysql Voc encontrar diversos arquivos e subdiretrios no diretrio mysql. O mais importante para propsitos de instalao so os subdiretrios bin e scripts. bin Este diretrio contm o programa cliente e o servidor. Voc deve adicionar o caminho completo deste diretrio a sua varivel de ambiente PATH e assim a sua shell encontrar o programa MySQL de forma apropriada. See Apndice F, Variveis de Ambientes do MySQL. scripts Este diretrio contm o script mysql_install_db usado para inicializar o banco de dados mysql contendo a tabela de permisses que armazenam o servidor de permisses de acesso. 8. Caso voc desejasse usar o mysqlaccess e a distribuio do MySQL est em um local diferente do padro, voc deve alterar a localizao para onde o mysqlaccess espera encontrar o cliente mysql. Edite o script bin/mysqlaccess aproximadamente na linha 18. Procure pela linha que se parece com a apresentada abaixo: $MYSQL = '/usr/local/bin/mysql'; # path to mysql executable

4.

Altere o caminho para o local onde o mysql atualmente est armazaenado em seu sistema. Se voc no fizer isto receber uma mensagem de erro Broken pipe quando executar o mysq84

Instalao do MySQL

laccess. 9. Crie as tabelas de permisso do MySQL (necessrio apenas se voc no tiver instalado 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 executa o mysql_install_db. Isto no ocorre mais. 10. Altere o proprietrio dos binrios para o root e o proprietrio do diretrio de dados para o usurio com o quel voc executar o mysqld: shell> chown -R root /usr/local/mysql/. shell> chown -R mysql /usr/local/mysql/data shell> chgrp -R mysql /usr/local/mysql/. O primeiro comando altera o atributo owner dos arquivos para o usurio root, o segundo altera o atributo owner do diretrio de dados para o usurio mysql e o terceiro altera o atributo group para o grupo mysql. 11. Se voc quiser instalar o suporte para a interface Perl DBI/DBD, veja Seco 2.7, Comentrios de Instalao do Perl. 12. Se voc desejasse que o MySQL seja iniciado automaticamente quando voc iniciar a sua mquina, voc pode copiar support-files/mysql.server para o local onde o seu sistema tem os arquivos de inicializao. Mais informaes podem ser encontradas no script support-files/mysql.server e em Seco 2.4.3, Inicializando e parando o MySQL automaticamente.. Depois de tudo estar descompactado e instalado, voc deve inicializar e testar a sua distribuio. Voc pode iniciar o servidor MySQL com o seguinte comando: shell> bin/mysqld_safe --user=mysql & Se a sua verso do MySQl for mais antiga do que a 4.0, substitua bin/safe_mysqld por bin/ mysqld_safe no comando. Agora prossiga com Seco 4.8.2, mysqld-safe, o wrapper do mysqld e See Seco 2.4, Configuraes e Testes Ps-instalao.

2.3. Instalando uma distribuio com fontes do MySQL


Antes de voc continuar com as instalaes dos fontes, confira antes se nosso binrio est disponvel para sua plataforma e se ela funcionar para voc. Ns colocamos muito esforo para ter certeza que nossos binrios so contrudos com as melhores opes possveis. Voc precisa das seguintes ferramentas para contruir e instalar o MySQL a partir do cdigo fonte: GNU gunzip para descompactar a distribuio. Um tar razovel para desempacotar a distribuio. Sabe-se que o GNU tar funciona. Algumas implementaes tar que vm pr-instaladas como o sistema operacional (ex. Sun tar) possuem problemas (com nome de arquivos grandes, por exemplo) Neste caso, voc deve instalar o GNU tar primeiro. 85

Instalao do MySQL

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 libg++ no necessria quando o gcc for usado. gcc 2.7.x tem um bug que torna impossvel 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 conseguir compilar o MySQL. gcc 2.8.1 tambm conhecido por ter problemas em 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.

Um bom programa make. GNU make sempre recomendado e algumas vezes necessrio. Se voc tiver problemas, recomendamos tentar o GNU make 3.75 ou mais novo.

Se voc estiver usando uma verso recente de gcc, recente o bastante para entender a opo fno-exceptions, MUITO IMPORTANTE que voc a use. De outra forma, voc pode compilar um binrio que quebra randomicamente. Ns tambm recomendamos que voc use felide-constructors e -fno-rtti juntas com -fno-exception. Se estiver com dvidas, faa o seguinte: 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. Se voc tiver problemas, SEMPRE USE mysqlbug quando postar questes para a lista de email do MySQL Mesmo se o problema no for um bug, mysqlbug recolhe informaes do sistema que facilitar aos outros resolverem seu problema. Por no suar mysqlbug, voc perde a vantagem de ter seu problema resolvido! Voc ir encontrar mysqlbug no diretrio scripts depois de desempacotar a distribuio. See Seco 1.7.1.3, Como relatar erros ou problemas.

2.3.1. Viso geral da instalao rpida


Os comandos bsicos que voc deve executar para instalar o MysQL a partir da distribuio fonte so: 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 bin/ mysqld_safe no comando final. Se voc deseja ter suporte para tabelas InnoDB, voc deve editar o arquivo /etc/my.cnf e remover o caractere # antes dos parmetros que iniciam com innodb_.... See Seco 4.1.2, Arquivo de Opes my.cnf. See Seco 7.5.3, Opes de Inicializao do InnoDB. Se voc iniciar de um RPM fonte, ento faa o seguinte:

86

Instalao do MySQL

shell> rpm --rebuild --clean MySQL-VERSION.src.rpm Isto ir criar um RPM binrio que voc pode instalar. Voc pode adicionar novos usurios utilizando o script bin/mysql_setpermission se voc instalar os mdulos Perl DBI e DBD-mysql. Segue uma descrio mais detalhada. Para instalar uma distribuio fonte, siga os passos a seguir, ento prossiga para Seco 2.4, Configuraes e Testes Ps-instalao, para inicializao do ps-instalao e testes: 1. 2. 3. Escolha o diretrio sobre o qual voc deseja descompactar a distribuio e v para ele. Obtenha um arquivo de distribuio de algum dos sites listados em Seco 2.2.1, Como obter o MySQL. Se voc esta interessado em usar tabelas Berkeley DB com MySQL, voc precisar obter uma verso com o patch do cdigo fonte do Berkeley DB. Por favor leia o captulo sobre tabelas Berkeley DB antes de continuar. See Seco 7.6, Tabelas BDB ou BerkeleyDB. Distribuies fontes do MySQL so fornecidas como arquivos tar compactados e tem nomes como mysql-VERSION.tar.gz, onde VERSION um nmero como 5.0.6-beta. 4. Adicione um usurio e grupo para o mysql executar assim: shell> groupadd mysql shell> useradd -g mysql mysql Estes comandos adicionam o grupo mysql e o usurio mysql. A sintaxe para useradd e groupadd podem mudar um pouco em diferentes verses de Unix. Elas podem tambm ser chamadas adduser e addgroup. Voc pode escolher outros nomes para o usurio e grupo em vez de mysql. 5. Descompacte a distribuio para o diretrio corrente: shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf Este comando cria um diretrio com o nome mysql-VERSION. 6. Mude para o diretrio da distribuio descompactada: shell> cd mysql-VERSION Note que agora voc deve configurar e construir o MySQL a partir deste diretrio raiz da distribuio. Voc no pode constru-lo em um diretrio diferente. 7. Configure o release e compile tudo: shell> ./configure --prefix=/usr/local/mysql shell> make Quando voc executar configure, voc pode desejar especificar algumas opes. Execute ./configure --help para uma lista das opes. Seco 2.3.3, Opes tpicas do configure, discute algumas das opes mais usadas. Se o configure falhar, e voc for enviar uma mensagem para lista de email do MySQL para pedir ajuda, por favor, inclua qualquer linhas de config.log que voc acha que pode ajudar a resolver o problema. Tambm inclua as ltimas linhas da sada de configure se o con87

Instalao do MySQL

figure abortar. Envie o relatrio de erros usando o script mysqlbug. See Seco 1.7.1.3, Como relatar erros ou problemas. Se a compilao falhar, veja Seco 2.3.5, Lidando com Problemas de Compilao, para uma ajuda com um varios problemas comuns. 8. Instalar tudo: shell> make install Voc deve executar este comando como root. 9. Crie as tabelas de permisses do MySQL (necessrias s se voc no tiver instalado o MySQL anteriormente): shell> scripts/mysql_install_db Note que as verses do MySQL anteriores verso 3.22.10 iniciam o servidor MySQL quando voc executa mysql_install_db. Isto no acontece mais! 10. Altere o dono dos binrios para root e do diretrio dados para o usurio que ir executar o mysqld: shell> chown -R root /usr/local/mysql shell> chown -R mysql /usr/local/mysql/var shell> chgrp -R mysql /usr/local/mysql O primeiro comando altera o atributo de proriedade dos arquivos para o usurio root, o segundo altera o atributo de propriedade do diretrio de dados para o usurio mysql, e o terceiro altera o atributo de grupo para o grupo mysql. 11. Se voc deseja instalar suporte para a interface Perl DBI/DBD, veja Seco 2.7, Comentrios de Instalao do Perl. 12. Se voc deseja que o MySQL inicie automaticamente quando voc ligar sua mquina, voc pode copiar support-files/mysql.server para o local onde seu sistema tem seus arquivos de incializao. Mais informaes podem ser encontradas no prprio script support-files/mysql.server e em Seco 2.4.3, Inicializando e parando o MySQL automaticamente.. Depois de tudo ter sido instalado, voc deve iniciar e testar sua distribuio usando este 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_safe no comando: Se o comando falhar imediatamente com mysqld daemon ended ento voc pode achar alguma informao no arquivo diretrio-dados-mysql/'nome_maquina'.err. A razo pode ser que voc j possua outro servidor mysqld sendo executado. See Seco 4.2, Executando Mltiplos MySQL Servers na Mesma Mquina. See Seco 2.4, Configuraes e Testes Ps-instalao.

2.3.2. Aplicando patches


Algumas vezes patches aparecem na lista de mensagens ou so colocados na rea de patches do MySQL. (http://www.mysql.com/downloads/patches.html).

88

Instalao do MySQL

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 estes comandos: shell> patch -p1 < patch-file-name shell> rm config.cache shell> make clean Patches do site FTP so distribudos 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 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 fontes comeando com o passo ./configure. Depois de executar o passo make install, reinicie seu servidor MySQL. Voc pode precisar derrubar algum servidor atualmente em execuo antes de executar make install. (Use mysqladmin shutdown para fazer isto.) Alguns sistemas no lhe permitem instalar uma nova verso do programa se ele substitui agum que estiver em execuo.

2.3.3. Opes tpicas do configure


O script configure fornece uma grande gama de controle sobre como voc configura sua distribuio MySQL. Normalmente voc faz isto usando opes na linha de comando do configure. Voc tambm pode alterar configure usando algumas variveis de ambiente. See Apndice F, Variveis de Ambientes do MySQL. Para uma lista de opes suportadas pelo configure, execute este comando: shell> ./configure --help Algumas das opes mais usadas normalmente com o configure esto descritas a seguir: Para compilar apenas as bibliotecas clientes do MySQL e programas clientes e no o servidor, use a opo --without-server: shell> ./configure --without-server Se voc no possui um compilador C++, mysql no ir compilar (ele o programa cliente que exige C++). Neste caso, voc pode remover o cdigo no configure que testa pelo compilador C++ e executar ./configure com a opo --without-server. O passo da compiao continuar tentaindo construir mysql, mas voc pode ignorar as advertncias sobre mysql.cc. (Se o make parar, tente make -k para continuar com o resto da compilao mesmo se erros ocorrerem.) Se voc quiser uma biblioteca embutida do MySQL (libmysqld.a) voc deve usar a opo -with-embedded-server. Se voc no deseja que seus arquivos de logs e diretrios de bancos de dados fiquem 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

89

Instalao do MySQL

O primeiro comando altera o diretrio instalao para que tudo seja instalado sobre / usr/local/mysql em vez do padro /usr/local. O segundo comando preserva o diretrio da instalao padro, mas altera a localizao padro para diretrios de bancos 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 opes. See Seco 4.1.2, Arquivo de Opes my.cnf. Se voc estiver usando Unix e deseja que o arquivo socket do MySQL fique em um diretrio diferente do padro (normalmente no diretrio /tmp ou /var/run) use o comando configure da seguinte forma: shell> ./configure --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock Perceba que o arquivo fornecido deve ter um caminho absoluto ! Voc tambm pode, mais tarde, alterar a localizao de mysql.sock usando os arquivos de opes do MySQL. See Seco A.4.5, Como Proteger ou AlterarHow to Protect or Change the MySQL Socket File / tmp/mysql.sock. Se voc deseja compilar programas linkeditados estaticamente (por exemplo, para criar uma distribuio binria, obter mais velocidade, ou evitar problemas com algumas distribuies Red Hat Linux), execute configure desta forma: shell> ./configure --with-client-ldflags=-all-static \ --with-mysqld-ldflags=-all-static Se voc estiver usando gcc e no tem libg++ ou libstdc++ instalados voc pode dizer 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 libstdc++. Isto pode ser uma boa idia para se fazer se voc tiver as bibliotecas acimas instaladas, j que algumas verses destas bibliotecas tem causado problemas estranhos para usurios do MySQL no passado. Segue algumas configuraes de variveis de ambiente comuns, dependendo do compilador que voc estiver usando: Compiler gcc 2.7.2.1 egcs 1.0.3a gcc 2.95.2 Recommended options CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions fno-rtti" 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 \ CXXnewer FLAGS="-O3 -mpentiumpro -mstack-align-double -felide-constructors \ fno-exceptions -fno-rtti" Na maioria dos casos voc pode obter um binrio MySQL razoavelmente otimizado usando as opes acima e adicionar as seguintes opes para a linha de configurao: --prefix=/usr/local/mysql --enable-assembler \ --with-mysqld-ldflags=-all-static A linha completa de configurao dever ser, em outras palavras, algo como o seguinte para todas as verses recentes do gcc: 90

Instalao do MySQL

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 todos compilados com otimizao plena e deve ser perfeito para a maioria dos usurios. See Seco 2.2.8, Binrios MySQL compilados pela MySQL AB. Existem algumas definies de configurao que voc pode alterar para criar um binrio ainda mais rpido, mas isto somente para usurios avanados. See Seco 5.5.3, Como a Compilao e a Ligao Afetam a Velocidade do MySQL. Se a construo falhar e produzir erros sobre seu compilador ou linkeditor no estarem aptos para criarem a biblioteca compartilhada libmysqlclient.so.r# ('r#' um nmero de verso), voc pode evitar este problema fornecendo a opo --disable-share para o configure. Neste caso, configure no construir uma biblioteca libmysqlclient.so.* compartilhada. Voc pode configurar o MySQL para no usar valores de campos DEFAULT para campos no-NULL (isto , campos que no podem ser NULL). See Seco 1.8.5.2, Restries de NOT NULL. shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS ./configure Por padro, o MySQL usa o conjunto de caracteres ISO-8859-1 (Latin1). Para alterar o conjunto padro, use a opo --with-charset: shell> ./configure --with-charset=CHARSET CHARSET pode ser um de big5, cp1251, cp1257, czech, danish, dec8, dos, euc_kr, gb2312, gbk, german1, hebrew, hp8, hungarian, koi8_ru, koi8_ukr, latin1, latin2, sjis, swe7, tis620, ujis, usa7, ou win1251ukr. See Seco 4.7.1, O Conjunto de Caracteres Utilizado para Dados e Ordenao. Se voc desja converter os caracteres entre o servidor e o cliente, voc deve dar uma olhada no comando SET OPTION CHARACTER SET. See Seco 5.5.6, Sintaxe de SET. Cuidado: Se voc alterar o conjunto de caracteres depois de ter criado qualquer tabela, voc deve executar myisamchk -r -q --set-character--set=charset em cada tabela. Seus ndices podem ser ordenados incorretamente. (Isto pode acontecer se voc instalar o MySQL, criar algumas tabelas, depois reconfigurar o MySQL para usar um conjunto diferente de caracteres e reinstal-lo). Com a opo --with-extra-charset=LISTA voc pode definir qual conjunto de caracteres adicionais deve ser compilado no servidor. Aqui LISTA uma lista de conjuntos de caracteres separados por espaos, complex para incluir todos caracteres que no podem ser carregados dinamicamente ou all para incluir todos os conjuntos nos binrios. Para configurar o MySQL com cdigo para depurao, use a opo --with-debug: shell> ./configure --with-debug Isto inclui uma alocao segura de memria que pode encontrar alguns erros e fornecer sada sobre o que est acontecendo. See Seco E.1, Depurando um Servidor MySQL. Se seus programas clientes usam threads, voc precisar tambm compilar uma verso thread-safe da biblioteca cliente do MySQL com as opes do configure -enable-thread-safe-client. Isto ir criar uma biblioteca libmysqlclient_r 91

Instalao do MySQL

com o qual voc dever ligar suas aplicaes que fazem uso de threads. See Seco 12.1.14, Como Fazer um Cliente em Threads. Opes que pertenam a sistemas particulares podem ser encontrados na seo com detalhes especficos de sistemas neste manual. See Seco 2.6, Notas especficas para os Sistemas Operacionais.

2.3.4. Instalando pela rvore de fontes do desenvolvimento


CUIDADO: Voc deve ler esta seo somente se voc estiver interessado em nos ajudar a testar nossos novos cdigos. Se voc s deseja deixar o MySQL funcionando em seus sistema, voc deve usar uma distribuio padro (pode ser uma distribuio binria ou fonte). Para obter noss mais nova rvore de desenvolvimento, use estas instrues: 1. 2. 3. Faa download do BitKeeper em http://www.bitmover.com/cgi-bin/download.cgi. Voc precisar do Bitkeeper 3.0 ou posterior para acessar nosso repositrio. Siga as instrues para instal-lo. Depois que o BitKeeper estiver instalado, primeiro v ao diretrio no qual voc deseja trabalhar e ento use um dos seguintes comandos para clonar o ramo da verso MySQL de sua escolha: Para clonar o ramo 3.23 (antigo), use este comando: shell> bk clone bk://mysql.bkbits.net/mysql-3.23 mysql-3.23 Para clonar o ramo 4.0 (estvel/produo), use este comando: 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 configurada no subdiretrio mysql-3.23/, mysql-4.0/, mysql-4.1/, ou mysql-5.0/ do diretrio atual. Se voc est atrs de um firewall e s pode iniciar conexes HTTP, voc tambm pode o BitKeeper via HTTP. Se voc precisa usar um servidor proxy, simplesmente configure a varivel de ambiente http_proxy para apontar para o seu proxy: shell> export http_proxy="http://seu.servidor.proxy:8080/" Agora, simplesmente substitua o bk:// com o http:// ao fazer um clone. Exemplo: shell> bk clone http://mysql.bkbits.net/mysql-4.1 mysql-4.1

92

Instalao do MySQL

O download inicial da rvore fonte pode demorar um pouco, dependendo da velocidade de sua conexo; seja paciente. 4. Voc precisar do GNU make, autoconf 2.53 (ou posterior), automake 1.5, libtool 1.4 e m4 para executar o prximo conjunto de comandos. Embora muitos sistemas operacionais j venham com suas prprias implementaes do make, as chances de que a sua compilao falhe com mensagens de erros estranhas so altas. Consequentemente altamente recomendado usar o GNU make (algumas vezes tambm chamado gmake). Felizmente, um grande nmero de sistemas operacionais j vem com a ferramente GNU pr instalada ou so fornecidos pacotes de instalao da mesma. De qualquer forma, elas podem ser encontradas nos seguintes locais: http://www.gnu.org/software/autoconf/ http://www.gnu.org/software/automake/ http://www.gnu.org/software/libtool/ http://www.gnu.org/software/make/

Se voc estiver tentando configurar o MySQL 4.1 voc tambm precisar do bison 1.75. Verses mais antigas do bison podem exiobir este erro: sql_yacc.yy:#####: fatal error: maximum table size (32767) exceeded. Nota: o tamanho mximo da tabela no realmente excedido, o erro causado por um bug nas verses mais novas do bison. Verses do MySQL anteriores a 4.1 podem tambm compilar com outras implementaes yacc (e.g. BSD yacc 91.7.30). Para verses posteriores, GNU bison uma exigncia. O comando comum para fazer em uma shell : 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 opes favoritas aqui make Caso apaream alguns erros estranhos durantes este estgio, confira se voc realmente tem a libtool instalada! Uma coleo de nossos scripts de configurao padres est localizada no subdiretrio BUILD/. Se preferir, voc pode usar BUILD/compile-pentium-debug. Para compilar em uma arquitetura diferente, modifique o script removendo opes que so especficas da arquitetura Pentium. 5. Quando a construo estiver pronta, execute make install. Seja cuidadoso com isto em uma mquina de produo; o comando pode sobrescrever sua verso atual instalada. Se voc tem outra instalao do MySQL, ns recomendamos que voc execute ./configure com valores diferentes para as opes prefix, tcp-port e unix-socket-path que as usadas pelo seu servidor em produo. Seja rgido com sua nova instalao e tente fazer com que os novos recursos falhem. Inicie executando make test. See Seco 14.1.2, Pacotes de Teste do MySQL. Se voc chegar ao estgio make e a distribuio no compilar, por favor relate-o para <bugs@lists.mysql.com>. Se voc instalou as ltimas verses das ferramentas GNU exigidas, e elas falharam tentando processar nossos arquivos de configurao, por favor informe isto tambm. Entretanto, se voc executar aclocal e obtm um erro de command not found no o reporte.Tenha certeza que todas as ferramentas necessrias estejam instaladas e 93

6. 7.

Instalao do MySQL

que sua varivel PATH esteja corretamente configurada para que sua shell possa encontr-la. 8. 9. Depois da operao inicial bk clone para obter a rvore fonte, voc deve executar bk pull periodicamente para obter as atualizaes. Voc pode examinar o histrico de alteraes para a rvore com todos os diffs usando bk sccstool. Se voc ver alguns diffs estranhos ou cdigo sobre o qual voc tenha alguma dvida, no hesite em enviar um e-mail para lista de email ``internals'' do MySQL. See Seco 1.7.1.1, As Listas de Discusso do MySQL. Alm disso, se voc acha que tem uma idia melhor em como fazer algo, envie um email para o mesmo endereo com um patch. bk diffs ir produzir um patch para voc aps fazer as alteraes no cdigo fonte. Se voc no tiver tempo para codificar sua idia, apenas envie uma descrio.

10. BitKeeper tem um timo utilitrio de ajudar que voc pode acessar via bk helptool. 11. Note que qualquer commit (bk ci ou bk citool) ir disparar o envio da mensagem com as alteraes para nossa lista de email internos, bem como a submisso openlogging.org usual apenas com os comentrios da alterao. Geralmente voc no precisar usar commit (j que o rvore pblica no permitir bk push), mas prefervel usar o mtodo bk diffs descrito arteriormente. Voc tambm pode procurar alteraes, comentrios e cdigo fonte online procurando por 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: shell> bk clone bk://mysql.bkbits.net/mysqldoc mysqldoc Existe tambm um rvore pblica do BitKeeper para o MySQL Control Center e Connector/ODBC. Eles podem ser clonados da seguintes forma, respectivamente: Para clonar o MySQL Control center, use o seguinte comando: 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


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 sistemas. Veja Seco 2.3.6, Notas MIT-pthreads para avisos que podem ocorrer usando MIT-pthreads. Para outros problemas, confira a lista abaixo. A soluo para vrios problemas envolve reconfigurao. Se voc precisa reconfigurar, faa notas do seguinte: Se configure executado depois dele j ter sido chamado, ele pode usar informao que foi colhida durante a chamada anterior. Esta informao armazenada no arquivo config.cache. Quando configure inicia, ele procura por este arquivo, l seu contedo, se ele existir, assumindo que aquela informao continua correta. Essa conjetura invlida quando voc reconfigurar. Cada vez que voc executa configure, voc deve executar make de novo para recompilar. Entretanto, voc pode desejar remover primeiro antigos arquivos objeto de construes anteriores, porque eles foram compilados usando diferentes opes de configurao. 94

Instalao do MySQL

Para prevenir antigas informaes de configuraes ou arquivos objetos de serem usados, 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 provavelmente tem de falta de memria ou espao de swap: 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 sql_yacc.cc com funes inline. Tente executando configure com a opo -with-low-memory: shell> ./configure --with-low-memory Esta opo adiciona -fno-inline na a linha de compilao se voc estiver usando gcc e O0 se voc estiver usando outro programa. Voc deve tentar a opo --with-low-memory mesmo se voc tiver muita memria e espao de swap que voc ache ser suficieente para no ocorrer erros. Este problema tem ocorrido mesmo em sistemas com boas configuraes de hardware e a opo --with-low-memory geralmente corrige isto. Por padro, configure escolhe c++ como o nome do compilador e GNU c++ liga com lg++. Se voc estiver usando gcc, este comportamento pode causar problemas durante a compilao, como o seguinte: configure: error: installation or configuration problem: C++ compiler cannot create executables. Voc podem tambm ter problemas durante a compilao relacionados g++, libg++ ou libstdc++. Uma causa destes problemas que voc pode no ter g++ ou voc pode ter g++ mas no 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 estes problemas, voc pode usar gcc como seu compilador C++. Tente configurar a varivel de ambiente CXX para "gcc -O3". Por exemplo: shell> CXX="gcc -O3" ./configure Isto funciona porque gcc compila cdigo fonte C++ to bem quanto g++ faz, mas no ifaz a ligao em libg++ ou libstdc++ por padro. Outra forma de corrigir estes problemas, com certeza, instalando g++, libg++ e libstdc++. No entanto gostariamos de lhe recomendar a no usar libg++ ou libstdc++ com o MySQL j que isto ir aumentar o tamanho do binrio do mysqld sem lhe trazer nenhum benefcio. Algumas verses destas bibliotecas tambm tem causado problemas estranhos para os usurios MySQL no passado.

95

Instalao do MySQL

Usar gcc como compilador C++ tambm exigido, se voc quiser compilar o MySQL com a funcionalidade RAID (veja Seco 6.5.3, Sintaxe CREATE TABLE para mais informaes sobre tipos de tabela RAID) e voc estiver usando o GNU gcc verso 3 e acima. Se voc obter erros como estes abaixo durante o estgio de ligao quando voc configurar o MySQL para compilar com a opo --with-raid, tente usar o gcc como o seu compilador C++ definindo a varivel de ambiente CXX mencionada acima: gcc -O3 -DDBUG_OFF -rdynamic -o isamchk isamchk.o sort.o libnisam.a ../mysys/libmysys.a ../dbug/libdbug.a ../strings/libmystrings.a -lpthread -lz -lcrypt -lnsl -lm -lpthread ../mysys/libmysys.a(raid.o)(.text+0x79): In function `my_raid_create': : undefined reference to `operator new(unsigned)' ../mysys/libmysys.a(raid.o)(.text+0xdd): In function `my_raid_create': : undefined reference to `operator delete(void*)' ../mysys/libmysys.a(raid.o)(.text+0x129): In function `my_raid_open': : undefined reference to `operator new(unsigned)' ../mysys/libmysys.a(raid.o)(.text+0x189): In function `my_raid_open': : undefined reference to `operator delete(void*)' ../mysys/libmysys.a(raid.o)(.text+0x64b): In function `my_raid_close': : undefined reference to `operator delete(void*)' collect2: ld returned 1 exit status Se sua compilao falhar com erros, como um dos seguintes, voc deve atualizar sua verso de make para GNU make: 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. O GNU make verso 3.75 ir funcionar. Se voc deseja definir algumas opes que devem ser usadas pelo seu compilador C ou C++, adicione as opes para as variveis de ambiente CFLAGS e CXXFLAGS. Voc pode tambm especificar os nomes do compilador a ser usado da mesma forma utilizando CC e CXX. Exemplo: shell> shell> shell> shell> shell> CC=gcc CFLAGS=-O3 CXX=gcc CXXFLAGS=-O3 export CC CFLAGS CXX CXXFLAGS

Olhe em Seco 2.2.8, Binrios MySQL compilados pela MySQL AB para uma lista de definio de opes que tenham sido teis em vrios sistemas. Se voc recebeu uma mensagem de erro como esta, necessrio atualizar o compilador gcc: O gcc 2.8.1 funciona, mas recomendamos o uso do gcc 2.95.2 ou egcs 1.0.3a em seu lugar. Se voc obtem erros como estes vistos abaixo enquanto estiver compilando o mysqld, o configure no detectou corretamente o tipo do ltimo argumento para accept(), getsockname() ou getpeername(): cxx: Error: mysqld.cc, line 645: In this statement, the referenced type of the pointer value "&length" is "unsigned long", which is not compatible with "int". new_sock = accept(sock, (struct sockaddr *)&cAddr, &length); 96

Instalao do MySQL

Para corrigir isto, edite o arquivo config.h (que gerado pelo configure). Procure por estas linhas: /* Define as the base type of the last arg to accept */ #define SOCKET_SIZE_TYPE XXX Altere XXX para size_t ou int, dependendo de seu sistema operacional. (Perceba que voc dever fazer isto cada vez que voc executar configure, porque configure regenera config.h.) O arquivo sql_yacc.cc gerado pelo sql_yacc.yy. Normalmente o processo de construo no necessita criar sql_yacc.cc, porque o MySQL j vem com uma cpia pr-gerada. Entretanto, se voc necessita recri-lo voc pode encontrar este erro: "sql_yacc.yy", line xxx fatal: default action causes potential... Isto um indcio de que sua verso do yacc deficiente. Provavelmente voc precisar instalar o bison (a verso GNU de yacc) e us-lo no lugar do yacc. Se voc necessita depurar mysqld ou um cliente MySQL, execute configure com a opo -with-debug, ento recompile e ligue seus clientes com a nova biblioteca cliente. See Seco E.2, Depurando um cliente MySQL.. Se voc tem um erro de compilao no Linux (ex. SuSE Linux 8.1 ou Red Hat Linux 7.3) parecido com o seguinte:

libmysql.c:1329: warning: passing arg 5 of `gethostbyname_r' from incompatibl libmysql.c:1329: too few arguments to function `gethostbyname_r' libmysql.c:1329: warning: assignment makes pointer from integer without a cas make[2]: *** [libmysql.lo] Error 1 Por padro, o script configure tenta determinar o nmero correto de argumentos 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: Certifique-se de que o GNU C++ g++ est instalado. Em algumas distribuies Linux, o pacote exigido chamado gpp, em outro ele chamado gcc-c++. Use o gcc como o seu compilador C++ configurando a variavel de ambiente CXX para gcc: export CXX="gcc" Note que voc precisa executar o configure novamente aps isto.

2.3.6. Notas MIT-pthreads


Esta seo descreve alguns dos detalhes envolvidos no uso de MIT-pthreads. Note que no Linux voc NO deve usar MIT-pthreads mas instalar LinuxThreads! See Seco 2.6.2, Notas Linux (Todas as verses). Se seu sistema no fornece suporte nativo a thread, voc precisar construir o MySQL usando o pacote MIT-pthreads. Isto inclui antigos sistemas FreeBSD, SunOS 4.X, Solaris 2.4 e anteriores entre outros. See Seco 2.2.3, Sistemas Operacionais suportados pelo MySQL. Note que a partir do MySQL 4.0.2, MIT-pthreads no fazem mais parte da distribuio fonte. Se voc precisar deste pacote, voc precisa fazer o download dele separadamente em 97

Instalao do MySQL

http://www.mysql.com/Downloads/Contrib/pthreads-1_60_beta6-mysql.tar.gz Depois do download, extraia este arquivo fonte no nvel mais alto do diretrio de fontes do MySQL. Ele criar um novo subdiretrio mit-pthreads. Na maioria dos sitemas, voc pode forar o uso de MIT-pthreads executando o configure com a opo --with-mit-threads: shell> ./configure --with-mit-threads Construo em um diretrio no fonte no suportado com o uso de MIT-pthreads, porque ns queremos minimizar nossas alteraes para este cdigo. As verificaes que determinam se MIT-pthreads ser usado ou no, ocorrer somente durante a parte do processo de configurao que trata com o cdigo do servidor. Se voc configurou a distribuio usando --without-server para construir somente o cdigo cliente, clientes no iro saber se o MIT-pthreads est sendo usado e ir usar conexes socket Unix por padro. Como os sockets Unix no funcionam sob MIT-pthreads, isto significa que voc precisar usar -h ou --host quando executar programas clientes. Quando o MySQL compilado usando MIT-pthreads, travas de sistema so desabilitadas por padro por razes de performance. Voc pode dizer ao servidor para usar travas de sistema com a opo --external-locking. Isto s necessrio se voc quiser executar dois servidores MySQL no mesmo diretrio de dados (no que no 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 falham. Por exemplo: shell> mysqladmin version mysqladmin: connect to server at '' failed; error: 'Can't connect to mysql server on localhost (146)' A soluo para isto matar o servidor mysqld e reinici-lo. Isto s aconteceu conosco quando foramos uma queda do servidor e fizemos uma reinicializao imediata. Com MIT-pthreads, a chamada de sistema sleep() no interrompvel com SIGINT (break). Isto s percebido quando voc executa mysqladmin --sleep. Voc deve esperar pela chamada sleep() para terminar, antes da interruo ser servida e o processo parar. Na ligao, voc pode receber mensagens de alerta como estes (pelo menos no Solaris); elas podem ser ignoradas: ld: warning: symbol `_iob' has differing sizes: (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4; file /usr/lib/libc.so value=0x140); /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken ld: warning: symbol `__iob' has differing sizes: (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4; file /usr/lib/libc.so value=0x140); /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken Alguns outros alertas tambm podem ser ignorados: implicit declaration of function `int strtoll(...)' implicit declaration of function `int strtoul(...)' No colocamos readline para funcionar com MIT-pthreads. (Isto no necessrio, mas pode ser interessante para alguns.)

98

Instalao do MySQL

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 verses 4.1 e acima no Windows. As instrues so fornecidas para construir binrios a partir de uma distribuio fonte padro ou a partir da rvore do BitKeeper que contm o fonte do desenvolvimento mais atuais. Nota: As instrues neste documento esto restritas aos usurios que queiram testar o MySQL no Windows a partir da ltima distribuio fonte ou da rvore do BitKeeper. Para uso em produo, a MySQL AB no aconselha que voc utilize um servidor MySQL construdo por voc mesmo a partir de um fonte. Normalmente melhor usar uma distribuio binria precompilada do MySQL que construda especificamente para desempenho otimizado no Windows pela MySQL AB. Instrues para instalar uma distribuio binria est disponvel em Seco 2.1.1, Instalando o MySQL no Windows. Para construir o MySQL no Windows a partir do fonte, voc precisa dos seguintes compiladores e recursos disonveis em seu sistema Windows: Compilador VC++ 6.0 (atualizado com o SP 4 ou 5 e pacote Pre-processador) O pacote Preprocessador necessrio para a macro assembler. Mais detalhes em: http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/faq.aspx. Aproximadamente 45 MB de espao em disco. 64 MB de RAM

Voc tambm precisar de um distribuio fonte para o Windows. Existem dois modos de conseguir uma distribuio fonte do MySQL verso 4.1 e acima: 1. Obtenha um pacote de uma distribuio fonte pela MySQL AB para a verso do MySQL que voc est particularmente interessado. Distribuies fontes empacotadas esto disponveis para verses distribudas do MySQ e podem ser obtidas em http://www.mysql.com/downloads/. Voc pode empacotar um distribuio fonte voc mesmo a partir da ultima rvore fonte de desenvolvimento do BitKeeper. Se voc planeja fazer isto, voc deve criar o pacote em um sistema Unix e ento transfr-lo para seu sistema Windows. (A razo para isto que alguns dos passos de configurao e construo exigem ferramentas que funcionam apenas no Unix.) A abordagem do BitKeeper, exige: Um sistema executando Unix ou um sistema tipo Unix, como o Linux BitKeeper 3.0 instalado http://www.bitkeeper.com/. neste sistema. Voc pode obter o BitKeeper em

2.

Se voc estiver usando uma distribuio fonte do Windows, voc pode ir diretamente para Seco 2.3.7.1, Construindo o MySQL Usando VC++. Para contruir a partir da rvore do BitKeeper, v para Seco 2.3.7.2, Criando um Pacote Fonte do Windows a partir da ltima Fonte de Desenvolvimento. Se voc encontrar alguma coisa que no est funcionando como esperado, ou tiver sugestes sobre o mode de melhorar o processo de construo atual no Windows, envie uma mensagem para a lista de email win32. See Seco 1.7.1.1, As Listas de Discusso do MySQL.

2.3.7.1. Construindo o MySQL Usando VC++


Nota: O MySQL 4.1 e arquivos do espeo de trabalho do VC++ so compatveis com o Microsoft Visual Studio 6.0 e as edies acima (7.0/.NET) e testados pela equipe da MySQL AB antes de cada distribuio.

99

Instalao do MySQL

Siga este procedimento para construir o MySQL: 1. 2. 3. 4. 5. 6. 7. 8. 9. Crie um diretrio de trabalho (ex.: workdir). Descompacte a distribuio fonte no diretrio mencionado acima usando Winzip ou outra ferramenta que possa ler arquivos .zip. Inicie o compilador VC++ 6.0. No menu File, selecione Open Workspace. Abra o workspace mysql.dsw que voc encontrar no diretrio de trabalho. No menu Build, selcione o menu Set Active Configuration. Clique sobre a tela selecionada mysqld - Win32 Debug e clique OK. Pressione F7 para iniciar a construo da depurao do servidor, bibliotecas e alguns aplicativos clientes. Compile as verses distribudas que voc desejar, do mesmo modo.

10. Verses depuradas dos programas e bibliotecas so colocados nos diretrios client_debug e lib_debug. Verses liberadas dos programas e bibliotecas so colocados nos diretrios client_release e lib_release. Note que se voc quiser construir tanto verses liberadas quanto depuradas voc pode selecionar a opo ``build all'' do menu Build. 11. Teste o servidor. O servidor construdo usando as instrues anteriores ir esperar que o diretrio base e de dados do MySQL seja C:\mysql e C:\mysql\data por padro. Se voc quiser testar o seu servidor usando o diretrio raiz de uma rvore fonte e seu diretrio de dados como o diretrio base e o diretrio de dados, voc precisar dizer ao servidor os seus caminhos. Voc tambm pode fazer into na linha de comando com as opes --basedir e -datadir, ou colocar opes apropriadas no arquivo de opes (o arquivo C:\my.cnf ou my.ini no diretrio do Windows). Se voc tiver um diretrio de dados existente em qualquer lugar que voc queira usar, voc pode especific-lo no se caminho. 12. Inicie o ser servidor a partir do diretrio client_release ou client_debug, dependendo de qual servidor voc queira usar. O instrues gerais de inicializao do servidor esto em Seco 2.1.1, Instalando o MySQL no Windows. Voc precisar adaptar as instrues de forma apropriada se voc quiser usar um diretrio base ou diretrio de dados diferente. 13. Quando o servidor est em execuo de modo independente ou como um servio daseado em sua configurao, tente se conectar a ele pelo utilitrio interativo mysql de linha de comando que existe em seu diretrio client_release ou client_debug. Quando voc estiver certo de que os programas que voc construiu esto funcionando corretamente, pare o servidor. Ento instale o MySQL da seguinte forma: 1. Crie o diretrio para instalar os arquivos do MySQL. Por exemplo, para instalar dentro 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 diversos diretrios adicionais: 100

Instalao do MySQL

mkdir mkdir mkdir mkdir

\mysql\include \mysql\lib \mysql\lib\debug \mysql\lib\opt

Se voc quiser fazer um benchamrk do MySQL, crie este diretrio: mkdir \mysql\sql-bench Benchmark exigem suporte Perl. 2. Copie do diretrio workdir para o diretrio c:\mysql os seguintes diretrios: 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 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: xcopy sql-bench\*.* C:\mysql\bench /E

Configure e inicie o servidor da mesma forma que a distribuio binria do Windows. See Seco 2.1.1.3, Preparando o Ambiente MySQL do Windows.

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


Para construir o ltimo pacote fonte do Windows a partir da arvor fonte atual do BitKeeper, use as seguintes instrues. Por favor, note que este procedimento deve ser realizado 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 desejado). Para mais informaes sobre como clonar a rvore fonte veja as instrues em Seco 2.3.4, Instalando pela rvore de fontes do desenvolvimento. Configure e construa as distribuies para que voc tenha um binrio do servidor para trabalhar. Um modo de se fazer isto executar o seguinte comando no diretrio de mais alto nvel de sua rvore fonte: shell> ./BUILD/compile-pentium-max 3. Depois de se certificar que o processo de construo foi completado com sucesso, execute o seguinte script utilitrio a a partir do diretrio de nvel mais alto da sua arvore fonte: 101

2.

Instalao do MySQL

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 aceita as seguintes opes: --debug --tmp --suffix --dirname --silent --tar --help Depura, sem criar o pacote Especifica a localizao temporria Nome de sufixo para o pacote Nome do diretrio onde os arquivos so copiados (intermediario) No apresenta uma lista dos arquivos processados 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 mysql-VERSION-win-src.zip, onde VERSION representa a verso de sua rvore fonte do MySQL. 4. Faa uma copia ou upload para a sua mquina o pacote fonte Windows que voc tiver criado. Para compil-lo use as instrues em Seco 2.3.7.1, Construindo o MySQL Usando VC++.

2.4. Configuraes e Testes Ps-instalao


Uma vez instalado o MySQL (de uma distribuio binria ou fonte), voc deve inicializar as tabelas de concesses, iniciar o servidor e ter certeza que o servidor est funcionando bem. Voc pode tambm desejar que o servidor inicie e pare automaticamente quando seu sistema iniciar e desligar. Normalmente voc instala as tabelas de concesses e inicia o servidor assim para instalaes baseadas em uma distribuio fonte: shell> ./scripts/mysql_install_db shell> cd diretorio_instalao_mysql shell> ./bin/mysqld_safe --user=mysql & Para uma distribuio binria (sem ser pacotes RPM ou PKG), faa isto: shell> cd diretorio_instalao_mysql 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 do banco de dados, o banco de dados test que voc poder usar para testar o MySQL e tambm entradas de privilgio para o usurio que usa o mysql_install_db e o usurio root. As estrandas so criadas sem senhas. O script mysqld_safe inicia o servidor mysqld. (Se sua verso for anterior a 4.0, use safe_mysqld em vez de mysqld_safe.) mysql_install_db no ir sobrescrever nenhuma tabela de privilgios antiga, ento deve ser seguro execut-lo em quaisquer circunstncias. Se voc no deseja ter o banco de dados test voc pode remov-lo com mysqladmin -u root drop test depois de iniciar o servidor. Testes so geralmente facilmente feitos de um diretrio raiz da distribuio MySQL. Para uma distribuio binria, este seu diretrio de instalao (normalmente algo como /usr/local/mysql). Para uma distrubuio fonte, este o diretrio principal da sua rvore fonte do MySQL. Nos comandos mostrados abaixo nesta seo e nas seguintes subsees, BINDIR o caminho para a localizao na qual os programas como mysqladmin e mysqld_safe esto instalados. Para uma distribuio binria este o diretrio bin. Para uma distribuio fonte, BINDIR provavel102

Instalao do MySQL

mente /usr/local/bin, a menos que voc especifique um diretrio de instalao diferente de / usr/local quando voc executa configure. EXECDIR a localizao na qual o servidor mysqld est instalado. Para uma distribuio binria, isto o mesmo que BINDIR. Para uma distribuio fonte, EXECDIR provavelmente /usr/local/libexec. Os testes so descritos em detalhes abaixo: 1. Se necessrio, inicie o servidor mysqld e configure as tabelas de concesses iniciais contendo os privilgios que determinam como os usurios esto permitidos a conectar ao servidor. Isto feito normalmente com o script mysql_install_db: shell> scripts/mysql_install_db Normalmente, mysql_install_db precisa ser executado somente na primeira vez que voc instala o MySQL. Portanto, se voc estiver atualizando uma instalao existente, voc pode pular este passo. (entretanto, mysql_install_db realmente seguro de usar e no ir atualizar nenhuma tabela que j exista, ento se voc no tem certeza do que fazer, voc pode sempre executar mysql_install_db.) mysql_install_db cria seis tabelas (user, db, host, tables_priv, columns_priv e func) no banco de dados mysql. Uma descrio dos privilgios iniciais fornecido em Seco 4.4.4, Configurando os Privilgios Iniciais do MySQL. De forma resumidao, estes privilgios permitem que o usurio root faa qualquer coisa no MySQL, e permitem a qualquer um a criar ou usar bancos de dados com o nome de 'test' ou iniciando com 'test_' . Se voc no configurar as tabelas de concesses, o seguinte erro ir aparecer no arquivo log quando voc no iniciar o servidor: mysqld: Can't find file: 'host.frm' O erro acima pode tambm ocorrer com uma distribuio binria do MySQL se voc no iniciar o MySQL executando o ./bin/mysqld_safe! See Seco 4.8.2, mysqld-safe, o wrapper do mysqld. Voc deve precisar executar mysql_install_db como root. Entretanto, se voc preferir, pode executar o servidor MySQL como um usurio (no-root) sem privilgios, desde que o usurio possa ler e escrever arquivos no diretrio de banco de dados. Instrues para executar o MySQL como um usurio sem privilgios detalhado em Seco A.3.2, Como Executar o MySQL Como Um Usurio Normal Se voc tiver problemas com o mysql_install_db, veja Seco 2.4.1, Problemas Executando o mysql_install_db. Existem algumas alternativas para executar o script mysql_install_db como ele fornecido na distribuio MySQL: Voc pode querer editar o mysql_install_db antes de execut-lo, para alterar os privilgios iniciais que so instalados nas tabelas de concesses. Isto til se voc deseja instalar o MySQL em vrias mquinas com os mesmos privilgios. Neste caso, provvel que voc s precise adicionar algumas instrues INSERT extras para as tabelas mysql.user e mysql.db. Se voc deseja alterar o contedo da tabelas de concesses depois de instal-las, voc pode executar mysql_install_db, ento usar mysql -u root mysql para conectar s tabelas de concesses como o usurio root e usar instrues SQL para modific-las diretamente. possvel recriar as tabelas de permisses completamente depois delas j terem sido criadas. Voc pode querer fazer isto se voc j instalou as tabelas mas deseja recri-las depois das edies mysql_install_db.

103

Instalao do MySQL

Para maiores informaes sobre estas alternativas, veja Seco 4.4.4, Configurando os Privilgios Iniciais do MySQL. 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 bin/mysqld_safe no comando: Se voc tiver problemas iniciando o servidor, veja Seco 2.4.2, Problemas Inicializando o Servidor MySQL. 3. Use mysqladmin para verificar se o servidor est em execuo. Os seguintes comandos fornecem um teste simples para conferir se o servidor est em funcionamento e respondendo s conexes: shell> BINDIR/mysqladmin version shell> BINDIR/mysqladmin variables A sada de mysqladmin version varia muito pouco dependendo de sua plataforma e verso do MySQL, mas deve ser similar a esta mostrada abaixo: shell> BINDIR/mysqladmin version mysqladmin Ver 8.14 Distrib 3.23.32, for linux on i586 Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license. Server version Protocol version Connection TCP port UNIX socket Uptime: 3.23.32-debug 10 Localhost via Unix socket 3306 /tmp/mysql.sock 16 sec

Threads: 1 Questions: 9 Slow queries: 0 Opens: 7 Flush tables: 2 Open tables: 0 Queries per second avg: 0.000 Memory in use: 132K Max memory used: 16773K Para ter uma idia do que voc pode fazer com BINDIR/mysqladmin, invoque-o com a opo --help. 4. Verifique se voc pode desligar o servidor: shell> BINDIR/mysqladmin -u root shutdown 5. Verifique que voc possa reiniciar o servidor. Faa isto usando mysqld_safe ou chamado o mysqld diretamente. Por exemplo: shell> BINDIR/mysqld_safe --log & Se o mysqld_safe falhar, tente execut-lo do diretrio de instalao do MySQL (se voc j no estiver l). Se no funcionar, veja Seco 2.4.2, Problemas Inicializando o Servidor MySQL. 6. Execute alguns testes bsicos para verificar se o servidor est funcionando. A sada deve ser similar ao mostrado abaixo: 104

Instalao do MySQL

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 instalao do MySQL) que voc pode usar para comparar como o MySQL se comporta em diferentes plataformas. O diretrio sql-bench/Results contm os resultados de vrias execues em diferentes bancos de dados e plataformas. Os seguintes mdulos Perl adicionais so necessrios para executar o pacote de benchamrk: DBI DBD-mysql Data-Dumper Data-ShowTable Estes mdulos podem ser obtidos em CPAN http://www.cpan.org/. See Seco 2.7.1, Instalando Perl no Unix. O diretrio sql-bench/Results contm os resultados de vrias execues em diferentes 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 distribuio binria RPM. (Distribuies fontes RPMs incluem o diretrio com os benchmarks.) Neste caso, voc deve primeiramente instalar a suite de benchmark antes de poder us-lo. A partir da verso 3.22 do MySQL, comearam a existir arquivos RPMs de benchmark chamados mysqlbench-VERSION-i386.rpm que contm cdigo ie dados de benchmark. Se voc tem uma distribuio fonte, voc tambm pode executar os testes no subdiretrio tests. Por exemplo, para executar auto_increment.tst, faa isto: shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst Os resultados esperados so mostrados no arquivo ./tests/auto_imcrement.res.

105

Instalao do MySQL

2.4.1. Problemas Executando o mysql_install_db


O propsito do script mysql_install_db gerar novas tabelas de privilgios. Ele no ir afeter nenhum outro dado! Ele tambm no far nada se voc j tem a tabela de privilgio do MySQL instalada. Se voc deseja refazer suas tabelas de privilgios, voc deve desligar o servidor mysqld, se ele j est executando, ento faa assim: mv diretorio-dados-mysql/mysql diretorio-dados-mysql/mysql-old mysql_install_db Esta seo relaciona mysql_install_db: alguns problemas que podem ser encontrados ao executar

mysql_install_db no instala as tabelas de permisses Voc pode descobrir que o mysql_install_db falha ao instalar as tabelas de permisses e termina depois de mostrar as seguintes mensagens: 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 se encontrar no diretrio XXXXXX nomeado pela mensagem de erro, e deve indicar porque mysqld no inicializa. Se voc no entende o que aconteceu, inclua o log quando voc postar um relato de erro usando mysqlbug! See Seco 1.7.1.3, Como relatar erros ou problemas.

J existe um daemon mysqld sendo executado Neste caso, provavelmente no ser necessrio executar o mysql_install_db. Voc deve executar o mysql_install_db somente uma vez, quando voc instalar o MySQL da primeira vez.

Instalair um segundo daemon mysqld no funciona quando um daemon estiver em execuo. Isto pode acontecer quando voc j tiver uma instalao do MySQL existente, mas deseja colocar uma nova instalao em um diferente lugar (por exemplo, para testes, ou talvez voc simplesmente deseja executar duas instalaes ao mesmo tempo). Geralmente o problema que ocorre quando voc tenta executar o segundo servidor que ele tenta usar o mesmo socket e porta que o outro. Neste caso voc ir obter a mensagem de erro: Can't start server: Bind on TCP/IP port: Address already in use ou Can't start server: Bind on unix socket.... See Seco 4.2, Executando Mltiplos MySQL Servers na Mesma Mquina.

Voc no tem direito de escrita no diretrio /tmp Se voc no tem direito de escrita para criar um arquivo socket no local padro (em /tmp) ou permisso para criar arquivos temporris em /tmp, voc ir obter um erro quando executar mysql_install_db ou quando iniciar ou usar mysqld. Voc pode especificar socket e diretrio temporrio diferentes, como segue: shell> TMPDIR=/algum_dir_tmp/ shell> MYSQL_UNIX_PORT=/algum_dir_tmp/mysqld.sock shell> export TMPDIR MYSQL_UNIX_PORT

106

Instalao do MySQL

See Seco A.4.5, Como Proteger ou AlterarHow to Protect or Change the MySQL Socket File /tmp/mysql.sock. algum_dir_tmp deve ser o caminho para o mesmo diretrio no qual voc tem permisso de escrita. See Apndice F, Variveis de Ambientes do MySQL. Depois disto voc deve estar apto para executar mysql_install_db e iniciar o servidor com estes comandos: shell> scripts/mysql_install_db shell> BINDIR/mysqld_safe & mysqld falha imediatamente Se voc estiver executando RedHat Verso 5.0 com uma verso de glibc anterior a 2.0.7-5 voc deve ter certeza que voc instalou todos os patches para a glibc! Existe muita informao sobre isto nos arquivos das listas de mensagens do MySQL. Links para os arquivos de correio esto disponveis online em http://lists.mysql.com/. Veja tambm Seco 2.6.2, Notas Linux (Todas as verses). Voc pode tambm iniciar o mysqld manualmente usando a opo -skip-grant-tables e adicionar a informao de privilgios usando o mysql: shell> BINDIR/mysqld_safe --skip-grant-tables & shell> BINDIR/mysql -u root mysql Do mysql, execute manualmente os comandos SQL em mysql_install_db. Tenha certeza de executar mysqladmin flush_privileges ou mysqladmin reload aps dizer ao servidor para recarregar as tabelas de permisses. -

2.4.2. Problemas Inicializando o Servidor MySQL


Se voc for usar tabelas que suportem transaes (BDB, InnoDB), primeiro deve-se criar um arquivo my.cnf e configurar opes de inicializao para os tipos de tabelas que voc planeja usar. See Captulo 7, Tipos de Tabela do MySQL. Geralmente, voc inicia o servidor mysqld de uma das trs maneiras: Invocando mysql.server. Este script usado primariamente na inicializao e finalizao do sistema, e descrito de forma mais completa em Seco 2.4.3, Inicializando e parando o MySQL automaticamente.. Invocando mysqld_safe, que tenta determinar as opes apropriadas para mysqld e ento execut-lo com estas opes. See Seco 4.8.2, mysqld-safe, o wrapper do mysqld. Para o Windows NT/2000/XP, veja Seco 2.1.1.7, Iniciando o MySQL no Windows NT, 2000, ou XP. Invocando o mysqld diretamente.

Quando o daemon mysqld inicia, ele altera o diretrio para o diretrio de dados. neste diretrio que ele espera gravar arquivos de log e o arquivo pid (com o ID do processo) e onde ele espera encontrar os bancos de dados. A localizao do diretrio de dados especificada quando a distribuio compilada. Entretanto, se o mysqld espera encontrar o diretrio de dados em lugar diferente de onde ele realmente est no 107

Instalao do MySQL

seu sistema, ele no funcionar corretamente. Se voc tiver problemas com caminhos incorretos voc pode encontrar quais opes o mysqld permite e quais so as configuraes do caminho padro chamando o mysqld com a opo --help. Voc pode sobrescrever os padres especificando os caminhos corretos como argumentos de linha de comando ao mysqld. (Estas opes tambm podem ser usadas com o mysqld_safe). Normalmente voc precisaria indicar ao mysqld somente o diretrio base sob o qual o MySQL instalado. Voc pode fazer isso usando a opo --basedir. Voc pode tambm usar --help para conferir o efeito das opees para se alterar o caminho (perceba que --help deve ser a opo final do comando mysqld. Por exemplo: shell> EXECDIR/mysqld --basedir=/usr/local --help Uma vez que voc determina as configuraes de caminho que voc deseja, inicie o servidor sem a opo --help. Qualquer que tenha sido o mtodo utilizado para iniciar o servidor, se houver falha na inicializao, confira o arquivo de log para ver se voc pode entender o porqu. Arquivos log esto localizados no diretrio dados (normalmente /usr/local/mysql/data para uma distribuio binria, / usr/local/var para uma distribuio fonte, \mysql\data\mysql.err no Windows.) Procure no diretrio de dados por arquivos com nomes no formato nome_maquina.err e nome_maquina.log onde nome_maquina o nome do servidor. Ento confira as ltimas linhas destes arquivos: shell> tail nome_maquina.err shell> tail nome_maquina.log Se voc encontrar algo como o seguinte no arquivo log: 000729 14:50:10 000729 14:50:10 000729 14:50:10 bdb: Recovery function for LSN 1 27595 failed bdb: warning: ./test/t1.db: No such file or directory Can't init databases

Significa que voc no inicializou o mysqld com --bdb-no-recover e o Berkeley DB encontrou algo errado com seus arquivos log quando ele tentou recuperar seus bancos de dados. Para poder continuar, voc deve mover o antigo arquivo log Berkeley DB do diretrio do banco de dados para outro lugar, onde poder examin-los posteriormente. Os arquivos log so nomeados log.0000000001, onde o nmero ir incrementar com o tempo. Se voc estiver executando o mysqld com suporte a tabelas BDB e o mysqld falhar no incio, pode ser devido a alguns problemas com o arquivo de recuperao BDB. Neste caso voc pode tentar iniciar o mysqld com --bdb-no-recover. Se isto ajudar, ento voc pode remover todos os arquivos log.* do diretrio de dados e tentar iniciar o mysqld novamente. Se voc obter o seguinte erro, significa que algum outro programa (ou outro servidor mysqld) j est usando a porta TCP/IP ou socket mysqld est tentando usar: Can't start server: Bind on TCP/IP port: Address already in use ou Can't start server: Bind on unix socket... Use ps para ter certeza que voc no tem outro servidor mysqld em execuo. Se voc no consegue encontrar outro servidor, voc pode tentar executar o comando telnet sua_maquina numero_porta_tcp-ip e apertar ENTER vrias vezes. Se voc no obter uma 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 Seco 2.4.1, Problemas Executando o mysql_install_db e Seco 4.2, Executando Mltiplos MySQL Servers na Mesma Mquina. Se o mysqld est atualmente em execuo, voc pode verificar as configuraes que ele est usando executando este comando: 108

Instalao do MySQL

shell> mysqladmin variables ou shell> mysqladmin -h 'your-host-name' variables Se voc obter o Errcode 13, que significa Permission denied, ao iniciar o mysqld isto significa que voc no pode ter o direito de leitura/criao de arquivos no diretrio do banco de dados ou log. Neste caso voc tambm deve iniciar o mysqld como usurio root ou alterar a permisso para os arquivos e diretrios envolvidos para uqe voc tenha o direito de us-los. Se o mysqld_safe inicia o servidor mas voc no consegue se conectar a ele, tenha certeza que voc tem uma entrada no arquivo /etc/hosts que parece com isto: 127.0.0.1 localhost

Este problema s ocorre em sistemas que no possuem uma biblioteca thread funcional e para o qual o MySQL deve estar configurado para usar MIT-pthreads. Se voc no consegue iniciar o mysqld voc pode tentar criar um arquivo para rastreamento de erros (trace) para encontrar o problema. See Seco E.1.2, Criando Arquivos Trace (Rastreamento). Se voc estiver utilizando tabelas InnoDB, procure pelas opes especificas de inicializao do InnoDB. See Seco 7.5.3, Opes de Inicializao do InnoDB. Se voc estiver usando tabelas BDB (Berkeley DB), voc deve se familiarizar com as diferentes opes especificas de inicializao do BDB. Seco 7.6.3, Opes de Inicializao do BDB.

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 servidor. O script mysql.server pode ser usado para inicializar ou parar o servidor utilizando-o com os argumentos start ou stop: shell> mysql.server start shell> mysql.server stop mysql.server pode ser encontrado no diretrio share/mysql sob o diretrio de instalao do MySQL ou no diretrio support-files da rvore fonte do MySQL. Note que se voc usa o pacote RPM do Linux (MySQL-server-VERSO.rpm), o script mysql.server j estar instalada como /etc/init.d/mysql - voc no precisa instal-lo manualmente. Veja Seco 2.1.2, Instalando o MySQL no Linux para mais informaes sobre pacotes RPM Linux. No Mac OS X, voc pode instalar um pacote do MySQL Startup Item separado para habilitar a inicializao automtica do MySQL no boot so sistema. Veja Seco 2.1.3, Instalando o MySQL no Mac OS X para maiores detalhes. Antes do mysql.server iniciar o servidor, ele vai para o diretrio de instalao do MySQL, e ento chama o mysqld_safe. Voc pode precisar editar o mysql.server se tiver uma distribuio binria instalada em um local no-padro. Modifique-o para chamar o diretrio (cd) apropriado antes de executar o safe_mysql. Se voc deseja que o servidor seja executado com um usurio especfico, adicione uma linha user apropriada para o arquivo /etc/my.cnf, como ser visto posteriormente nesta seo. 109

Instalao do MySQL

mysql.server stop desliga o servidor MySQL enviando um sinal para ele. Voc pode desligar o servidor manualmente executando mysqladmin shutdown. Voc precisa adicionar estes comandos start e stop nos lugares apropriados de seus arquivos / etc/rc.* quando voc quiser iniciar o MySQL automaticamente no seu servidor. On most current Linux distributions, it is sufficient to copy the file mysql.server into the / etc/init.d directory (or /etc/rc.d/init.d on older Red Hat systems). Afterwards, run the following command to enable the startup of MySQL on system bootup: shell> chkconfig --add mysql.server No FreeBSD o script de inicializao normalmente deve ir no diretrio / usr/local/etc/rc.d/. A pgina do manual rc(8) tambm diz que os scripts neste diretrio s so executados, se o seu nome de base corresponder padro global da sheel *.sh. Qualquer outro arquivo ou diretrio presente dentro do diretrio so silenciosamente ignorados. Em outra palavras, no FreeBSD voc deve instalar o arquivo mysql.server como / usr/local/etc/rc.d/mysql.server.sh para habilitar a inicializao automtica. Como uma alternativa para o exposto acima, alguns sistemas operacionais tambm usam / etc/rc.local ou /etc/init.d/boot.local para inicializar servios adicionais durante o boot. Para iniciar o MySQL usando este mtodo, voc poderia poderia adicionar algo 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 /etc/my.cnf. Um tpico arquivo /etc/my.cnf pode parecer com isto: [mysqld] datadir=/usr/local/mysql/var socket=/var/tmp/mysql.sock port=3306 user=mysql [mysql.server] basedir=/usr/local/mysql O script mysql.server entende as seguintes opes: datadir, basedir e pid-file. A seguinte tabela mostra quais grupos de opes cada script de inicializao l dos arquivos de opes: Script mysqld Grupos de opes [mysqld], [server] e [mysqld-major-version]

mysql.ser [mysql.server], [mysqld], e [server] ver mysqld_sa [mysql.server], [mysqld], e [server] fe

Para compatibilidade com verses anteriores, o mysql.server tambm l o grupo [mysql_server] e mysqld_safe tambm l o grupo [safe_mysqld]. No entanto, voc deve atualizar os seus arquivos de opes para usar os grupos [mysql.server] e [mysqld_safe]. See Seco 4.1.2, Arquivo de Opes my.cnf.

2.5. Atualizando/Desatualizando o MySQL


110

Instalao do MySQL

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

2.5.1. Atualizando da Verso 4.0 para 4.1


Varias comportamentos visveis foram alteradas entre o MySQL 4.0 e o MySQL 4.1 para corrigir erros crticos e tornar o MySQL mais compatvel com o padro ANSI SQL. Estas alteraes podem afetar sua aplicao. 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 ltimas distribuies do MySQL 4.0 (a paritr da 4.0.12) a opo de inicializao --new para o mysqld. Esta opo lhe d o comportamento da verso 4.1 para as alteraes mais crticas. Voc tambm pode habilitar estes comportamentos para a conexo de uma determinado cliente com o comando SET @@new=1, ou desabilit-lo se ele for iniciado com SET @@new=0. Se voc acredita que algumas das alteraes da verso 4.1 o afetaro, recomendamos que antes de atualizar para a verso 4.1, voc faa o download da ltima distribuio do MySQL 4.0 e o execute com a opo --new adicionando o seguinte ao seu arquivo de configurao: [mysqld-4.0] new Deste modo voc pode testar o novo comportamento com seus aplicativos na verso 4.0 para certificar-se que eles funcionam. Isto o ajudar a ter uma transio suave quando realizar uma atualizao completa do MySQL 4.1. Fazendo isto do modo acima ir assegurar que voc no execute acidentalemte a verso 4.1 com a opo --new mais tarde. A seguinte lista descreve alteraes que podem afetar aplicaes e que voc deve observar ao atualizar para a verso 4.1: TIMESTAMP agora retornado como uma string com o formato 'YYYY-MM-DD HH:MM:SS'. (A opo --new pode ser usada a partir da verso 4.0.12 para fazer um servidor 4.0 se comportar como 4.1 a este respeito.) Se voc quiser t-lo com um nmero (como a Verso 4.0 faz) deve-se adicionar +0 a coluna TIMESTAMP a eles: 111

Instalao do MySQL

mysql> SELECT ts_col + 0 FROM tbl_name; Tamanhos de display para TIMESTAMP no so mais suportados. Por exemplo, se voc declarar um coluna como TIMESTAMP(10), o (10) ignorado. Esta mudana era necessria para compatibilidade com os padres SQL. Em uma verso futura. Em uma verso futura, uma alterao adicional ser feita (compatvel com verses anteriores com esta mudaa), permitindo que o tamanho do timestamp indique o nmero desejado de dgitos de fraes de um segundo. Valores binrios (0xFFDF) agora so assumidos como strings em vez de nmeros. Isto corrige o problema com conjunto de caracteres onde conveniente colocar a string como um valor binrio. Com esta alterao voc deve usar CAST() se voc quiser comparar valores binrios numericamente como inteiros: SELECT CAST(0XFEFF AS UNSIGNED INTEGER) < CAST(0XFF AS UNSIGNED INTEGER) Se voc no usa CAST(), uma comparao lexicogrfica da string ser feita: mysql> SELECT 0xFEFF < 0xFF; -> 1 Usando itens binrios em um contexto numrico ou comparando-os usando o operador = deve funcionar como antes. (A opo --new pode ser usado para fazer o servidor 4.0 se comportar como 4.1 a partir da verso 4.0.13.) Para funes que produzem um valor DATE, DATETIME, ou TIME, o resultado retornado para o cliente agora est corrigido para ter um tipo temporal. Por exemplo, no MySQL 4.1, voc tem este resultado: mysql> SELECT CAST("2001-1-1" as DATETIME); -> '2001-01-01 00:00:00' No MySQL 4.0, o resultado diferente: mysql> SELECT CAST("2001-1-1" as DATETIME); -> '2001-01-01' Valores DEFAULT no podem mais ser especificado para colunas AUTO_INCREMENT (Na verso 4.0, um valor DEFAULT ignorado sem aviso, na 4.1 ocorre um erro). LIMIT no aceita mais argumentos negativos. Use 18446744073709551615 em vez de -1. SERIALIZE no mais uma opo vlida para sql_mode. Deve-se usar SET TRANSACTION ISOLATION LEVEL SERIALIZABLE. SERIALIZE tambm no mais vlido para a opo --sql-mode do mysqld. Use --transaction-isolation=SERIALIZABLE Todas tabelas e colunas strings agora tm um conjunto de caracter. See Captulo 9, Conjunto de Caracteres Nacionais e Unicode. A informao do conjunto de caracteres mostrada por SHOW CREATE TABLE e mysqldump. (O MySQL verso 4.0.6 e acima pode ler o novo arquivo dump; verses mais antigas no podem.) O formato de definio de tabela usado nos arquivos .frm mudaram um pouco na verso 4.1. O MySQL 4.0.11 e adiante lem o novo formato .frm diretamente, mas verses mais antigas no podem. Se voc precisa mover tabelas da verso 4.1. para uma mais nova que a 4.0.11, voc de usar mysqldump. See Seco 4.9.7, mysqldump, Descarregando a Estrutura de Tabelas e Dados. Se voc estiver executando vrios servidores na mesma mquina Windows, voc deve usar uma 112

Instalao do MySQL

opo --shared_memory_base_name diferentes para cada mquina A interface para agrupar funes UDF alterou um pouco. Voc deve agora declarar uma funo xxx_clear() para cada funo de agrupamento.

Em geral, atualizar para o MySQL 4.1 a partir de uma verso mais nova do MySQL envolve os serguintes passos: Verifique na seo de alteraes se houve alguma mudana que pode afetar a sua aplicao. Leia os novos itens da verso 4.1 para ver quais itens interessantes que voc pode usar na verso 4.1. See Seco D.2, Alteraes na distribuio 4.1.x (Alpha). Se voc estiver executando o MySQL Server no Windows, veja tambm Seco 2.5.8, Atualizando o MySQL no Windows. Aps o upgrade, atualize a tabela de permisses para gerar uma nova coluna Password maior que necessria para tratamento seguro de senhas. O procedimento usa mysql_fix_privilege_tables e est descrito em Seco 2.5.6, Atualizando a Tabela de Permisses. Estratgias alternativas para tratamento de senhas depois de uma atualizao esto descritos posteriormente nesta seo.

O mecanismo de hashing da senha foi alterado na verso 4.1 para fornecer maior segurana, mas ele pode causar problemas de compatibilidade se voc ainda tiver clientes que usam a biblioteca cliente 4.0 ou anterior. ( bastante indesejvel que voc tenha clientes 4.0 em situaes onde o cliente conecta de uma mquina remota que ainda no tenha sido atualizada para a verso 4.1). A seguinte lista indica algumas estratgias possveis de atualizao. Elas representam o que se deve fazer para escolher se ter compatibilidade com clientes antigos e ter maior segurana. No atualizar para a verso 4.1. Nenhum comportamento ser alterado, mas claro que voc no poder usar qualquer um dos novos recursos fornecido pelo protocolo cliente/servidor da verso 4.1. (O MySQL 4.1 tem um protocolo cliente/servidor extendido que oferece tais recursos como instrues preparadas e conjuntos de mltiplos resultados.) See Seco 12.1.4, Instrues Preparadas da API C. Atualizar para a verso 4.1 e executar o script mysql_fix_privilege_tables para aumentar a coluna Password na tabela user e assim poder guardar hashes de senhas longos. Mas execute o servidor com a opo --old-passwords para fornecer compatibilidade com verses anteriores que premitem que clientes pre-4.1 continuem a conectar em suas contas de hash curto. Eventualmente, quando todos os seus clientes estiverem atualizados para a verso 4.1, voc pode parar de usar a opo do servidor --old-passwords. Voc tambm pode alterar as senhas em sua conta MySQL para usar o novo formato que mais seguro. Atualizar para verso 4.1 e executar o script mysql_fix_privilege_tables para aumentar a coluna Password na tabela user. Se voc sabe que todos os clientes tambm foram atualizados para a verso 4.1, no execute o servidor com a opo --old-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.

Informaes adicionais sobre hashing de senha em relao a autenticao no cliente e operaes de alterao de senha podem ser encontrados em Seco 4.3.11, Hashing de Senhas no MySQL 4.1.

2.5.2. Atualizando da Verso 3.23 para 4.0


Em geral, o que voc deve fazer atualizar para a verso 4.0 um verso mais nova do MySQL: Aps o upgrade, atualize a tabela de permisses para adicionar novos privilgios e recursos. O 113

Instalao do MySQL

procedimento usa o script mysql_fix_privilege_tables e est descrito em Seco 2.5.6, Atualizando a Tabela de Permisses. Edite qualquer script de inicializao ou arquivo de configurao para no utilizar nenhuma das opes obsoletas listadas posteriormente nesta seo. 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 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 de dados so ISAM ou MyISAM. Para evitar a converso de tabelas de outros tipos para MyISAM, voc pode listar explicitamente o nome de suas tabelas ISAM depois do nome do banco de dados na linha de comando. Voc tambm pode executar uma instruo ALTER TABLE table_name TYPE=MyISAM para cada tabela ISAM para convert-la para MyISAM. Para descobir o tipo de uma determinada tabela, use esta instruo: mysql> SHOW TABLE STATUS LIKE 'tbl_name'; Certifique-se de que voc no tem nenhum cliente MySQL que utiliza bibliotecas compartilhadas (com o Perl DBD-mysql). Se voc tiver, voc deve recompil-las j que 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 fizer o acima, mas voc no poder usar os novos privilgios de segurana pois o MySQL 4.0 e voc podem encontrar problemas ao atualizar o MySQL para a verso 4.1 ou mais nova. O formato do arquivo ISAM ainda funciona no MySQL 4.0 mas est obsoleto e ser disabilitado (no compilado por padro) 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. Mesmo se voc fizer o indicado acima, voc ainda pode voltar para o MySQL 3.23.52 ou mais novo se voc encontrar problemas com o MySQL da srie 4.0. Neste caso voc deve usar o mysqldump para fazer um dump de qualquer tabela que use um ndice full-text e recarregar o arquivo de dump no servidor 3.23 (pois o 4.0 usa um novo formato para ndices full-text). A seguir est uma lista mais completa com o que deve ser observado para atualizar para a verso 4.0; O MySQL 4.0 tem vrios novos privilgios na tabela mysql.user. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE. Para fazer estes novos privilgios funcionarem, deve se atualizar a tabela de permisses. O procedimento est descrito em Seco 2.5.6, Atualizando a Tabela de Permisses. At que este script esteja executando todos os usurios tm os privilgios SHOW DATABASES, CREATE TEMPORARY TABLES e LOCK TABLES. Os privilgios SUPER e EXECUTE tiram o seu 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 usar os novos privilgios. Se voc no est usando o comando GRANT nos scripts, este um bom momento para alterar os seus scripts e usar GRANT em vez de modificar a tabela de permisses diretamente. A partir da verso 4.0.2 a opo --safe-show-database est obsoleta (e no faz mais nada). See Seco 4.3.3, Opes de Inicializao para o mysqld em Relao a Segurana.. 114

Instalao do MySQL

Se voc receber um erro Access denied para novos usurios na verso 4.0.2, voc deve verificar se voc precisa de alguma das novas concesses que voc no precisava antes. Em particular, voc precisar REPLICATION SLAVE (em vez de FILE) para novos slaves. safe_mysqld renomeado para mysqld_safe. Para compatibilidade com verses anteriores, as distribuies binrias, iro, por algum tempo, incluir safe_mysqld como um link simblico para mysqld_safe. Suporte para InnoDB agora est includo na distribuio binria. Se voc contruir o MySQL a partir de um fonte, o InnoDB est configurado por padro, Se voc no usar o InnoDB e quiser economizar memria ao executar o servidor que possui suorte a InnoDB habilitado, use a opo de inicializao do servidor. Para compilar o MySQL sem suporte ao InnoDB, execute configure com a opo --without-innodb. O parmetro de inicializao myisam_max_extra_sort_file_size e myisam_max_extra_sort_file_size so dados agora em bytes. (eram dados em megabytes antes da verso 4.0.3). O lock de sistema externo dos arquivos MyISAM/ISAM agora est desligado por padro. Pode se lig-los fazendo --external-locking. (Para a maioria dos usurios isto nunca necessrio). A seguintes variveis/opes de inicializaao foram renomeadas: 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)

Nome Antigo myisam_bulk_insert_tree_size query_cache_startup_type record_buffer record_rnd_buffer sort_buffer warnings --err-log

As opes de inicializao record_buffer, sort_buffer e warnings ainda funcionaro no MySQL 4.0 mas estp obsoletas. As seguintes veriveis SQL mudaram o nome. Novo Nome. BIG_TABLES LOW_PRIORITY_UPDATES MAX_JOIN_SIZE QUERY_CACHE_TYPE

Nome Antigo SQL_BIG_TABLES SQL_LOW_PRIORITY_UPDATES SQL_MAX_JOIN_SIZE SQL_QUERY_CACHE_TYPE

Os nomes antigos ainda funcionam no MySQL 4.0 mas esto obsoletos. Voc deve usar SET GLOBAL SQL_SLAVE_SKIP_COUNTER=#. SQL_SLAVE_SKIP_COUNTER=# em vez de SET

As opes de inicializao --skip-locking e --enable-locking foram renomeadas para --skip-external-locking e --external-locking. SHOW MASTER STATUS agora retorna um conjunto vazio se o log binrio no estiver habilitado.

115

Instalao do MySQL

SHOW SLAVE STATUS agora retorna um conjunto vazio se o slave no est inicializado. O mysqld agora tem a opo --temp-pool habilitada por padro j que isto da melhor rendimento com alguns SO (Principalmente no Linux). Colunas DOUBLE e FLOAT agora respeitam o parmetro UNSIGNED no armazenamento (antes, UNSIGNED era ignortado por estas colunas). ORDER BY coluna DESC ordena valores NULL por ltimo, como no MySQL 4.0.11. Na verso 3.23 e anteriores da verso 4.0, isto nem sempre era consistente. SHOW INDEX tem duas colunas a mais (Null e Index_type) que ele tinha nas verses 3.23. CHECK, SIGNED, LOCALTIME e LOCALTIMESTAMP so agora palavras reservadas. O resultado de todos os operadores bitwise (|, &, <<, >> e ~) agora so unsigned. Isto pode causar problemas se voc estiver usando-as em um contexto onde voc quer um resultado com sinal. See Seco 6.3.5, Funes de Converso. Nota: quando voc usa subtrao entre valores inteiros onde um deles do tipo UNSIGNED, o resultado ser sem sinal. Em oyras palavras, antes de atualizar para o MySQL 4.0, voc deve verificar sua aplicao para os casos onde voc est subtraindo um valor de uma entidade sem sinal e quer um nmero negativo como resposta ou subtraindo um valor sem sinal de uma coluna do tipo inteiro. Voc pode disabilitar este comportamento usando a opo -sql-mode=NO_UNSIGNED_SUBTRACTION ao iniciar o mysqld. See Seco 6.3.5, Funes de Converso. Para usar MATCH ... AGAINST (... IN BOOLEAN MODE) com suas tabelas, voc precisa recontru-las com REPAIR TABLE nome_tabela USE_FRM. LOCATE() e INSTR() so caso sensitivo se um dos argumentos uma string binria. De outra forma elas so caso-insensitivo. STRCMP() agora usa o conjunto de caracteres atual ao fazer comparaes, o que significa que o comportamento padro das comparaes agora caso-insensitivo. 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 chama HEX() com um argumento numrico. Na verso 3.23, INSERT INTO ... SELECT sempre tem o IGNORE habilitado. Na verso 4.0.1, o MySQL ir parar (e possvelmente fazer um roll back) por padro no caso de 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. um erro se voc no especificar IGNORE. As funes antigas da API C mysql_drop_db(), mysql_create_db() e mysql_connect() no s mais suportadas a menos que voc compile o MySQL com CFLAGS=-DUSE_OLD_FUNCTIONS. No entanto, prefervel alterar o cliente para utilizar a nova API 4.0. Na estrutura MYSQL_FIELD, length e max_length foram alterados de unsigned int para unsigned long. Isto no deve causar problemas, exceto que eles podem gerar mensagens de avisos quando quando usado como argumento em uma classe printf() de funes. Voc deve usar TRUNCATE TABLE quando quiser deletar todos os registros de uma tabela e voc no precisa obter uma contagen de quantas colunas forma deletadas. (DELETE FROM table_name retorna a contagem de linhas na verso 4.0, e TRUNCATE TABLE mais rpido.) Voc receber um erro se tiver um LOCK TABLES ativo ou transaes ao tentar executar TRUNCATE TABLE ou DROP DATABASE. 116

Instalao do MySQL

Voc deve usar inteiros para armazenar valores em colunas BIGINT (em vez de usar strings, como voc fez no MySQL 3.23). Usar strings ainda funicona, mas usar inteiros mais eficiente. O formato de SHOW OPEN TABLE alterou. Clientes multi-thread devem usar mysql_thread_init() e mysql_thread_end(). See Seco 12.1.14, Como Fazer um Cliente em Threads. Se voc quiser recompilar o mdulo Perl DBD::mysql, voc deve conseguir o DBD-mysql verso 1.2218 ou mais novo porque os mdulos DBD mais antigos usam a chamada obsoleta mysql_drop_db(). A verso 2.1022 ou mais nova recomendada. Na verso RAND(seed) retorna uma srie de nmero randmicas diferente que na 3.23; isto foi feito para uma diferenciao maior de RAND(seed) e RAND(seed+1). O tipo padro retornado por IFNULL(A,B) agora est configurado para ser o mais 'geral' dos tipos de A e B. (A ordem geral-para-especfco string, REAL ou INTEGER).

Se voc estiver executando o MySQL Server no Windows, veja Seco 2.5.8, Atualizando o MySQL no Windows. Se voc estiver usando replicao, veja Seco 4.11.2, Viso Geral da Implementao da Replicao.

2.5.3. Atualizando da verso 3.22 para 3.23


A Verso 3.23 do MySQL suporta tabelas do novo tipo MyISAM e do antigo tipo ISAM. Voc no necessita converter suas antigas tabelas para us-las com a verso 3.23. Por padro, todas novas tabelas sero criadas usando o tipo MyISAM (a menos que voc inicie o mysqld com a opo -default-table-type=isam). Voc pode converterr uma tabela ISAM para 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 verso 3.23. As seguintes listas dizem o que voc deve conferir quando atualizar para a verso 3.23: Todas tabelas que usam o conjunto de caracteres tis620 devem ser corrigidos com myisamchk -r ou REPAIR TABLE. Se voc fizer um DROP DATABASE em um banco de dados ligado simbolicamente, a ligao e o banco de dados original sero apagados. (Isto no acontece na 3.22 porque o configure no detecta a disponibilidade da chamada de sistema readlink). 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 TABLE a tabela , agora, bloqueada para prevenir que seja usada por outras threads. O cliente MySQL mysql , agora, inicializado por padro com a opo -no-named-commands (-g). Esta opo pode ser desabilitada com -enable-named-commands (-G). Isto pode causar problemas de imcompatibilidade em alguns casos, por exemplo, em scripts SQL que usam comandos sem ponto e vrgula! Comandos longos continuam funcionando. Funes de data que funcionam em partes de datas (como MONTH()) no retornar 0 para datas 0000-00-00. (No MySQL 3.22 estas funes retornam NULL.) Se voc estiver usando a ordem de classificao de caracteres alem para tabelas ISAM, voc deve reparar todas suas tabelas com isamchk -r, porque foram feitas alteraes na sua ordem de classificao! O tipo padro de retorno de IF() ir agora depender de ambos argumentos e no apenas do pri117

Instalao do MySQL

meiro argumento. Colunas AUTO_INCREMENT no devem ser usadas para armazenar nmeros negativos. A razo para isto que nmeros negativos causam problemas quando o -1 passa para 0. Voc no deve armazenar 0 em uma coluna AUTO_INCREMENT tambm; CHECK TABLE ir reclamar sobre valores 0 porque eles podem alterar se voc fizer um dump e restaurar a tabela. AUTO_INCREMENT , agora, tratado em um nvel mais baixo para tabelas MyISAM e muito mais rpido que antes. Para tabelas MyISAM nmeros antigos tambm no so mais reusados, mesmo se voc apagar algumas linhas da tabela. CASE, DELAYED, ELSE, END, FULLTEXT, INNER, RIGHT, THEN e WHEN agora so palavras reservadas. FLOAT(X) agora um tipo de ponto flutuante verdadeiro e no um valor com um nmero fixo de decimais. Quando estiver declarando colunas usando o tipo DECIMAL(tamanho,dec, o argumento tamanho no inclui mais um lugar para o smbolo do ponto decimal. Uma string TIME agora deve estar em um dos seguintes formatos: [[[DAYS] [H]H:]MM:]SS[.fraction] ou [[[[[H]H]H]H]MM]SS[.fraction] LIKE agora compara strings usando as mesmas regras de comparao de caracteres que o operador '='. Se voc precisa do antigo compartamento, voc pdoe compilar o MySQL com a opo CXXFLGAS=-DLIKE_CMP_TOUPPER. REGEXP agora caso insensitivo se nenhuma das strings forem binrias. Quando for necessrio dar manuteno ou reparar tabelas MyISAM .MYI deve ser usado a instruo CHECK TABLE ou o comando myisamchk. Para tabelas ISAM (.ISM), use o comando isamchk Se desejar que os arquivos mysqldump sejam compatveis entre as verses 3.22 e 3.23 do MySQL, no deve ser usados as opes --opt ou --full com o mysqldump. Confira todas suas chamadas DATE_FORMAT() para ter certeza que exista um % antes de cada caractere formatador. (Verses mais antigas que o MySQL 3.22 aceitaivam esta sintaxe.) mysql_fetch_fields_direct() agora uma funo (era uma macro) e ela retorna um 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 funo que obtem valores MYSQL_RES* como um argumento). Com um objeto MYSQL* agora voce deve usar mysql_field_count(). No MySQL Verso 3.22, a sada de SELECT DISTINCT ... era na maioria das vezes ordenada. Na Verso 3.23, voc deve usar GROUP BY ou ORDER BY para obter a sada ordenada. SUM() agora retorna NULL, em vez de 0 se no existir registros coincidentes. Isto de acordo com o ANSI SQL. Um AND ou OR com valores NULL agora retornam NULL no lugar de 0. Isto afetar, em grande parte, pesquisas que usam NOT em uma expresso AND/OR como NOT NULL = NULL. LPAD() e RPAD() reduziro a string resultante se ela for maior que o tamanho do argumento.

2.5.4. Atualizando da verso 3.21 para 3.22


Nada que afetaria a compatibilidade foi alterada entre a verso 3.21 e 3.22. A nica dificuldade que novas tabelas que so criadas com colunas do tipo DATE usaro a nova forma de armazenar a data. Voc no pode acessar esses novos campos com uma verso antiga de mysqld.

118

Instalao do MySQL

Depois de instalar o MySQL verso 3.22, voc deve iniciar o novo servidor e depois executar o script mysql_fix_privilege_tables. Isto adicionar os novos privilgios que voc precisar para usar o comando GRANT. Se voc se esquecer disto, sera retornado o erro Access denied quando voc tentar usar ALTER TABLE, CREATE INDEX ou DROP INDEX. O procedimento para atualizar a tabela de permisses est descrito em Seco 2.5.6, Atualizando a Tabela de Permisses. A interface API C para mysql_real_connect() foi alterada. Se voc tem um programa cliente antigo que chama essa funo, voc deve colocar um 0 para o novo argumento db (ou recodificar o cliente para enviar o elemento db para conexes mais rpidas). Voc tambm deve chamar mysql_init() antes de chamar mysql_real_connect()! Esta alterao foi feita para permitir nova funo mysql_options() salvar opes na estrutura do manipulador do MYSQL. A varivel key_buffer do mysqld foi renomeada para key_buffer_size, mas voc ainda pode usar o antigo nome nos seus arquivos de inicializao.

2.5.5. Atualizando da verso 3.20 para 3.21


Se voc estiver executando uma verso mais antiga que a Verso 3.20.28 e deseja mudar para a verso 3.21 voc deve fazer o seguinte: Inicie o servidor mysqld verso 3.21 com a opo --old-protocol para us-lo com clientes de uma distribuio da verso 3.20 Neste caso, a nova funo cliente mysql_errno() no ir retornar erro do servidor, somente CR_UNKNOWN_ERROR (mas isto funciona para erros de clientes) e o servidor usa a forma funo password() anterior a 3.21 para verificao, ao invs do novo mtodo. Se voc NO estiver usando a opo --old-protocol para mysqld, voc precisar fazer as seguir alteraes: Todo o cdigo cliente deve ser recompilado. Se voc usa o ODBC, deve obter o novo 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 verso do MySQL 3.20.28 e superiores podem manipular o novo formato da tabela de usurios sem afetar os clientes. Se voc tem uma verso do MySQL mais nova que 3.20.28, senhas no iro mais funcionar se voc converter a tabela de usuaios. Por segurana, voc primeiro deve fazer uma atualizao para a verso 3.20.28, pelo menos, e ento atualizar para a verso 3.21. O novo cdigo cliente trabalha com um servidor mysqld 3.20.x, portanto se houver problemas com 3.21.x voc deve usar o antigo servidor 3.20.x sem a necessidade de recompilar os clientes novamente. Se voc no est usando a opo --old-protocol para o mysqld, antigos clientes no podero se conectar e exibiro a seguinte mensagem de erro: ERROR: Protocol mismatch. Server Version = 10 Client Version = 9 A nova interface PERL DBI/DBD tambm suporta a antiga interface mysqlperl. A nica alterao que deve ser feita se voc usa o mysqlperl alterar os argumentos para a funo connect(). Os novos argumentos so: host, database, user, password (note que os argumentos user e password foram alterados de lugar). See Seco 12.5.2, A interface DBI.

119

Instalao do MySQL

As seguintes alteraes podem afetar consultas em antigas aplicaes: HAVING deve ser especificada antes de qualquer clusula ORDER BY. Os parmetros para LOCATE() foram trocados. Agora existem algumas palavras reservadasi novas. As mais notveis so DATE TIME e TIMESTAMP.

2.5.6. Atualizando a Tabela de Permisses


Algumas distribuies introduzem alteraes a estrutura da tabelas de permisses (a tabela no banco de dados mysql) para adicionar novos privilgios ou recursos. Para ter certeza de que as suas tabelas de permisses esto corretas quando voc atualizar para uma nova verso do MySQL, voc deve atualizar a sua tabela de permisso tambm. Em sistemas Unix ou semelhantes, atualize a tabela de permisses executando o script mysql_fix_privilege_tables: shell> mysql_fix_privilege_tables Voc deve executar este script enquanto o servidor est em execuo. Ele tenta se conectar ao servidor na mquina local como root. Se sua conta root exige uma senha, indique a senha na linha de comando. Para o MySQL 4.1 e acima, especifique a senha assim: shell> mysql_fix_privilege_tables --password=senha_root Antes do MySQL 4.1, especifique a senha desta forma: shell> mysql_fix_privilege_tables senha_root O script realiza mysql_fix_privilege_tables qualquer ao necessria para converter sua tabela de permisses para o formato atual. Voc pode ver alguns avisos Duplicate column name, durante a execuo, eles podem ser ignorados. 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 4.0.15. A partir desta verso, as distribuies do MySQL incluem um script SQL mysql_fix_privilege_tables.sql que voc pode executar usando o cliente mysql. Se sua instalao do MySQL est localizada em C:\mysql, o comando se parecer com este: C:\mysql\bin> mysql -u root -p mysql mysql> SOURCE C:\mysql\scripts\mysql_fix_privilege_tables.sql Se sua instalao est localizada em algum outro diretrio, ajuste o caminha apropriadamente. O comando ir lhe pedir a senha do root; digite-a quando pedido. Como no procedimento com o Unix, voc pode ver alguns avisos Duplicate column name enquanto o mysql processa as instrues no script mysql_fix_privilege_tables.sql; eles podem ser ignorados. Depois de executar o script, para o servidor e reinicie-o.

2.5.7. Atualizando para outra arquitetura


120

Instalao do MySQL

Se voc estiver usando o MySQL Verso 3.23, voc pode copiar os arquivos .frm, .MYI e .MYD para tabelas MyISAM entre diferentes arquiteturas que suportem o mesmo formato de ponto flutuante. (O MySQL cuida de cada detalhe de troca de bytes.) See Seco 7.1, Tabelas MyISAM. Os arquivos ISAM de dados e ndices (*.ISD e *.ISM respectivamente) so dependentes da arquitetura e em alguns casos dependentees do Sistema Operacional. Se voc deseja mover suas aplicaes para outra mquina que tem uma arquitetura ou SO diferentes da sua mquina atual, voc no deve tentar mover um banco de dados simplesmente copiando os arquivos para a outra mquina. Use o mysqldump. Por padro, o mysqldump ir criar um arquivo contendo declaraes SQL. Voc pode ento transferir o arquivo para a outra mquina e aliment-la como uma entrada para o cliente mysql. Utilize mysqldump --help para ver quais opes esto disponveis. Se voc est movendo os dados para uma verso mais nova do MySQL, voc deve usar mysqldump --opt com a nova verso para obter uma descarga rpida e compacta. A mais fcil (mas no a mais rpida) forma para mover um banco de dados entre duas mquinas executar os seguintes comandos na mquina em que o banco de dados se encontra: shell> mysqladmin -h 'nome da outra maquina' create nome_bd shell> mysqldump --opt nome_bd \ | mysql -h 'nome da outra maquina' nome_bd Se voc deseja copiar um banco de dados de um mquina remota sobre uma rede lenta, pode ser usado: shell> mysqladmin create nome_bd shell> mysqldump -h 'nome de outra maquina' --opt --compress nome_bd \ | mysql nome_bd O resultado pode tambm ser armazenado em um arquivo, depois transfira o arquivo para a mquina destino e carregue o arquivo no banco de dados. Por exemplo voc pode descarregar um banco de dados para um arquivo na mquina origem desta forma: shell> mysqldump --quick nome_bd | gzip > nome_bd.contents.gz (O arquivo criado neste exemplo est compactado.) Transfria o arquivo contendo o contedo do banco de dados para a mquina destino e execute estes comandos: 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 dados. Para grandes tabelas, isto muito mais rpido do que usar simplesmente mysqldump. Nos comandos abaixo, DUMPDIR representa o caminho completo do diretrio que voc utiliza para armazenar a sada de mysqldump. Primeiro, crie o diretrio para os arquivos de sada e descarregue o banco de dados: shell> mkdir DUMPDIR shell> mysqldump --tab=DUMPDIR nome_bd Depois transfira os arquivo no diretrio DUMPDIR para algum diretrio correspondente na mquina destino e carregue os arquivos no MySQL assim: 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

121

Instalao do MySQL

No se esquea de copiar o banco de dados mysql tambm, porque nele que as tabelas de permisses (user, db e host) so armazenadas. Voc pode ter que executar comandos como o usurio root do MySQL na nova mquina at que voc tenha o banco de dados mysql no lugar. Depois de importar o banco de dados mysql para a nova mquina, execute mysqladmin flush-privileges para que o servidor recarregue as informaes das tabelas de permisses.

2.5.8. Atualizando o MySQL no Windows


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

5. 6. 7.

8. 9.

Situaes de erros possveis: A system error has occurred. System error 1067 has occurred. The process terminated unexpectedly. Este erro significa que seu arquivo my.cnf (por padro C:\my.cnf) contm uma opo que no pode ser reconhecido pela MySQL. Voc pode verificar que este o caso tentando reiniciar o MySQL com o arquivo my.cnf renomeado, por exemplo, para my_cnf.old para prevenirt o servidor de us-lo. Uma vez verificado isto, voc precisa identificar qual parmetro o culpado. Crie um novo arquivo my.cnf e mova as partes do arquivo antigo para ele (reiniciando o servidor depois de mover cada parte) at que voc determine qual opo est fazendo a inicializao do servidor falhar.

2.6. Notas especficas para os Sistemas Operacionais


2.6.1. Notas Windows
Esta seo descreve assuntos especficos para usar MySQL no Windows.

122

Instalao do MySQL

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 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 paga que encontrei o SecureCRT da http://www.vandyke.com/. Outra opo o f-secure da http://www.f-secure.com/. Voc tambm pode encontrar algumas verses livres no Google em http://directory.google.com/Top/Computers/Security/Products_and_Tools/Cryptography/SSH/ Clients/Windows/. Inicie seu cliente SSH Windows. Configure Host_Name = IP_ou_Nome_servidormysql. Configure userid=seu_userid para logar no seu servidor. Este valor userid no pode ser o mesmo do nome do usurio se sua conta MySQL. Configure a porta de acesso. E tambm faa um acesso remoto (Configure local_port: 3306, remote_host: ip_ou_nomeservidormysql, remote_port: 3306 ) ou um acesso local (configure port: 3306, host: localhost, remote port: 3306). Salve tudo, seno voc ter que refazer tudo da prxima vez. Logue ao seu servidor com a sesso SSH que acabou de ser criada. Na sua mquina Windows, inicie algumas aplicaes ODBC (como o Access). 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 mquina servidora MySQL --- no nomeservidormysql.

2.

3.

4. 5. 6. 7.

Voc agora deve ter uma conexo ODBC ao MySQL, criptografada com SSH.

2.6.1.2. Compilando clientes MySQL no Windows


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

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 mesmos recursos que sua verso correspondente Unix com as seguintes excees: Win95 e threads O Win95 perde aproximadamente 200 bytes de memria principal para cada thread criada. Cada 123

Instalao do MySQL

conexo no MySQL cria uma nova thread, portanto voc no deve executar o mysqld por um longo tempo no Win95 se seu servidor lida com vrias conexes! WinNT e Win98 no sofrem deste bug. Leituras simultneas O MySQL depende das chamadas pread() e pwrite() para estar apto a misturar INSERT e SELECT. Atualmente ns usamos mutexes para emular pread()/pwrite(). Ns iremos, a longo prazo, trocar o nvel da interface de arquivos com uma interface virtual para que ns possamos usar a interface readfile()/writefile() no NT/2000/XP para obter mais velocidade. A implementao atual limita o nmero de arquivos abertos que o MySQL pode usar para 1024, o que significa que voc no conseguir executar tantas threads simultneas no NT/ 2000/XP como no Unix. Leitura de blocos O MySQL usa uma leitura de blocos para cada conexo, que tem as seguintes implicaes: Uma conexo no ir ser disconectada automaticamente depois de 8 horas, como acontece com a verso Unix do MySQL. Se uma conexo trava, impossvel a finaliza-la sem matar o MySQL. mysqladmin kill no ir funcionar em uma conexo adormecida. mysqladmin shutdown no pode abortar enquanto existirem conexes adormecidas.

Planejamos corrigir este problema quando nossos desenvolvedores Windows tiverem conseguido um boa soluo. DROP DATABASE Voc no pode remover um banco de dados que est em uso por alguma thread. Matando o MySQL do gerenciador de tarefas Voc no pode matar o MySQL do gerenciador de tarefas ou com o utilitrio shutdown no Win95. Voc deve deslig-lo com mysqladmin shutdown. Nomes case-insensitivo Nomes de arquivos no so caso sensitivo no Windows, portanto, nomes de bancos de dados e tabelas do MySQL tambm no so caso sensitivo no Windows. A nica restrio que os nomes de bancos de dados e tabelas devem usar o mesmo caso em uma sentena fornecida. See Seco 6.1.3, Caso Sensitivo nos Nomes. O caracter de diretrio \ Componentes de nomes de caminho no Win95 so separados pelo caracter \ o qual tambm o caractere de escape no MySQL. Se voc estiver usando LOAD DATA INFILE ou SELECT ... INTO OUTFILE, use nomes de arquivo no estilo Unix com caracteres /: mysql> LOAD DATA INFILE "C:/tmp/skr.txt" INTO TABLE skr; mysql> SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr; Uma alternativa dobrar o caracter /: mysql> LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr; mysql> SELECT * INTO OUTFILE 'C:\\tmp\\skr.txt' FROM skr;

124

Instalao do MySQL

Problems with pipes. Pipes no funcionam com confiana na linha de comando do Windows. Se o pipe incluir o caracter ^Z / CHAR(24), o Windows achar que ele encontrou o fim de um arquivo e abortar o programa. Isto um problma principalmente quando se tenta aplicar um log binrio como a seguir: mysqlbinlog binary-log-name | mysql --user=root Se voc obter um problema aplicando o log e suspeitar que seja devido a um caracter ^Z/CHAR(24) voc pode usar a seguinte alternativa: mysqlbinlog binary-log-file --result-file=/tmp/bin.sql mysql --user=root --eexecute "source /tmp/bin.sql" O ltimo comando pode tambm ser usado para leitura em qualquer arquivo sql que contenha dados binrios.

erro: Can't open named pipe Se voc utiliza um servidor MySQL verso 3.22 no NT com o os programas clientes MySQL mais novos, ser apresentado o seguinte erro: error 2017: can't open named pipe to host: . pipe... Isto ocorre porque a verso do MySQL usa named pipes no NT por padro. Voc pode evitar este erro usando a opo --host=localhost para os novos clientes MySQL ou criar um arquivo de opes c:\my.cnf que contenha a seguinte informao: [client] host = localhost A partir da verso 3.23.50, named pipes so habilitados somente se o mysqld-nt ou mysqld-nt-max for iniciado com a opo --enable-name-pipe.

Erro Access denied for user Se voc tenta executar um programa cliente MySQL para conectar a um servidor em execuo na mesma mquina, nas obtem o erro Access denied for user: 'someuser@unknown' to database 'mysql' quando acessar um servidor MySQL na mesma mquina, signifca que o MySQL no pode resolver seu nome de mquina corretamente. Para corrigir isto, voc deve criar um arquivo \Windows\hosts com a seguinte informao: 127.0.0.1 localhost

ALTER TABLE Enquanto voc est executando uma instruo ALTER TABLE, a tabela est bloqueada 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. No futuro, podemos encontrar algum modo de contornarmos este problema.

125

Instalao do MySQL

DROP TABLE DROP TABLE em uma tabela que est em uso por uma tabela MERGE no funcionar no Windows porque o manipulador do MERGE faz o mapeamento da tabela escondido da camada superior do MySQL. Como o Windows no permite que voc delete arquivos que esto abertos, voc primeiro deve descarregar todas as tabelas MERGE (com FLUSH TABLES) ou apagar a tabela MERGE antes de deletar a tabela. Corrigiremos isto assim que introduzirmos views.

DATA DIRECTORY e INDEX DIRECTORY As opes DATA DIRECTORY e INDEX DIRECTORY para CREATE TABLE so ignoradas no Windows, porque ele no suporta links simblicos.

Aqui esto alguns assuntos em aberto para qualquer um que queira melhorar o MySQL no Windows: Adicionar alguns cones agradveis para o start e shutdown na instalao do MySQL. 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 mysqldump) seria timo. Seria muito bom se as funes de leitura e escrita no socket em net.c fosse interrompveis. Isto tornaria possvel matar threads abertas com mysqladmin kill no Windows. Adicionar macros para usar os mtodos mais rpidos de incremento/decremento de threads seguras fornecidos pelo Windows.

2.6.2. Notas Linux (Todas as verses)


As notas abaixo a respeito da glibc aplicam-se somente na situao quando o MySQL construido por voc mesmo. Se voc est executando Linux em uma mquina x86, na maioria dos casos muito melhor para voc usar nosso binrio. Ns ligamos nossos binrios com a melhor verso alterada da glibc, podemos escolher as melhores opes do compilador, em uma tentativa de torn-la funcional para um servidor muito exigido. Para um usurio comum, mesmo para configuraes com vrias conexes concorrentes e/ou tabelas excedendo o limite de 2 GB, nosso binrio , na maioria das vezes, a melhor escolha. Portanto se voc ler o texto abaixo, e est em dvida sobre o que deve fazer, tente usar o nosso binrio primeiro para ver se ele preenche suas necessidades, e preocupe-se com uma construo prpria apenas se voc descobrir que nosso binrio no bom o suficiente para voc. Neste caso, iramos apreciar se fosse feito uma observao sobre isto, para que possamos fazer uma melhor verso binris da prxima vez. O MySQL usa LinuxThreads no Linux. Se voc usa uma verso do Linux que no tenha a glibc2, voc deve instalar LinuxThreads antes de tentar compilar o MySQL. Voc pode 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 sistema ficar mais rpido e mais estvel. Perceba que as verses da glibc iguais ou anteriores Verso 2.1.1 tem um bug fatal no tratamento do pthread_mutex_timedwait, que usado quando voc executar instrues INSERT DELAYED. Recomendamos no usar INSERT DELAYED antes de atualizar a glibc. Se voc planeja ter mais de 1000 conexes simultneas, ser necessrio fazer algumas alteraes na LinuxThreads, recompile-a e religue o MySQL ao novo libpthread.a. Aumente PTHRE126

Instalao do MySQL

AD_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 600-1000 conexes se o valor de STACK_SIZE for o padro de 2MB. Se voc tiver um problema com o MySQL, no qual ele no consiga abrir vrios arquivos ou conexes, pode ser que voc no tenha configurado o Linux para lidar com o nmero de arquivos suficiente. No Linux 2.2 e posteriores, voc pode conferir o valor para a alocao dos arquivos fazendo: 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 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 neste caso, os antigos limites voltaro a ser usados na prxima vez que o computador for reiniciado. De forma alternativa, voc pode configurar estes parmteros durante a inicializao usando a ferramenta sysctl, que usada por muitas distribuies Linux (No SuSE a partir da verso 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 constante STACK_SIZE na LinuxThreads controla o espaamento das pilhas threads no espao de endereamento. Ela necessita ser grande o bastante para que tenha espao o suficiente 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 mmap(), como descobrimos em experincias, ir desmapear uma regio j mapeada se voc solicitar o mapeamento de um endereo j em uso, zerando os dados de toda a pgina ao invs de retoernar. um erro. Portanto a segurana do mysqld ou qualquer outra aplicao baseada em threads depende do comportamento gentil do cdigo que cria as threads. O usurio deve tomar medidas para certirficar-se que o nmero de threads em funcionamento em qualquer hora seja suficientemente baixo para que as pilhas das threads permaneam longe do monte global. Com mysqld voc deve reforar este comportamento "gentil" configurando um valor razovel para a varivel max_connections. Se voc mesmo construiu o MySQL e no deseja confuses corrigindo LinuxThreads, voc deve configurar max_connections para um valor mximo de 500. Ele ainda deve ser menor se voc tiver uma chave grande para o buffer, grandes tabelas heap, ou outras coisas que fazem o mysqld alocar muita memria ou se voc estiver executando um kernel 2.2 com o patch de 2GB. Se voc estiver usando nosso binrio ou RPM verso 3.23.25 ou posterior, voc pode seguramente configurar max_connections para 1500, assumindo que no h uma grande chave de buffer ou tabelas heap com grande quantidade de dados. Quanto mais voc reduz STACK_SIZE em LinuxThreads mais threads voc pode criar seguramente. Recomendamos os valores entre 128K e 256K.

127

Instalao do MySQL

Se voc usa vrias conexes simultneas, voc pode sofrer com um "recurso" do kernel 2.2 que penaliza um processo por bifurcar-se ou clonar um filho na tentativa de prevenir um ataque de separao. Isto faz com que o MySQL no consiga fazer uma bom escalonamento, quando o nmero de clientes simultneos cresce. Em sistemas com CPU nica, temos visto isto se manifestar em uma criao muito lenta das threads, tornando a conexo ao MySQL muito lenta. Em sistemas de mltiplas CPUs, temos observado uma queda gradual na velocidade das consultas quando o nmero de clientes aumenta. No processo de tentar encontrar uma soluo, recebemos um patch do kernel de um de nossos usurios, que alega fazer muita diferena para seu site. O patch est disponvel aqui (http://www.mysql.com/Downloads/Patches/linux-fork.patch). Atualmente temos feito testes extensivos deste patch nos sistemas de desenvolvimento e produo. A performance do MySQL obtem uma melhora significativa, sem causar problemas e atualmente o recomendamos para nossos usurios que continuando trabalhando com 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 que aplicar um patch ao seu kernel 2.2, pode ser mais fcil simplesmente atualizar para o 2.4, que lhe dar tambm uma melhora em seu sistemas SMP em adio correo do bug discutido aqui. Estamos testando o MySQL no kernel 2.4 em uma mquina com 2 processadores e descobrimos que o MySQL escalona muito melhor - virtualmente, no h nenhuma perda de desempenho no throughput das consultas at cerca de 1000 clientes, e o fator da escala do MySQL (computado com a razo do throughput mximo para o thoughput de cada cliente.) 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 1000 e o fator da escala foi de 300%. Portanto para um servidor SMP muito carregado ns definitivamente recomendamos o kernel 2.4. Ns descobrimos que essencial executar o processo mysqld com a mais alta prioridade possvel no kernel 2.4 para obter performance mxima. Isto pode ser feito adicionando o comando renice -20 $$ ao mysqld_safe. Nos nossos testes em uma mquina com 4 processadores, o aumento da prioridade nos deu 60% de aumento no throughput com 400 clientes. Atualmente estamos tentando coletar mais informaes sobre como o MySQL atua no kernel 2.4 em sistemas com 4 e 8 processadores. Se voc tem acesso a um sistema deste porte e tem feito alguns benchmarks, por favor envie um email para <docs@mysql.com> com os resultados - iremos inclu-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 glibc-2.1 muito ruim para programas com vrias threads que travam o mutex por um tempo curto. Em um sistema SMP, ironicamente, se voc liga o MySQL com LinuxThreads sem modificaes, removendo processadores da mquina, a performance do MySQL melhorada em alguns casos. Para corrigir este comportamento, disponibilizamos um patch para glibc 2.1.3, em linuxthreads-2.1-patch [ 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 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. A chance desta condio pode ser reduzida mudando a prioridade do processo mysqld para a prioridade mais alta. Ns tambm corrigimos o comportamento overspin com um patch, disponvel 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 em um nico patch. Voc precisar aplic-lo no diretrio linuxthreads com patch -p0 </tmp/linuxthreads-2.2.2.patch. Esperamos que seja includo de alguma forma nos futuros lanamentos da glibc-2.2. De qualquer forma, se voc ligar com glibc-2.2.2, ainda ser necessrio corrigir STACK_SIZE e PTHREAD_THREADS_MAX. Temos esperanas que os padres sero corrigidos para valores mais aceitveis para configuraes pesadasa do MySQL no futuro, ento sua construo poder ser reduzida a ./configure; make; make install. Recomendamos que voc use os patches acima para construir uma verso esttica especial de libpthread.a e use-a somente para ligaes estticas com o MySQL. Sabemos que os patches so seguros para o MySQL e pode melhorar significamente sua performance, mas no podemos dizer nada sobre outras aplicaes. Se voc ligar outras aplicaes coma a verso modificada da biblioteca ou construir uma verso alterada compartilhada e instal-la no seu sistema, voc estar fazendo por sua conta e risco e tenha ateno com outras aplicaes que dependem de LinuxThreads. 128

Instalao do MySQL

Se voc passar por problemas estranhos durante a instalao do MySQL ou com travamentos de alguns utilitrios comuns, muito provvel que eles so relacionados a problemas de bibliotecas ou compilador. Se for este o caso, o uso de nosso binrio ser a soluo. Um problema conhecido com a distribuio binria que com antigos sistemas Linux que usam libc (como o RedHat 4.x ou Slackware), voc obter alguns problemas no fatais com resoluo de nomes. See Seco 2.6.2.1, Notas Linux para distribuies binrias. Quando estiver usando LinuxThreads voc ver um mnimo de trs processos em execuo. Estes so de fato, threads. Existir uma thread para o gerenciador LinuxThreads, uma thread para lidar com conexes e uma thread para tartar de alarmes e sinais. Perceba que o kernel Linux e a biblioteca LinuxThread pode por padro ter apenas 1024 threads. Isto significa que voc pode ter at 1021 conexes ao MySQL em um sistema sem correo. A pgina http://www.volano.com/linuxnotes.html contm informaes sobre como contornar este limite. Se voc ver um processo mysqld daemon finalizado com ps, isto normalmente significa que voc encontrou um bug no MySQL ou que tenha uma tabela corrompida. See Seco A.4.1, O Que Fazer Se o MySQL Continua Falhando. Para obter um descarga do core no Linux se o mysqld finalizar com um sinal SIGSEGV, voc pode iniciar o mysqld com a opo --core-file. Perceba que provavelmente voc tambm precisar aumentar o core file size adicionando ulimit -c 1000000 para mysqld_safe ou iniciar mysqld_safe com --core-file-sizes=1000000, See Seco 4.8.2, mysqldsafe, o wrapper do mysqld. Se voc estiver ligando seu prprio cliente MySQL e obter o erro: 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: Ligue o cliente com a seguinte Wl,r/path-libmysqlclient.so. Copie libmysqclient.so para /usr/lib. Adicione o caminho do diretrio onde libmysqlclient.so est localizado para a varivel de ambiente LD_RUN_PATH antes de executar seu cliente. opo (no lugar de -Lpath): -

Se voc estiver usando o compilador Fujitsu (fcc / FCC) voc ter alguns problemas compilando o MySQL porque os arquivos de cabealho Linux so muito orientados ao gcc. A seguinte linha configure deve funcionar com fcc/FCC: CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE \ -DCONST=const -DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib \ -K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=const \ -Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO \ '-D_EXTERN_INLINE=static __inline'" ./configure --prefix=/usr/local/mysql \ --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared \ --with-low-memory

2.6.2.1. Notas Linux para distribuies binrias


O MySQL necessita pelo menos do Linux verso 2.0 Aviso: Percebemos que alguns usurios do MySQL tiveram serios problemas de estabilidade com o MySQL e o kernel 2.2.14 do Linux. Se voc estiver usando este kernel voc deve atualiz-lo para o 129

Instalao do MySQL

2.2.19 (ou posterior) ou para o kernel 2.4. Se voc tiver um gabinete multi-cpu, ento voc deve considerar seriamente o uso do kernel 2.4 uma vez que ele lhe trar uma melhora significante na velocidade. A verso binria ligada com -static, que significa que voc normalmente no precisa se preocupar com qual verso das bibliotecas do sistema voc tem. Voc no precisa instalar LinuxThreads. Um programa ligado com a opo -static um pouco maior que um programa ligado dinamicamente e tambm um pouco mais rpido (3-5%). Um problema, entretanto, que voc no pode usar funes definidas pelo usurio (UDF) com um programa ligado estaticamente. Se voc for escrever ou usar funes UDF (isto algo para programadores C ou C++), voc deve compilar o MySQL, usando ligaes dinamicas. Se voc estiver usando um sistema baseado em libc (em vez de um sistema glibc2), voc, provavelmente, ter alguns problemas com resoluo de nomes de mquinas e getpwnam() com a verso binria. (Isto porque o glibc infelizmente depende de algumas bibliotecas externas para resolver nomes de mquinas e getpwent(), mesmo quando compilado com -static). Neste caso, voc provavelmente obter a seguinte mensagem de erro quando executar mysql_install_db: Sorry, the host 'xxxx' could not be looked up ou o seguinte erro quando voc tentar executar mysqld com a opo --user: getpwnam: No such file or directory Voc pode resolver este problema usando de um dos modos seguintes: Obtenha uma distribuio fonte do MySQL (uma distribuio RPM ou tar.gz) e a instale. Execute mysql_install_db --force; Isto no executar o teste resolveip no mysql_install_db. O lado ruim que voc no poder usar nomes de mquinas nas tabelas de permisses; voc deve usar nmeros IP no lugar (exceto para localhost). Se voc estiver usando uma release antiga do MySQL que no suporte --force, voc deve 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 configuradas para o mximo de desempenho possvel. Ns sempre tentamos usar o compilador mais rpido e estvel disponvel. Suporte MySQL ao Perl exige Perl Verso 5.004_03 ou mais novo. Em algumas verses 2.2 do kernel Linux,voc pode obter o erro Resource temporarily unavailable quando voc faz vrias novas conexes para um servidor mysqld sobre TCP/IP. O problema que o Linux tem um atraso entre o momento em que voc fecha um socket TCP/IP at que ele seja realmente liberado pelo sistema. Como s existe espao para um nmero finito de slots TCP/IP, voc ir obter o erro acima se voc tentar fazer muitas novas conexes TCP/IP durante um pequeno tempo, como quando voc executa o benchmark do MySQL test-connect sobre TCP/ IP. Ns enviamos emails sobre este problema vrias vezes para diferentes listas de discusso Linux mas nunca conseguimos resolver este problema apropriadamente. A nica 'correo' conhecida , para este problema usar conexes persistentes nos seus clientes ou usar sockets, se voc estiver executando o servidor de banco de dados e clientes na mesma mquina. Ns experamos que o kernel Linux 2.4 corrija este problema no futuro.

2.6.2.2. Notas Linux x86


130

Instalao do MySQL

O MySQL exige a verso 5.4.12 ou mais nova da libc. Sabe-se que funciona com a libc 5.4.46. A verso 2.0.6 e posterior da glibc tambm deve funcionar. Existem alguns problemas com os RPMs glibc da RedHat, portanto se voc tiver problemas, confira se existe alguma atualizao! Sabemos que os RPMs glibc 2.0.7-19 e 2.0.7-29 funcionam. Se voc estiver usando o Red Hat 8.0 ou uma nova biblioteca glibc 2.2.x, voc deve iniciar o mysqld com a opo --thread-stack=192K (Use -O thread_stack=192K antes do MySQL 4). Se voc no fizer isto o mysqld finlizar em gethostbyaddr() porque a nova biblioteca glibc exige mais de 128K de memria na pilha para esta chamada. Este tamanho de pilha o padro agora no MySQL 4.0.10 e acima. Se voc est usando o gcc 3.0 e acima para compilar o MySQL, voc deve instalar a biblioteca libstdc++v3 antes de compilar o MySQL; se voc no fizer isto, voc obter um erro sobre um smbolo __cxa_pure_virtual perdido durante a ligao. Em algumas distribuies Linux mais antigas, configure pode produzir um erro como este: 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 _P que tem somente um caractere sublinhado e ento tente novamente. Voc pode obter alguns aviso quando estiver compilando; os mostrados abaixo podem ser ignorados: mysqld.cc -o objs-thread/mysqld.o mysqld.cc: In function `void init_signals()': mysqld.cc:315: warning: assignment of negative value `-1' to `long unsigned int' mysqld.cc: In function `void * signal_hand(void *)': mysqld.cc:346: warning: assignment of negative value `-1' to `long unsigned int' O mysql.server pode ser encontrado no diretrio share/mysql sob o diretrio de instalao MySQL ou no diretrio support-files da rvore fonte MySQL. Se o mysqld sempre descarregar um core na inicializao, o problema pode ser que voc tenha um antigo /lib/libc.a. Tente renome-lo depois remova sql/mysqld e faa um novo make install e tente novamente. Este problema foi relatado em algumas instalaes Slackware. Se voc obter o seguinte erro quando ligar o mysqld, significa que seu libg++.a no est instalado corretamente: /usr/lib/libc.a(putc.o): In function `_IO_putc': putc.o(.text+0x0): multiple definition of `_IO_putc' Voc pode evitar o uso de libg++.a executando configure desta forma: shell> CXX=gcc ./configure

2.6.2.3. Notas Linux SPARC


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

2.6.2.4. Notas Linux Alpha


O MySQL Verso 3.23.12 a primeira verso do MySQL que testada no Linux-Alpha. Se voc 131

Instalao do MySQL

planeja usar o MySQL no Linux-Alpha, voc deve ter certeza que possui esta verso 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 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. Voc pode encontrar os compiladores acima em http://www.support.compaq.com/alpha-tools. Usando estes compiladores, em vez do gcc, obtemos 9-14 % de melhora na performance com MySQL. Note que a linha de configurao otimiza o binrio para a CPU atual; isto significa que voc s pode utilizar nosso binrio se voc tiver um processador Alpha EV6. Ns tambm compilamos estaticamente para evitar problemas de bibliotecas. A partir das prximas distribuies adicionamos o parmetro -arch generic em nossas opes de compilao, o qual assegura que o binrio execute em todos os processadores Alpha. Ns tambm compilamos estaticamente para evitar problemas de bibliotecas. 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 configurao funcionou para ns: 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 4.18. Voc deve fazer download e usar o gdb 5.0! Se voc tentar ligar o mysqld estaticamente quando usar o gcc, a imagem resultante ir descarregar um arquivo core no incio. Em outras palavras, NO use -with-mysqld-ldflags=-all-static com gcc.

2.6.2.5. Notas Linux PowerPC


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

2.6.2.6. Notas Linux MIPS


Para ter o MySQL funcionando no Qube2. (Linux Mips), voc precisar das bibliotecas glibc mais novas (Sabemos que glibc-2.0.7.29C2 funciona). Voc tambm deve usar o 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: Usando gcc-2.96: CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc \ CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors \ 132

Instalao do MySQL

-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 significa se voc instalar nossa distribuio binrias em algum outro lugar diferente de /usr/local/mysql voc precisa modificar o /etc/ld.so.conf ou adicionar o caminho da o diretrio onde est localizado o libmysqlclient.so na varivel de ambiente LD_LIBRARY_PATH. See Seco A.3.1, Problemas de Ligao com a Biblioteca do Cliente MySQL.

2.6.3. Notas Solaris


No Solaris, voc deve ter problemas mesmo antes de descompactar a distribuio MySQL! O tar do Solaris no pode tratar grandes nomes de arquivos, portanto voc pode ver um erro deste tipo quando descompactar o MySQL:

x mysql-3.22.12-beta/bench/Results/ATIS-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sq tar: directory checksum error Neste caso, voc deve usar o GNU tar (gtar) para desempacotar a distribuio. Voc pode encontrar uma cpia pr-compilada para Solaris em http://www.mysql.com/downloads/os-solaris.html. As threads nativas da Sun funcionam somente no Solaris 2.5 e superior. Para a verso 2.4 e anteriores, o MySQL ir automaticamente usar MIT-pthreads. See Seco 2.3.6, Notas MIT-pthreads. Se voc obter o seguinte erro de configure: checking for restartable system calls... configure: error can not run test programs while cross compiling Isto significa que alguma coisa est errada com a instalao de seu compilador! Neste caso voc deve atualizar seu compilador para uma verso mais nova. Voc tambm pode resolver este problema inserindo a seguinte linha no arquivo config.cache: ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'} Se voc est usando Solaris em um SPARC, o compilador recomendado o gcc 2.95.2. Voc pode encontr-lo em http://gcc.gnu.org/. Perceba que egcs 1.1.1 e gcc 2.8.1 no so estveis no SPARC! A linha do configure recomendado quando usando gcc 2.95.2 : CC=gcc CFLAGS="-O3" \ CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory --enable-assembler Se voc possui um ultra sparc, voc pode obter 4% a mais de performance adicionando "-mcpu=v8 Wa,-xarch=v8plusa" para a CFLAGS e CXXFLAGS. Se voc possui o compilador Sun Workshop (Fortre) 5.3 (ou mais novo), voc pode executar configure da seguinte forma: CC=cc CFLAGS="-Xa -fast -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 parmetros de compilao:

133

Instalao do MySQL

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. Note que isto s funciona com o MySQL 4.0 e acima - o MySQL 3.23 no inclui as modificaes exigidas para suportar isto. 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 parametro -mcpu. Se voc criar um binrio de 64 bits, ele ser 4$ mais lento que o binrio de 32 bits, mas o mysqld poder tratar mais threads e memria. Se voc tiver um problema com fdatasync ou sched_yield, voc pode corrigir isto adicionando LIBS=-lrt para a linha de configurao O seguinte paragrfo relevante somente para compiladores mais antigos que o WorkShop 5.3: Voc tambm pode ter que editar o script configure para alterar esta linha: #if !defined(__STDC__) || __STDC__ != 1 para isto: #if !defined(__STDC__) Se voc ligar __STDC__ com a opo -Xc, o compilador Sun no pode compilar com o arquivo de cabealho pthread.h do Solaris. Isto um bug da Sun (compilador corrompido ou arquivo include corrompido). Se o mysqld emitir a mensagem de erro mostrada abaixo quando voc execut-lo, voc deve tentar compilar o MySQL com o compilador Sun sem habilitar a opo multi-thread (-mt): 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 / opt/sfw/lib a varivel de ambiente LD_LIBRARY_PATH antes de executar a configurao. Se voc estiver usando o gcc disponvel em sunfreeware.com, voc pode ter muitos problemas. Voc deve recompilar o gcc e GNU binutils na mquina que voc o executar para evitar qualquer problema. Se voc obter o seguinte erro quando estiver compilando o MySQL com gcc, significa que seu gcc no est configurado para sua verso de Solaris: shell> gcc -O3 -g -O2 -DDBUG_OFF -o thr_alarm ... ./thr_alarm.c: In function `signal_hand': ./thr_alarm.c:556: too many arguments to function `sigwait' A coisa apropriada para fazer neste caso obter a verso mais nova do gcc e compil-lo com seu compilador gcc atual! Ao menos para o Solaris 2.5, a maioria das verses binrias de gcc tem arquivos inteis e antigos que iro quebrar todos programas que usam threads (e possivelmente outros programas)! O Solaris no fornece verses estticas de todas bibliotecas de sistema (libpthreads) e libdl), portanto voc no pode compilar o MySQL com --static. Se voc tentar fazer isto, receber o erro: 134

Instalao do MySQL

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 log do MySQL: Error in accept: Protocol error Voc deve tentar iniciar o servidor com a opo --set-variable back_log=50 como uma soluo para esta situao. Note que --set-variable=nome=valor e -O nome=valor est obsoleto desde o MySQL 4.0. Use apenas --back_log=50. See Seco 4.1.1, Opes de Linha de Comando do mysqld. Se voc est ligando seu prprio cliente MySQL, voc deve obter o seguinte erro quando tentar execut-lo: ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory O problema pode ser evitado por um dos seguintes mtodos: Ligue o cliente com a seguinte opo Wl,r/full-path-to-libmysqlclient.so. Copie o arquivo libmysqclient.so para /usr/lib. Adicione o caminho do diretrio onde libmysqlclient.so est localizado varivel de ambiente LD_RUN_PATH antes de executar seu cliente. (em vez de -Lpath): -

Se voc tiver problemas com o configure tentando ligar com -lz e voc no tem a zlib instalada, voc ter duas opes: Se voc deseja usar o protocol de comunio de compactado voc precisar obter e instalar a zlib from ftp.gnu.org. Configure com --with-named-z-libs=no.

Se voc estiver usando o gcc e tiver problemas carregando funes UDF no MySQL, tente adicionar -lgcc para a linha de ligao para a funo UDF. Se voc deseja que o MySQL inicie automaticamente, voc pode copiar support-files/mysql.server para /etc/init.d e criar um link simblico para ele, chamado / etc/rc.3.d/S99mysql.server. Como o Solaris no suporta core files para aplicaes setuid(), voc no pode obter um core file do mysqld se voc estiver usando a opo --user.

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 detalhes do Solaris 2.6 tambm se aplicam ao Solaris 2.7 e 2.8. 135

Instalao do MySQL

Note que o MySQL verso 3.23.4 e superiores devem estar aptos para autodetectar novas verses do Solaris e habilitar solues para os problemas seguintes! Solaris 2.7 / 2.8 tem alguns bugs nos arquivos include. Voc pode ver o seguinte erro quando voc usa o gcc: /usr/include/widec.h:42: warning: `getwc' redefined /usr/include/wchar.h:326: warning: this is the location of the previous definition Se isto ocorrer, voc pode fazer o seguinte para corrigir o problema: Copie /usr/include/widec.h para .../lib/gcc-lib/os/gcc-version/include e mude a linha 41 : #if 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 fazer a correo, voc deve remover o config.cache e executar o configure novamente ! Se voc obter erros como estes quando voc executar o make, porque o configure no encontrou o arquivo curses.h (provavelmente devido ao erro no arquivo /usr/include/widec.h): In file included from mysql.cc:50: /usr/include/term.h:1060: syntax error before `,' /usr/include/term.h:1081: syntax error before `;' A soluo para isto fazer uma das seguintes opes: Configure com ./configure. CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H

Edite o /usr/include/widec.h como indicado acima e re-execute o configure. Remova a linha #define HAVE_TERM do arquivo config.h e execute make novamente.

Se o seu ligador tiver problemas para encontrar o -lz quando ligar ao seu programa cliente, provavelmente o problema que seu arquivo libz.so est instalado em /usr/local/lib. Voc pode corrigir isto usando um dos seguintes mtodos: 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 distribuio do Solaris 8. Configure o MySQL com a opo --with-named-z-libs=no.

2.6.3.2. Notas Solaris x86


No Solaris 8 no x86, mysqld ir descarregar um core se voc executar um 'strip' no mesmo.

136

Instalao do MySQL

Se voc estiver usando gcc ou egcs no Solaris X86 e voc tiver problemas com descarregos de core, voc deve utilizar o seguinte comando configure:

CC=gcc CFLAGS="-O3 -fomit-frame-pointer -DHAVE_CURSES_H" \ CXX=gcc \ CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtt ./configure --prefix=/usr/local/mysql Isto ir evitar problemas com a biblioteca libstdc++ e com excees C++. Se isto no ajudar, voc pode compilar uma verso com debug e execut-lo com um arquivo de ratreamento (trace) ou sob gdb. See Seco E.1.3, Depurando o mysqld no gdb.

2.6.4. Notas BSD


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

2.6.4.1. Notas FreeBSD


FreeBSD 4.x ou mais novo recomendado para executao do MySQL uma vez que o pacote thread muito mais integrado. A mais fcil e portanto a forma preferida para instal-lo usar as portas mysql-server e mysql-client disponveis em http://www.freebsd.org. Usando-as voc obtem: Um MySQL funcional, com todas as otimizaes conhecidas para trabalhar na sua verso habilitada do FreeBSD. Configurao e construo automtica. Scripts de inicializao instalados em /usr/local/etc/rc.d. Habilidade para ver quais arquivos esto instalados com pkg_info -L. E para remover todos com pkg_delete se voc no quiser mais o MySQL na mquina.

recomendado que voc utilize MIT-pthreads no FreeBSD 2.x e threads nativas nas Verses 3 e superiores. possvel executar com threads nativas em algumas verses antigas (2.2.x) mas voc pode encontrar problemas ao finalizar o mysqld. Infelizmente algumas chamadas de funes no FreeBSD ainda no so totalmente seguras com threads, principalmente a funo gethostbyname(), que usada pelo MySQL para converter nomes de mquinas em endereos IPs. Sob certas circunstncias, o processo mysqld ir criar repentinamente um carga de CPU de 100% e ficar sem resposta. Se voc se deparar com isto, tente iniciar o MySQL usando a opo --skip-name-resolve. Alternativamente, voc pode ligar o MySQL no FreeBSD 4.x com a biblioteca LinuxThreads, que evita uns poucos problemas que a implementao da thread nativa do FreeBSD tem. Para uma comparao muito boa do LinuxThreads vs. threads nativas d uma olhada 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: wait_timeout no est funcionando (provavemente problema de manipulao do signal em FreeBSD/LinuxThreads). Isto deveria ter sido corrigido no FreeBSD 5.0. O sintome que conexes persistentes podem se manter por um longo tempo sem serem fechadas. 137

Instalao do MySQL

O Makefile do MySQL necessita o GNU make (gmake) para funcionar. Se voc deseja compilar o MySQL, antes voc precisar instalar o GNU make. Tenha certeza que sua configurao de resoluo de nomes esteja correta. De outra forma voc vai ter atrasos na resoluo ou falhas quando conectar ao mysqld. 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 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) : CC=gcc CFLAGS="-O2 -fno-strength-reduce" \ CXX=gcc CXXFLAGS="-O2 -fno-rtti -fno-exceptions -felide-constructors \ -fno-strength-reduce" \ ./configure --prefix=/usr/local/mysql --enable-assembler gmake gmake install ./scripts/mysql_install_db cd /usr/local/mysql ./bin/mysqld_safe & Se voc percber que o configure usar MIT-pthreads, voc de ler as notas sobre MIT-pthreads. See Seco 2.3.6, Notas MIT-pthreads. Se o make install no puder encontrar /usr/include/pthreads, porque o configure no detectou que voc precisava de MIT-pthreads. Isto corrigido executando estes comandos: shell> rm config.cache shell> ./configure --with-mit-threads O FreeBSD tambm conhecido por ter um limite muito baixo para o manipulador de arquivos. See Seco A.2.17, Arquivo No Encontrado. Descomente a seo ulimit -n no mysqld_safe ou aumente os limites para o usurio mysqld no /etc/login.conf (e reconstrua-o com cap_mkdb / etc/login.conf). Tambm tenha certeza que voc configurou a classe apropriada para este usurio no arquivo de senhas (password) se voc no estiver usando o padro (use: chpass nome_usuario_mysqld). See Seco 4.8.2, mysqld-safe, o wrapper do mysqld. Se voc tiver muita memria voc deve considerar em reconstruir o Kernel para permitir o MySQL de usar mais de 512M de RAM. D uma olhada na opo MAXDSIZ na arquivo de configurao LINT para maiores informaes. Se voc tiver problemas com a data atual no MySQL, configurar a varivel TZ provavelmente ajudar. See Apndice F, Variveis de Ambientes do MySQL. Para obter um sistema seguro e estvel voc deve usar somente kernels FreeBSD que estejam marcados com -STABLE.

2.6.4.2. Notas NetBSD


Para compilar no NetBSD voc precisa do GNU make. De outra forma o compilador quebraria 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 seguintes opes: CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no 138

Instalao do MySQL

2.6.4.4. Notas OpenBSD 2.8


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

2.6.4.5. Notas BSDI Verso 2.x


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

2.6.4.6. Notas BSD/OS Verso 3.x


Atualize para BSD/OS Verso 3.1. Se isto no for possvel, instale BSDIpatch M300-038. Use o seguinte comando quando configurar o MySQL: shell> env CXX=shlicc++ CC=shlicc2 \ ./configure \ --prefix=/usr/local/mysql \ --localstatedir=/var/mysql \ --without-perl \ --with-unix-socket-path=/var/mysql/mysql.sock O comeando seguinte tambm funciona: 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 no especificando nenhuma localizao. Se voc tiver problemas com performance sob alta carga, tente usar a opo 139

Instalao do MySQL

-skip-thread-priority para mysqld! Isto ir executar todas as threads com a mesma prioridade; no BSDI verso 3.1, isto fornece melhor performance (pelo menos at o BSDI corrigir seu organizador de threads). Se voc obter o erro virtual memory exhausted enquanto estiver compilando, deve tentar usar ulimit -v 80000 e executar make novamente. Se isto no funcionar e voc estiver usando bash, tente trocar para csh ou sh; alguns usurios BSDI relataram problemas com bash e ulimit.

2.6.4.7. Notas BSD/OS Verso 4.x


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

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 dos patches pthread para este SO. Isto tambm se aplica ao Mac OS X 10.x Server. A compilao para a plataforma Server a mesma para a verso cliente do Mac OS X. No entanto note que o MySQL vem preinstalado no Servidor ! Nosso binrio para Mac OS X compilado no Darwin 6.3 com a seguinte linha de configurao: 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 See Seco 2.1.3, Instalando o MySQL no Mac OS X.

2.6.5.2. Mac OS X Server 1.2 (Rhapsody)


Antes de tentar configurar o MySQL no MAC OS X server 1.2 (aka Rhapsody), primeiro voc deve instalar o pacote pthread encontrado em: http://www.prnet.de/RegEx/mysql.html. See Seco 2.1.3, Instalando o MySQL no Mac OS X.

2.6.6. Notas de Outros Unix


2.6.6.1. Notas HP-UX para distribuies binrias
140

Instalao do MySQL

Alguma das distribuies binrias do MySQL para HP-UX distribuida como um arquivo depot da HP e como um arquivo tar. Para usar o arquivo depot voc deve estar executando pelo menos o HPUX 10.x para ter acesso s ferramentas de arquivos depot da HP. A verso HP do MySQL foi compilada em um servidor HP 9000/8xx sob HP-UX 10.20, usando MIT-pthreads. Sob esta configurao o MySQL funciona bem. O MySQL Verso 3.22.26 e mais novas tambm podem ser construidas com o pacote thread nativo da HP. Outras configuraes que podem funcionar: HP 9000/7xx executando HP-UX 10.20+ HP 9000/8xx executando HP-UX 10.30

As seguintes configuraes definitivamente no funcionaro: 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 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 depot tambm cria as entradas apropriadas em /etc/init.d e /etc/rc2.d para iniciar o servidor automaticamente na hora do boot. Obviamente, para instalar o usurio deve ser o root. Para instalar a distribuio HP-UX tar.gz, voc deve ter uma cpia do GNU tar.

2.6.6.2. Notas HP-UX Verso 10.20


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

Instalao do MySQL

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


Para HP-UX Verso 11.x ns recomendamos o MySQL Verso 3.23.15 ou posterior. Por causa de alguns bugs crticos nas bibliotecas padro do HP-UX, voc deve instalar as seguintes correes antes de tentar executar o MySQL no HP-UX 11.0: PHKL_22840 Streams cumulative PHNE_22397 ARPA cumulative Isto ir resolver um problema que tem como retorno EWOLDBLOCK de recv() e EBADF de accept() em aplicaes threads. Se voc estiver usando gcc 2.95.1 em um sistema HP-UX 11.x sem correes, voc obter 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 define consistentemente a pthreads_atfork(). Ela tem prottipos coflitantes em /usr/include/sys/unistd.h:184 e / usr/include/sys/pthread.h:440 (detalhes abaixo). Uma soluo copiar /usr/include/sys/unistd.h em mysql/include e editar unistd.h alterando-o para coincidir com a definio em pthread.h. Aqui est o diff: 183,184c183,184 < extern int pthread_atfork(void (*prepare)(), void (*parent)(), < void (*child)()); --> extern int pthread_atfork(void (*prepare)(void), void (*parent)(void), > void (*child)(void)); Depois disto, a seguinte linha configure deve funcionar: CFLAGS="-fomit-frame-pointer -O3 -fpic" CXX=gcc \ CXXFLAGS="-felide-constructors -fno-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 compilao 142

Instalao do MySQL

do MySQL com o compilador HP-UX:

CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure --with-extra-character-set Voc pode ignorar qualquer erro do tipo: aCC: warning 901: unknown option: `-3': use +help for online documentation Se voc obter o seguinte erro do configure checking for cc option to accept ANSI C... no configure: error: MySQL requires a ANSI C compiler (and a C++ compiler). Try gcc. See the Installation chapter in the Reference Manual. Confira se voc no tem o caminho para o compilador K&R antes do caminho para o compilador C e C++ do HP-UX. Outra razo para no estar compilando voc no definir o parmetro +DD64 acima. Outra possibilidade para o HP-UX 11 usar o binrio MySQL para HP-UX 10.20. Recebemos relatos de alguns usurios de que esses binrios funcionam bem no HP-UX 11.00. Se voc encontrar problemas, verifique o nvel do pacth de seu HP-UX.

2.6.6.4. Notas IBM-AIX


Deteco automtica de xlC est faltando no Autoconf, portando um comando configure deste tipo necessrio quando estiver compilando o MySQL (Este exemplo usa o compilador IBM): export export export export export export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 " CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192" CFLAGS="-I /usr/local/include" LDFLAGS="-L /usr/local/lib" CPPFLAGS=$CFLAGS 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 em http://www-frec.bull.com/. Se voc alterar o -O3 para -O2 na linha de configurao acima, voc tambm deve remover a opo -qstrict (isto uma limitao no compilador C da IBM). Se voc estiver usando gcc ou egcs para compilar o MySQL, voc DEVE usar a opo fno-exceptions, j que o manipulador de excees no gcc/egcs no seguro para threads! (Isto foi testado com egcs 1.1). Existem tambm alguns problemas conhecidos com o assembler da IBM que pode gerar cdigo errado quando usado com gcc. Ns recomendamos a seguinte linha do configure com egcs e gcc 2.95 no AIX: CC="gcc -pipe -mcpu=power -Wa,-many" \ CXX="gcc -pipe -mcpu=power -Wa,-many" \ CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory

143

Instalao do MySQL

O -Wa,-many necessrio para o compilador ser bem sucedido. IBM est ciente deste problema mas no est com pressa de corrig-lo devido ao fato do problema poder ser contornado. Ns no sabemos se o -fno-exceptions necessrio com gcc 2.9.5, mas como o MySQL no utiliza excees e a opo acima gera cdigo mais rpido, recomendamos que voc sempre use esta opo com o egcs/gcc. Se voc tiver algum problema com cdigo assembler tente alterar o -mcpu=xxx para o seu 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 "power" deve satisfazer a maioria dos casos, mesmo em uma mquina power2. Se voc no sabe qual o seu processador, utilize o comando "uname -m", isto ir fornecer a voc uma string que parece com "000514676700", com um formato de xxyyyyyymmss onde xx e ss so sempre 0s, yyyyyy o ID nico do sistema e mm o ID da CPU Planar. Uma tabela destes valores podem ser encontrados em http://publib.boulder.ibm.com/doc_link/en_US/a_doc_lib/cmds/aixcmds5/uname.htm. Isto ir lhe fornecer um tipo de mquina e um modelo de mquina que voc pode usar para determinar que tipo de cpu voc tem. Se voc tiver problemas com sinais (MySQL finaliza sem notificao sob alta carga) voc pode ter encontrado um bug de SO com threads e sinais. Neste caso voc pode dizer ao MySQL para no usar sinais configurando-o com: shell> CFLAGS=-DDONT_USE_THR_ALARM CXX=gcc \ CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti \ -DDONT_USE_THR_ALARM" \ ./configure --prefix=/usr/local/mysql --with-debug --with-low-memory Isto no afeta a performance do MySQL, mas tem o efeito colateral que voc no pode matar clientes que esto ``dormindo'' em uma conexo com mysqladmin kill ou mysqladmin shutdown. Neste caso, o cliente morrer quando ele chegar no prximo comando. Em algumas verses do AIX, ligando com libbind.a faz o getservbyname descarregar core. Isto erro no AIX e deve ser relatado para a IBM. Para o AIX 4.2.1 e gcc voc tem que fazer as seguintes alteraes. Depois de configurar, edite o config.h e include/my_config.h e altere a linha que diz #define HAVE_SNPRINTF 1 para #undef HAVE_SNPRINTF E finalmente, no mysqld.cc voc precisa adicionar um prottipo para initgroups. #ifdef _AIX41 extern "C" int initgroups(const char *,int); #endif Se voc precisar se alocar muita memria para o processo mysqld, no suficiente apenas definir 'ulimit -d unlimited'. Voc tambm deve configurar no mysqld_safe algo do tipo: export LDR_CNTRL='MAXDATA=0x80000000' Voc pode encontrar mais sobre o uso de muita memria http://publib16.boulder.ibm.com/pseries/en_US/aixprggd/genprogc/lrg_prg_support.htm. em:

2.6.6.5. Notas SunOS 4


144

Instalao do MySQL

No SunOS 4, necessrio a MIT-pthreads para compilar o MySQL, o que significa que voc precisa do GNU make. Alguns sistemas SunOS 4 tem problemas com bibliotecas dinmicas e libtool. Voc pode 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 definies duplicadas que podem ser ignoradas. Ao compilar o mysqld, vo existir alguns alertas sobre implicit declaration of function que tambm podem ser ignoradas.

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 egcs no DEC tem vrios erros graves ! Quando compilando programas com threads no Digital Unix, a documentao recomenda usar a opo -pthread para cc e cxx e as bibliotecas -lmach -lexc (em adio para -lpthread). Voc deve executar o configure parecido com isto: CC="cc -pthread" CXX="cxx -pthread -O" \ ./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc" Quando compilando o mysqld, voc deve ver alguns avisos como estes: mysqld.cc: In function void handle_connections()': mysqld.cc:626: passing long unsigned int *' as argument 3 of accept(int,sockadddr *, int *)' Voc pode ignorar estes altertas com segurana. Eles ocorrem porque o configure s pode detectar erros e no alertas. Se voc inicia o servidor diretamente da linha de comando, voc pode ter problemas com a finalizao do servidor ao sair (log out). (Quando voc sai, seu processo superior recebe um sinal SIGHUP.) Se isto acontecer, tente iniciar o servidor desta forma: shell> nohup mysqld [options] & nohup faz com que o comando que o segue ignore qualquer sinal SIGHUP enviado pelo terminal. De forma alternativa, inicie o servidor executando mysqld_safe, o qual invoca o mysqld usando nohup por voc. See Seco 4.8.2, mysqld-safe, o wrapper do mysqld. Se voc tiver problemas quando compilar mysys/get_opt.c, apenas remova a linha #define _NO_PROTO do inicio do arquivo! Se voc estiver utilizando o compilador CC da Compac, a seguinte linha de configurao dever funcionar: CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host" CXX="cxx -pthread" CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host \ -noexceptions -nortti" export CC CFLAGS CXX CXXFLAGS ./configure \ --prefix=/usr/local/mysql \ --with-low-memory \ --enable-large-files \ 145

Instalao do MySQL

--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 no exemplo acima, quando estiver ligando ao mysqld, voc deve conseguir contornar este problema usando: cd mysql /bin/sh ../libtool --mode=link cxx -pthread -O3 -DDBUG_OFF \ -O4 -ansi_alias -ansi_args -fast -inline speed \ -speculate all \ -arch host -DUNDEF_HAVE_GETHOSTBYNAME_R \ -o mysql mysql.o readline.o sql_string.o completion_hash.o \ ../readline/libreadline.a -lcurses \ ../libmysql/.libs/libmysqlclient.so -lm cd .. gnumake gnumake install scripts/mysql_install_db

2.6.6.7. Notas Alpha-DEC-OSF1


Se voc tiver problemas com compilao e tem o DEC CC e o gcc instalados, tente executar o configure desta forma: CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql Se voc tiver problemas com o arquivo c_asm.h, voc pode criar e usar um arquivo c_asm.h 'burro' com: touch include/c_asm.h CC=gcc CFLAGS=-I./include \ CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql Perceba que os seguintes problemas com o programa ld pode ser corrigido fazendo o download do ltimo kit de atualizao da DEC (Compaq) de http://ftp.support.compaq.com/public/unix/. Com o OSF1 V4.0D e o compilador "DEC C V5.6-071 no Digital Unix V4.0 (Rev. 878)" o compilador tem alguns comportamentos estranhos (simbolos asm indefinidos). /bin/ld tambm aparece estar quebrado (problemas com erros _exit undefined ocorrendo ao ligar 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: 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 linha 146

Instalao do MySQL

no config.h que define 'HAVE_ALLOCA'. A funo alloca() pode tambm ter um prottipo incorreto em /usr/include/alloca.h. O alerta resultante deste erro pode ser ignorado. configure ir usar a seguinte biblioteca thread automaticamente: -with-named-thread-libs="-lpthread -lmach -lexc -lc". Quando usar o gcc, voc tambm pode tentar executar configure desta forma: shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure .... Se voc tiver problemas com sinais (MySQL finalzar inesperadamente sobre alta carga), voc pode ter encontrado um erro com threads e sinais no SO. Neste caso voc pode dizer ao MySQL para no usar sinais configurando-o com: 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 finalizar clientes que esto ``dormindo'' em uma conexo com mysqladmin kill ou mysqladmin shutdown. Neste caso o cliente ir morrer quando ele receber o prximo comando. Com gcc 2.95.2, voc provavelmente encontrar o seguinte erro de compilao: 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 ltima linha gcc, mas altere -O3 para -O0 (ou adicione -O0 imediatamente depois de gcc se voc no tiver algumas opo -O na sua linha de compilao.) Depois disto feito voc deve apenas voltar ao diretrio superior e executar make novamente. -

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 se voc execut-lo como um usurio com privilgios de CAP_SCHED_MGT (como root) ou dar ao servidor mysqld este privilgio com o seguinte comando shell: shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld Voc pode precisar indefinir alguns simbolos em config.h depois de executar configure e antes de compilar. Em algumas implementaes Irix, a funo alloca() est quebrada. Se o servidor mysqld morrer em alguma instruo SELECT, remova as linhas de config.h que definem HAVE_ALLOC e HAVE_ALLOC_H. Se mysqladmin create no funciona, remova a linha do config.h que define HAVE_READDIR_R. Voc tambm deve precisar remover a linha HAVE_TERM_H. A SGI recomenda que voc instale todos os http://support.sgi.com/surfzone/patches/patchset/6.2_indigo.rps.html patches desta pgina:

No mnimo, voc deve instalar o ltimo rollup do kernel, o ltimo rollup rld, e o ltimo rollup libc. Definitivamente voc precisar de todos patches POSIX nesta pgina, para suporte 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: 147

Instalao do MySQL

"/usr/include/curses.h", line 82: error(1084): invalid combination of type Digite o seguinte no diretrio topo da sua rvore fonte do MySQL: 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 executando, o sistema fica lento. Pode se evitar isto iniciando outro cliente. Isto pode acarretar num crescimento de 2 para 10 vezes na velocidade de execuo para a outra thread. Isto um problema no compreendido com threads Irix; voc deve improvisar para encontrar solues at que isto seja resolvido. Se voc estiver compilando com gcc, voc pode usar o seguinte comando configure: CC=gcc CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql --enable-thread-safe-client \ --with-named-thread-libs=-lpthread No Irix 6.5.11 com Irix C nativo e compiladores C++ ver. 7.3.1.2, o seguinte ir funcionar CC=cc CXX=CC CFLAGS='-O3 -n32 -TARG:platform=IP22 -I/usr/local/include \ -L/usr/local/lib' CXXFLAGS='-O3 -n32 -TARG:platform=IP22 \ -I/usr/local/include -L/usr/local/lib' ./configure \ --prefix=/usr/local/mysql --with-innodb --with-berkeley-db \ --with-libwrap=/usr/local \ --with-named-curses-libs=/usr/local/lib/libncurses.a

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 para o ``sco 3.2v4.2'' tambm tem tido muito progresso. At o momento o compilador recomendado no OpenServer o gcc 2.95.2. Com isto voc deve estar apto a compilar o MySQL apenas com: CC=gcc CXX=gcc ./configure ... (opes)

1.

Para o OpenServer 5.0.X voc precisa usar gcc-2.95.2p1 ou mais novo da Skunkware. 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. Voc precisa do GCC verso 2.5.x para este produto e do sistema de desenvolvimento. Eles so necessrios nesta verso do SCO Unix. Voc no pode usar apenas o sistema GCC Dev. Voc deve obter o pacote FSU Pthreads e instal-lo primeiro. Pode ser obtido em http://www.cs.wustl.edu/~schmidt/ACE_wrappers/FSU-threads.tar.gz. Voc pode tambm obter um pacote precompilado de http://www.mysql.com/Downloads/SCO/FSU-threads-3.5c.tar.gz. 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 necessitar de uma boa verso do GCC 2.5.x. Existem vrios problemas sem uma boa verso. Esta verso do produto necessita do sistema de Desenvolvimento SCO Unix. Sem ele, voc estar perdendo as bibliotecas e o editor de ligao necessrio. Para construir a FSU Pthreads no seu sistema, faa o seguinte: 148

2. 3.

4.

5.

Instalao do MySQL

a. b. c. 6. 7.

Execute ./configure no diretrio threads/src e selecione a opo SCO OpenServer. Este comando copia Makefile.SCO5 para Makefile. Execute make. Para instalar no diretrio padro /usr/include, use o usurio root, depois mude para o diretrio thread/src e execute make install

Lembre de usar o GNU make quando estiver construindo o MySQL. Se voc no iniciou o mysqld_safe como root, voc provavelmente s ir obter, por padro, os 110 arquivos abertos por processo. O mysqld ir gravar uma nota sobre isto no arquivo log. Com o SCO 3.2V5.0.5, voc deve usar o FSU Pthreads verso 3.5c ou mais nova. Voc deve tambm usar o gcc 2.95.2 ou mais novo. O seguinte comando configure deve funcionar: shell> ./configure --prefix=/usr/local/mysql --disable-shared

8.

9.

Com SCO 3.2V4.2, voc deve usar FSU Pthreads verso 3.5c ou mais nova. O seguinte comando configure deve funcionar:

shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \ ./configure \ --prefix=/usr/local/mysql \ --with-named-thread-libs="-lgthreads -lsocket -lgen -lgthreads" \ --with-named-curses-libs="-lcurses" Voc pode ter alguns problemas com alguns arquivos de incluso. Neste caso, voc pode encontrar novos arquivos de incluso especficos do SCO em http://www.mysql.com/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz. Voc deve descompactar este arquivo no diretrio include da sua rvore fonte do MySQL. Notas de desenvolvimento SCO: O MySQL deve detectar automaticamente FSU Pthreads e ligar o mysqld com -lgthreads -lsocket -lgthreads. As bibliotecas de desenvolvimento SCO so re-entrantes nas FSU Pthreads. A SCO diz que suas bibliotecas de funes so re-entrantes, ento elas devem ser re-entrantes com as FSU-Pthreads. FSU Pthreads no OpenServer tentam usar o esquema SCO para criar bibliotecas re-entrantes. FSU Pthreads (ao menos a verso em http://www.mysql.com) vem ligada com GNU malloc. Se voc encontrar problemas com uso de memria, tenha certeza que o gmalloc.o esteja includo em libgthreads.a e libgthreads.so. Na FSU Pthreads, as seguintes chamadas de sistema so compatveis 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 erg711905-dscr_remap ver 2.0.0) quebra FSU threads e deixa o mysqld instvel. Voc deve remove-lo se voc deseja executar o mysqld em uma mquina OpenServer 5.0.6. A SCO fornece Patches do Sistema Operacional em ftp://ftp.sco.com/pub/openserver5 [ftp://ftp.sco.com/pub/openserver5 ] para OpenServer 5.0.x A SCO fornece correes ftp://ftp.sco.com/pub/security/OpenServer 149 de segurana e libsocket.so.2 [ftp://ftp.sco.com/pub/security/OpenServer ] em e

Instalao do MySQL

ftp://ftp.sco.com/pub/security/sse [ftp://ftp.sco.com/pub/security/sse ] para OpenServer 5.0.x Correes de segurana pre-OSR506. Tamb a correo do telnetd em ftp://stage.caldera.com/pub/security/openserver/ ou ftp://stage.caldera.com/pub/security/openserver/CSSA-2001-SCO.10/ com a libsocket.so.2 e libresolv.so.1 com instrues para instalar em sistemas pre-OSR506. provavelmente uma boa idia para instalar os patches acima tentando compilar/usar o MySQL. Se voc deseja instalar o DBI no SCO, voc deve editar o Makefile em DBI-xxx e cada subdiretrio. Note que o exemplo abaixo considera o gcc 2.95.2 ou mais novo: OLD: CC = cc CCCDLFLAGS = -KPIC -W1,-Bexport CCDLFLAGS = -wl,-Bexport LD = ld LDDLFLAGS = -G -L/usr/local/lib LDFLAGS = -belf -L/usr/local/lib LD = ld OPTIMISE = -Od NEW: CC = gcc CCCDLFLAGS = -fpic CCDLFLAGS = LD = gcc -G -fpic LDDLFLAGS = -L/usr/local/lib LDFLAGS = -L/usr/local/lib LD = gcc -G -fpic OPTIMISE = -O1

OLD: CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include NEW: CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include Isto porque o carregador dinmico Perl no ir carregar os mdulos DBI se elas foram compiladas com icc ou cc. Perl trabalha melhor quando compilado com cc.

2.6.6.10. Notas SCO Unixware Version 7.0


Voc deve usar uma verso de MySQL pelo menos to recente quando a Verso 3.22.13 e UnixWare 7.1.0 porque esta verso corrige alguns problemas de portabilidade sob o Unixware. Ns temos compilado o MySQL com o seguinte comando configure no UnixWare Verso 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. CC=gcc CXX=g++ ./configure --prefix=/usr/local/mysql

1.

A SCO fornece Patches do Sistema Operacional em ftp://ftp.sco.com/pub/unixware7 [ftp://ftp.sco.com/pub/unixware7 ] para UnixWare 7.1.1 e 7.1.3 ftp://ftp.sco.com/pub/openunix8 [ftp://ftp.sco.com/pub/openunix8 ] para OpenUNIX 8.0.0 A SCO fornece informao sobre Security Fixes em ftp://ftp.sco.com/pub/security/OpenUNIX [ftp://ftp.sco.com/pub/security/OpenUNIX ] para OpenUNIX ftp://ftp.sco.com/pub/security/UnixWare [ftp://ftp.sco.com/pub/security/UnixWare ] para UnixWare

2.

150

Instalao do MySQL

2.6.7. Notas OS/2


O MySQL usa poucos arquivos aberto. Por isto, voc deve adicionar uma linha parecida com a abaixo em seu arquivo CONFIG.SYS: SET EMXOPT=-c -n -h1024 Se voc no fizer isto, provavelmente vai ter o seguinte erro: File 'xxxx' not found (Errcode: 24) Quando usar o MysQL com OS/2 Warp 3, o FixPack 29 ou superior necessrio. Com OS/2 Warp 4, FixPack 4 ou acima necessrio. Isto uma exigncia da biblioteca Pthreads. O MySQL deve estar instalado em uma partio que suporta nomes longos de arquivos como no HPFS, FAT32, etc. O script INSTALL.CMD deve ser executado pelo prprio CMD.EXE do OS/2 e opde no funcionar com shells substitutas como o 4OS2.EXE. O script scripts/mysql-install-db foi renomeado. Agora ele chamado install.cmd e um script REXX, que ir atualizar as configuraes padres de segurana do MySQL e criar os cones na WorkPlace Shell para o MySQL. Suporte a mdulos dinmicos compilado mas no totalmente testado. Mdulos dinmicos devem ser compilados usando a biblioteca run-time Pthreads. gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \ -o example udf_example.cc -L../lib -lmysqlclient udf_example.def mv example.dll example.udf Nota: Devido a limitaes no OS/2, o nome do mdulo UDF no deve esceder 8 caracteres. Mdulos so armazenados no diretrio /mysql2/udf; o script safe-mysqld.cmd ir colocar este diretrio na varivel de ambiente BEGINLIBPATH. Quando usando mdulos UDF, extenses especficas so ignoradas --- consuidera-se que seja .udf. Por exemplo, no Unix, o mdulo compartilhado deve ser nomeado example.so e voc deve carregar uma funo 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 especificar a extenso do mdulo: 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 satisfeitos ao notarem que o NetWare 6.5 vir com os binrios do MySQL, completa com uma licena de uso comercial automatica para todos os servidores executando esta verso do NetWare. See Seco 2.1.4, Instalando o MySQL no NetWare. MySQL para NetWare compilado usando um combinao do Metrowerks CodeWarrior for NetWare e uma verso especial de compilao cruzada do GNU autotools. Verifique esta seo no futuro para mais informaes sobre construo e otimizao do MySQL para NetWare.

2.6.9. Notas BeOS


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

Instalao do MySQL

2.7. Comentrios de Instalao do Perl


2.7.1. Instalando Perl no Unix
O suporte Perl para o MySQL fornecido pela interface cliente DBI/DBD. See Seco 12.5, API Perl do MySQL. O cdigo do cliente Perl DBD/DBI exige Perl Verso 5.004 ou posterior. A interface no funcionar se voc tiver uma verso mais do Perl. O suporte MySQL Perl tambm exige que voc tenha instalado o suporte a programao do cliente MySQL. Se voc instalou o MySQL a partir de arquivos RPM, os programas cliente esto no cliente RPM, mas o suporte a programao do cliente est no RPM de desenvolvimento. Certifique de se instalar este RPM posteriormente. Na Verso 3.22.8, o suporte Perl distribudo separadamente do dsitribuio principal do MySQL. Se voc quiser instalar o suporte Perl, os arquivos que voc precisr pode ser obtidos em http://www.mysql.com/downloads/api-dbi.html. As distribuies Perl so fornecidas como arquios tar compactados e so chamados MODULEVERSION.tar.gz, onde MODULE o nome do modulo e VERSION o nmero da verso. Voc deve conseguir as distribuies Data-Dumper, DBI, e DBD-mysql e instal-las nesta ordem. O procedimento de instalao mostrado aqui. O exemplo mostrado para o mdulo Data-Dumper, mas o procedimento o mesmo para todas as distribuies: 1. Descompacte as distribuies no diretrio atual: shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf Este comando cria um diretrio chamado Data-Dumper-VERSION. 2. Entre no diretrio principal da distribuio descompactada: shell> cd Data-Dumper-VERSION 3. Contrua a dsitribuio e compile tudo: shell> shell> shell> shell> perl Makefile.PL make make test make install

O comando make test importante porque verifica que o mdulo est funcionando. Note que ao executar este comando durante a instalao do DBD-mysql para exercitar o cdigo da interface, o servidor MySQL deve estar em execuo ou teste ir falhar. uma boa idia reconstruir e reinstalar a distribuio DBD-mysql mesmo se voc instalar uma nova distribuio do MySQL, particularmente se voc notar simntomas como se todos os seus scripts DBI realizarem dump core depois de voc atualizar o MySQL. Se voc no tem o direito para instalar os mdulos Perl no diretrio de sistema ou se voc quiser instalar mdulos Perl locais, a seguinte referncia pode ajud-lo: http://servers.digitaldaze.com/extensions/perl/modules.html#modules Procure sob o ttulo Installing New Modules that Require Locally Installed Modules.

2.7.2. Instalaando ActiveState Perl no Windows


152

Instalao do MySQL

Para instalar o mdulo DBD do MySQL com ActiveState Perl no Windows, voc deve fazer o seguinte: Obter o ActiveState Perl em http://www.activestate.com/Products/ActivePerl/ e instal-lo. Abrir um prompt do DOS. Se exigido, configurar a varivel HTTP_proxy. Por exemplo, voc pode tentar: 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: 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. Se voc no puder fazer o mostrado acima funcionar, voc deve instalar o driver MyODBC e conectar ao servidor MySQL atravs do ODBC: 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 problema mais provvel que o Perl no pode localizar a biblioteca compartilhada libmysqlclient.so. Voc pode corrigir isto por qualquer um dos seguintes mtodos: Compile a distribuio DBD-mysql com perl Makefile.PL -static -config em vez de perl Makefile.PL. Copie libmysqlclient.so para a diretrio onde sua bibliotecas compartilhadas esto localizadas (provavelmente /usr/lib ou /lib). No Linux voc pode adicionar o caminho do diretrio onde libmysqlclient.so est localizado ao arquivo /etc/ld.so.conf. Adicione o caminho do diretrio onde libmysqlclient.so est localizada varivel de ambiente LD_RUN_PATH.

Se voce receber os seguintes erros de DBD-mysql, voc provavelmente est usando gcc (ou usando um binrio antigo compilado com gcc): /usr/bin/perl: can't resolve symbol '__moddi3' 153

Instalao do MySQL

/usr/bin/perl: can't resolve symbol '__divdi3' Adicione -L/usr/lib/gcc-lib/... -lgcc ao comando de ligao quando a biblioteca mysql.so estiver construda (verifique a sada de make para mysql.so quando voc compilar o cliente Perl). A opo -L deve especificar o caminho do diretrio onde libgcc.a est localizada no seu sistema. Outra causa deste problema pode ser que Perl e o MySQL no so compilados com gcc. Neste caso, voc pode resolver o problema compilando ambos com gcc. Se voc receber o seguinte erro de DBD-mysql quando executar o teste: t/00base............install_driver(mysql) failed: Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169. significa que voc precisa adicionar a biblioteca compactada, -lz, a sua linha de ligao. Isto pode ser feito com a seguinte alterao no arquivo lib/DBD/mysql/Install.pm: $sysliblist .= " -lm"; Altere esta linha para: $sysliblist .= " -lm -lz"; Depois disto, voc deve executar 'make realclean' e proceder com o instalao desde o incio. Se voc quiser usar o mdulo Perl em um sistema que no suporta ligao dinmica (como SCO) voc pode gerar uma verso esttica do Perl que inclui DBI e DBD-mysql. O modo que isto funciona que voc gera uma verso do Perl com o odigo DBI ligado e instalado no topo do seu Perl atual. Entao voc o utiliza para construir uma verso do Perl que adicionalmente tem o cdigo DBD ligado em si, e instale-o. No SCO, voc deve ter as seguintes variveis de ambiente configuradas: 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 comandos no diretrio onde a sua distribuio DBI est localiada: shell> shell> shell> shell> perl Makefile.PL -static -config make make install make perl

Ento voc deve intalar o novo Perl. A sada de make perl indicar o comando make exato que voc precisar executar para realizar a instalao. No SCO, isto make -f Makefile.aperl inst_perl MAP_TARGET=perl. A seguir use o Perl rcem criado para criar outro Perl que tambm inclui uma DBD::mysql estaticamente ligado rodando estes comandos no diretrio onde sua distribuio DBD-mysql est localizada: 154

Instalao do MySQL

shell> shell> shell> shell>

perl Makefile.PL -static -config make make install make perl

Finalmente voc deve instalar este novo Perl. Novamente, a sada de make perl indica o comando a usar.

155

Captulo 3. Tutorial de Introduo Do MySQL


Este captulo fornece um tutorial de introduo ao MySQL demonstrando como usar o 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 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 arquivo, depois diz ao mysql para executar o contedo do arquivo. Cobrimos aqui ambas as formas de utilizar o mysql. Para ver uma lista de opes conhecidas pelo mysql, chame-o com a opo --help: shell> mysql --help Este captulo presume que o mysql est instalado na sua mquina e que um servidor MySQL est disponvel para quem puder conectar. Se isto no for verdade, contate seu administrador MySQL. (Se voc o administrador, voc precisar consultar outras sees deste manual.) Este captulo descreve todo o processo de configurao e uso de um banco de dados. Se voc estiver interessado em apenas acessar um banco de dados j existente, podera pular as sees que descrevem como criar o banco de dados e suas respectivas tabelas. Como este captulo um tutorial, vrios detalhes so necessariamente omitidos. Consulte as sees relevantes do manual para mais informaes sobre os tpicos cobertos aqui.

3.1. Conectando e Desconectando do Servidor


Para conectar ao servidor, normalmente voc precisar fornecer um nome de usurio quando 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 especificar um nome de mquina. Contate seu administrador para saber quais parmetros de conexo voc deve usar para conectar (isto , qual mquina, usurio e senha usar). Uma vez que voc saiba quais os parmetros corretos, voc deve estar pronto para conectar da seguinte forma: shell> mysql -h servidor -u usuario -p Enter password: ******** Os asteriscos (********) representam sua senha; digite-a quando o mysql mostrar o prompt Enter password:. Se isto funcionar, voc deve ver algumas informaes iniciais seguidas de um prompt mysql> 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. Algumas instalaes MySQL permitem aos usurios de se conectarem como usurios annimos ao servidor executando na mquina local. Se isto o caso na sua mquina, voc deve conseguir conec156

Tutorial de Introduo Do MySQL

tar ao servidor chamando o mysql sem qualquer opo: shell> mysql Depois de voc conectar com sucesso, voc pode disconectar a qualquer hora digitando QUIT (ou \q) no prompt mysql>: mysql> QUIT Bye No Unix, voc tambm pode desconectar pressionando Control-D. A maioria dos exemplos nas sees seguintes assumem que voc j est conectado ao servidor. Isto indicado pelo prompt mysql>.

3.2. Fazendo Consultas


Tenha certeza que voc est conectado ao servidor, como discutido na seo anterior. Isto feito, no ser selecionado nenhum banco de dados para trabalhar, mas no tem problemas. Neste momento, mais importante saber um pouco sobre como fazer consultas do que j criar tabelas, carregar dados para elas, e recuperar dados delas. Esta seo descreve os princpios bsicos da entrada de comandos, usando diversas consultas voc pode tentar se familiarizar com o funcionamento do mysql. Aqui est um comando simples que solicita ao servidor seu nmero de verso e a data atual. Digiteo 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: Um comando normalmente consiste de uma instruo SQL seguida por um ponto e vrgula. (Existem algumas excees onde um ponto e vrgula podem ser omitidos. QUIT mencionado anteriormente, um deles. Saberemos de outros mais tarde.) Quando voc emite um comando, o mysql o envia para o servidor para execuo e mostra os resultados, depois imprime outro prompt mysql> para indicar que est pronto para outro comando. O mysql mostra a sada da consulta em forma tabular (linhas e colunas). A primeira linha contm rtulos para as colunas. As linhas seguintes so o resultado da consulta. Normalmente, rtulos de colunas so os nomes das colunas que voc busca das tabelas do banco de dados. Se voc est recuperando o valor de uma expresso no lugar de uma coluna de tabela (como no exemplo j visto), o mysql rotula a coluna usando a prpria expresso. 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 so impreciso porque eles representam tempo de relgio (No tempo de CPU ou de mquina), e porque eles so afetados pelos fatores como a carga do servidor e latncia de rede. (Para resumir, a linha ``rows in set'' no mostrada nos exemplos seguintes deste captulo.)

Palavras Chave podem ser entradas em qualquer caso de letra. As seguintes consultas so equivalentes: 157

Tutorial de Introduo Do MySQL

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 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. Voc pode tambm entrar com mltiplas instrues em uma nica linha. Basta finalizar cada uma com um ponto e vrgula: 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 nica linha, ento comandos extensos que necessitam de vrias linhas no so um problema. O mysql determina onde sua instruo termina atravs do ponto e vrgula terminador, e no pelo final da linha de entrada. (Em outras palavras, o myqsl aceita entradas de livre formato: Ele coleta linhas de entrada mas no as executa at chegar o ponto e vrgula.) Aqui est uma instruo simples usando mltiplas linhas: mysql> SELECT -> USER() -> , -> CURRENT_DATE; +--------------------+--------------+ | USER() | CURRENT_DATE | +--------------------+--------------+ | joesmith@localhost | 1999-03-18 | +--------------------+--------------+ Neste exemplo, note como o prompt altera de mysql> para -> depois de voc entrar a primeira linha de uma consulta com mltiplas linhas. Isto como o mysql indica que ainda no achou uma instruo completa e est esperando pelo resto. O prompt seu amigo, porque ele fornece um retorno valioso. Se voc usa este retorno, voc sempre estar ciente do que o mysql est esperando. Se voc decidir que no deseja executar um comando que est no meio do processo de entrada, cancele-o digitando \c: mysql> SELECT -> USER() -> \c mysql>

158

Tutorial de Introduo Do MySQL

Note o prompt aqui tambm. Ele troca para o mysql> depois de voc digitar \c, fornecendo retorno para indicar que o mysql est pronto para um novo comando. A seguinte tabela mostra cada dos prompts que voc pode ver e resume o que ele significa sobre o estado em que o mysql se encontra: Prompt Significado

mysql> Pronto para novo comando. -> Esperando pela prxima linha de comando com mltiplas linhas. '> Esperando pela prxima linha, coletando uma string que comece com uma aspas simples ('). "> Esperando pela prxima linha, coletando uma string que comece com aspas duplas ("). `> Esperando pela prxima linha, coletando uma string que comece com crase (`). muito comum instrues multi-linhas ocorrerem por acidente quando voc pretende publicar um comando em uma nica linha, mas esquece o ponto e vrgula terminador. Neste caso,o mysql espera por mais entrada: mysql> SELECT USER() -> Se isto ocorrer com voc (acha que entrou uma instruo mas a nica resposta um prompt ->), o mais provvel que o mysql est esperando pelo ponto e vrgula. Se voc no perceber o que o prompt est lhe dizendo, voc pode parar por um tempo antes de entender o que precisa fazer. Entre com um ponto e vrgula para completar a instruo, e o mysql ir execut-la: mysql> SELECT USER() -> ; +--------------------+ | USER() | +--------------------+ | joesmith@localhost | +--------------------+ O prompt '> e "> ocorrem durante a coleta de strings. No MySQL, voc pode escrever strings utilizando os caracteres ' ou " (por exemplo, 'hello' ou "goodbye"), e o mysql permite a entrada de strings que consomem mltiplas linhas. Quando voc ver um prompt '> ou ">, significa que voc digitou uma linha contendo uma string que comea com um caracter de aspas ' ou " mas ainda no entrou com a aspas que termina a string. Isto bom se voc realmente est entrando com uma string com mltiplas linhas, mas qual a probalidade disto acontecer ? No muita. Geralmente, os prompts '> e "> indicam que voc, por algum descuido, esqueceu algum caracter de aspas. Por exemplo: 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 acontecer. Em vez de se perguntar o porqu desta query demorar tanto tempo, perceba a pista fornecida pelo prompt ">. Ele lhe diz que o mysql espera pelo resto de uma string no terminada. (Voc ve o erro na declarao? Falta a segunda aspas na string "Smith.) O que fazer neste ponto ? A coisa mais simples cancelar o comando. Entretanto, voc no pode simplesmente digitar \c neste caso, porque o mysql o intrerpreta como parte da string que est coletando! Digite o caracter de aspas para fechar (ento o mysql sabe que voc fechou a string), ento digite \c: mysql> SELECT * FROM minha_tabela WHERE nome = "Smith AND idade < 30; 159

Tutorial de Introduo Do MySQL

"> "\c mysql> O prompt volta para mysql>, indicando que o mysql est pronto para um novo comando. O prompt `> similar aos prompts '> e ">, mas indica que voc comeou mas no completou um identificados citado com o sinal de crase. importante saber o que os prompts '>, "> e `> significam, porque se voc entrar sem querer com uma string sem terminao, quaisquer linhas seguintes que forem digitadas sero ignoradas pelo mysql --- incluindo uma linha contendo QUIT! Isto pode ser um pouco confuso, especialmente se voc no sabe que voc precisa fornecer as aspas finais antes poder cancelar o comando atual.

3.3. Criao e Utilizao de um Banco de Dados


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

O banco de dados menagerie ser simples (deliberadamente), mas no difcil pensar em situaes na vida real em que um tipo similar de banco de dados pode ser usado. Por exemplo, um banco de dados deste tipo pode ser usado por um fazendeiro para gerenciar seu estoque de animais, ou por um veterinrio para gerenciar registros de seus pacientes. Uma distribuio do menagerie contendo algumas das consultas e dados de exemplos usados nas sees seguintes podem ser obtidas do site Web do MySQL. Esto disponveis 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: mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | | tmp | +----------+ A lista de bancos de dados provavelmente ser diferente na sua mquina, mas os bancos de dados mysql e test provavelmente estaro entre eles. O banco de dados mysql necessrio porque ele descreve privilgios de acessos de usurios. O banco de dados test geralamente fornecido como um espao para que os usurios possam fazer testes. Note que voc no pode ver todos os banco de dados se voc ni tiver o privilgio SHOW DATABA160

Tutorial de Introduo Do MySQL

SES. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE. Se o banco de dados test existir, tente acess-lo: mysql> USE test Database changed Perceba que o USE, como o QUIT, no necessitam de um ponto e vrgula. (Voc pode terminar tais declaraes com uma ponto e vrgula se gostar; isto no importa) A instruo USE especial em outra maneira, tambm: Ela deve ser usada em uma nica linha. Voc opde usar o banco de dados test (Se voc tiver acesso a ele) para os exemplos que seguem mas qualquer coisa que voc criar neste banco de dados pode ser removido por qualquer um com acesso a ele. Por esta razo, voc provavelmente deve pedir permisso ao seu administrador MySQL para usar um banco de dados prprio. Suponha que voc o 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 your_client_host a mquina da qual voc se conecta ao servidor. atribuido a voc e

3.3.1. Criando e Selecionando um Banco de Dados


Se o administrador criar seu banco de dados quando configurar as suas permisses, voc pode comear a us-lo. Seno, voc mesmo precisa cri-lo: mysql> CREATE DATABASE menagerie; No Unix, nomes de bancos de dados so caso sensitivo (ao contrrio das palavras chave SQL), portanto voc deve sempre fazer referncia ao seu banco de dados como menagerie e no Menagerie, MENAGERIE ou outra variao. Isto tambm verdade para nomes de tabelas. (No Windows, esta restrio no se aplica, entiretanto voc deve referenciar os bancos de dados e tabelas usando o mesmo caso em toda a parte da consulta.) Criar um bancos de dados no o seleciona para o uso; voc deve fazer isso de forma explcita. 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 nica vez, mas voc deve selecion-lo para o uso cada vez que voc iniciar uma seo mysql. Voc pode fazer isso usando a instruo USE como visto no exemplo. Uma forma alternativa selecionar o banco de dados na linha de comando quando voc chamar o mysql. Apenas especifique seu nome depois de qualquer parmetro de conexo que voc pode precisar fornecer. Por exemplo: shell> mysql -h servidor -u usuario -p menagerie Enter password: ******** Perceba que menagerie no sua senha no comando mostrado. Se voc precisar passar sua senha na linha de comando depois da opo -p, voc deve faz-lo sem usar espaos (por exemplo, pminhasenha e no como em -p minhasenha). Entretando, colocando sua senha na linha de comando no recomendado, porque isto expe sua senha permitindo que outro usurio utilize a sua mquina.

3.3.2. Criando uma Tabela


Criar o banco de dados a parte fcil, mas neste ponto ele est vazio, como o SHOW TABLES mos161

Tutorial de Introduo Do MySQL

trar: mysql> SHOW TABLES; Empty set (0.00 sec) A parte mais difcil decidir qual a estrutura que seu banco de dados deve ter: quais tabelas voc precisar e que colunas estaro em cada uma delas. Voc ir precisar de uma tabela para guardar um registro para cada um de seus animais de estimao. Esta tabela pode ser chamada pet, e ela deve conter, pelo menos, o nome de cada animal. Como o nome por si s no muito interessante, a tabela dever conter outras informaes. Por exemplo, se mais de uma pessoa na sua famlia tambm tem animais, voc pode desejar listar cada dono. Voc pode tambm desejargravar algumas informaes descritivas bsicas como espcie e sexo. Que tal a idade? Pode ser do interesse, mas no uma boa coisa para se armazenar em um banco de dados. A idade muda medida em que o tempo passa, o que significa que voc sempre ter de atualizar seus registros. Em vez disso, melhor armazenar um valor fixo como a data de nascimento. Ento, sempre que voc precisar da idade, basta voc calcul-la como a diferena entre a data atual e a data de aniversrio. O MySQL fornece funes para fazer aritmtica de datas, ento isto no difcil. Armazenando datas de aniversrio no lugar da idade tambm oferece outras vantagens: Voc pode usar o banco de dados para tarefas como gerar lembretes para aniversrios que esto chegando. (Se voc pensa que este tipo de query algo bobo, perceba que a mesma questo que voc perguntar no contexto de um banco de dados comercial para identificar clientes para quais voc precisar enviar carto de aniversrio, para um toque pessoal assistido pelo computador.) Voc pode calcular a idade em relao a outras datas diferente da data atual. Por exemplo, se voc armazenar a data da morte no banco de dados, voc poder facilmente calcular qual a idade que o bicho tinha quando morreu.

Voc provavelmente pode pensar em outros tipos de informaes que podero ser teis na tabela pet, mas as identificadas at o momento so suficientes por agora: nome(name), dono(owner), espcie(species), sexo(sex), data de nascimento(birth) e data da morte(death). Utilize a sentea CREATE TABLE para especificar o layout de sua tabela: mysql> CREATE TABLE pet (nome VARCHAR(20), owner VARCHAR(20), -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE); VARCHAR uma boa escolha para os campos name, owner, e species porque os valores da coluna so de tamanho varivel. Os tamanhos destas colunas no precisam necessriamente de ser os mesmos e no precisam ser 20. Voc pode escolher qualquer tamanho de 1 a 255, o que voc achar melhor. (Se voc no fizer uma boa escolha e depois precisar de um campo maior, o MySQL fornece o comando ALTER TABLE.) O sexo dos animais podem ser representados em vrias formas, por exemplo, "m" e "f" ou mesmo "macho" e "fmea". mais simples usar os caracteres "m" e "f". O uso do tipo de dados DATE para as colunas birth e death so obviamente a melhor escolha. Agora que voc criou uma tabela, a instruo SHOW TABLES deve produzir alguma sada: mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | pet | +---------------------+ Para verificar se sua tabela foi criada da forma que voc esperava, utilize a instruo DESCRIBE: 162

Tutorial de Introduo Do MySQL

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 colunas na sua tabela ou de que tipos elas tm.

3.3.3. Carregando dados em uma tabela


Depois de criar sua tabela, voc precisar povo-la. As instrues LOAD DATA e INSERT so teis para isto. Suponha que seu registro de animais possa ser descrito como abaixo: (Observe que o MySQL espera datas no formato AAAA-MM-DD; isto pode ser diferente do que voc est acostumado.) name Fluffy Claws Buffy Fang Bowser Chirpy Whistler Slim owner Harold Gwen Harold Benny Diane Gwen Gwen Benny species cat cat dog dog dog bird bird snake m sex f m f m m f 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 1995-07-29 death

Como voc est comeando com uma tabela vazia, uma forma simples de povo-la criar um arquivo texto contendo uma linha para cada um de seus animais, e depois carregar o contedo do arquivo para a tabela com uma simples instruo. Voc pode criar um arquivo texto pet.txt contendo um registro por linha, com valores separado por tabulaes e na mesma ordem em que as colunas foram listadas na instruo 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 arquivo texto, use \N (barra invertidam N mausculo). Por exemplo, o registro para Whistler the bird podem parecer com isto (onde o espao em branco entre os valores um simples caractere de tabulao): name owner species bird sex \N birth 1997-12-09 death \N

Whistler Gwen

Para carregar o arquivo texto pet.txt na tabela pet, use este comando: mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet; Voc pode especificar o valor do separador de colunas e o marcador de final de linha explicitamente na instruo LOAD DATA se voc desejar. Mas os valores omitidos so suficientes para a instruo ler o arquivo pet.txt corretamente.

163

Tutorial de Introduo Do MySQL

Se a instruo falhar, desejvel que a sua instalao do MySQL no tenha a capacidade do arquivo local habilitada por padro. Veja Seco 4.3.4, Detalhes de Segurana com LOAD DATA LOCAL para informaes sobre como alterar isto. Quando voc desejar adicionar novos registros um a um, a instruo INSERT usada. Na sua forma mais simples, voc fornece valores para cada coluna, na ordem em que as colunas foram listadas na instruo CREATE TABLE. Suponha que Diane tenha um novo hamster chamado Puffball. Voc pode adicionar um registro utilizando uma instruo INSERT desta forma: mysql> INSERT INTO pet -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL); Perceba que os valores de string e datas so especificados aqui como strings com aspas. Com o INSERT voc tambm pode inserir NULL diretamente para representar um valor em falta. No pode ser usado \N como voc fez com LOAD DATA. A partir deste exemplo, voc dever perceber que existem vrias outras formas envolvidas para carregar seus registros inicialmente utilizando diversas instrues INSERT do que uma simples instruo LOAD DATA.

3.3.4. Recuperando Informaes de uma Tabela


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

3.3.4.1. Selecionando Todos os Dados


A forma mais simples do SELECT recuperar tudo de uma tabela: 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 til se voc deseja ver sua tabela inteira como agora, depois de voc acabar de carreg-la com os dados iniciais. Por exempo, voc pode pensar que a data de nascimento do Bowser no est correta. Consultando seus papis originais de pedigree, descobriu que o ano correto do nascimento deve ser 1989, no 1979. Existem pelo menos duas formas de corrigir isto:

164

Tutorial de Introduo Do MySQL

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; Entretanto, se voc fizer isto, voc tambm deve refazer a entrada para Puffball. Corrigir somente o registro errado com uma instruo UPDATE: 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.

3.3.4.2. Selecionando Registros Especficos


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

165

Tutorial de Introduo Do MySQL

A consulta anterior utiliza o operador lgico AND (e). Existe tambm um operador OR (ou): mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird"; +----------+-------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+-------+ | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | | Slim | Benny | snake | m | 1996-04-29 | NULL | +----------+-------+---------+------+------------+-------+ AND e OR podem ser misturados, embora AND tem maior precedncia que OR. Se voc usar ambos os operadores, uma tima idia usar parnteses para indicar explicitamente quais condies devem ser agrupadas: mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m") -> OR (species = "dog" AND sex = "f"); +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+

3.3.4.3. Selecionando Colunas Especficas


Se voc no desejar ver todo o registro de sua tabela, especifique as colunas em que voc estiver interessado, separado por vrgulas. Por exemplo, se voc deseja saber quando seus 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: mysql> SELECT owner FROM pet; +--------+ | owner | +--------+ | Harold | | Gwen | | Harold | | Benny | | Diane | | Gwen | | Gwen | | Benny | | Diane | +--------+ Entretanto, perceba que a query simplesmente retornou o campo owner de cada registro, e alguns 166

Tutorial de Introduo Do MySQL

deles apareceram mais de uma vez. Para minimizar a sada, 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 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 mostrados de forma ordenada. Normalmente mais fcil examinar a sada da consulta quando os registros so ordenados com algum sentido. Para ordenar o resultado, utilize uma clusula ORDER BY. Aqui est o dia de nascimento dos animais, ordenado por data: mysql> SELECT name, birth FROM pet ORDER BY birth; +----------+------------+ | name | birth | +----------+------------+ | Buffy | 1989-05-13 | | Bowser | 1989-08-31 | | Fang | 1990-08-27 | | Fluffy | 1993-02-04 | | Claws | 1994-03-17 | | Slim | 1996-04-29 | | Whistler | 1997-12-09 | | Chirpy | 1998-09-11 | | Puffball | 1999-03-30 | +----------+------------+ Em colunas de tipo de caracter, ordenaio como qualquer outra operao de comparao normalmente realizada no modo caso insensitivo. Isto significa que a ordem ser indefinida para colunas que so idnticas exceto quanto ao caso da letra. Voc pode forar uma ordenao em caso senitivo para uma coluna usando a coero BINARY: ORDER BY BINARY(campo). A ordenao padro crescente, com os valores menores em primeiro. Para ordenao na ordem reversa, adicione a palavra chave DESC (descendente) ao nome da coluna que deve ser ordenada: mysql> SELECT name, birth FROM pet ORDER BY birth DESC; +----------+------------+ | name | birth | +----------+------------+ | Puffball | 1999-03-30 | | Chirpy | 1998-09-11 | 167

Tutorial de Introduo Do MySQL

| 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 classificar colunas em direes diferentes. Por exemplo, para ordenar o tipo de animal em ordem crescente, depois por dia de nascimento dentro do tipo de animal em ordem decrescente (com os mais novos primeiro), utilize a seguinte consulta: mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC; +----------+---------+------------+ | name | species | birth | +----------+---------+------------+ | Chirpy | bird | 1998-09-11 | | Whistler | bird | 1997-12-09 | | Claws | cat | 1994-03-17 | | Fluffy | cat | 1993-02-04 | | 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.

3.3.4.5. Clculo de Datas


O MySQL fornece vrias funes que voc pode usar para realizar clculos em datas, por exemplo, para calcular idades ou extrair partes de datas. Para determinar quantos anos cada um do seus animais tem, compute a diferena do ano da data atual e a data de nascimento (birth), depois subtraia se a o dia/ms da data atual for anterior ao dia/ms da data de nascimento. A consulta seguinte, mostra, para cada animal, a data de nascimento, a data atual e a idade em anos. mysql> SELECT name, birth, 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 valores MM-DD resulta em 1 ou 0, o qual ajusta a diferena do ano um ano abaixo se CURDATE ocorrer mais cedo, no ano, que birth. A expresso completa um tanto deselegante, ento um apelido (age) usado 168

Tutorial de Introduo Do MySQL

para obter uma sada mais significativa. A consulta funciona, mas o resultado pode ser mais compreensvel se os registros forem apresentados em alguma ordem. Isto pode ser feito adicionando uma clusula ORDER BY name para ordenar a sada pelo nome: mysql> SELECT name, birth, CURDATE(), -> (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 sada por age em vez de name, s utilizar uma clusua ORDER BY diferente: mysql> SELECT name, birth, CURDATE(), -> (YEAR(CURDATE())-YEAR(birth)) -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) -> AS age -> FROM pet ORDER BY age; +----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | +----------+------------+------------+------+ Uma consulta similar pode ser usada para determinar a idade na morte para animais que morreram. Para determinar quais so os animais, confira se o valor de death no NULL. Depois para estes com valores no-NULL, compute a diferena entre os valores dos campos death e birth: mysql> SELECT name, birth, death, -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5)) -> AS age -> FROM pet WHERE death IS NOT NULL ORDER BY age; +--------+------------+------------+------+ | name | birth | death | age | +--------+------------+------------+------+ | Bowser | 1989-08-31 | 1995-07-29 | 5 | +--------+------------+------------+------+ A consulta usa death IS NOT NULL em vez de death != NULL porque NULL um valor especial que no pode ser comparada usando operadores comuns de comparao. Isto ser explicado depois. See Seco 3.3.4.6, Trabalhando com Valores Nulos (NULL). E se voc desejar saber quais animais fazem aniversrio no prximo ms? Para este tipo de clculo, ano e dia so irrelevantes; voc simplesmente deseja extrair a parte do ms da coluna birth. O 169

Tutorial de Introduo Do MySQL

MySQL fornece diversas funes para extrair partes da data, como em YEAR(), MONTH() e DAYOFMONTH(). MONTH a funo apropriada aqui. Para ver como ela funciona, execute uma consulta simples que mostre o valor de birth e MONTH(birth): mysql> SELECT name, birth, MONTH(birth) FROM pet; +----------+------------+--------------+ | name | birth | MONTH(birth) | +----------+------------+--------------+ | Fluffy | 1993-02-04 | 2 | | Claws | 1994-03-17 | 3 | | Buffy | 1989-05-13 | 5 | | Fang | 1990-08-27 | 8 | | Bowser | 1989-08-31 | 8 | | Chirpy | 1998-09-11 | 9 | | Whistler | 1997-12-09 | 12 | | Slim | 1996-04-29 | 4 | | Puffball | 1999-03-30 | 3 | +----------+------------+--------------+ Encontrar animais com anversrio no prximo ms tambm fcil. Suponha que o ms atual abril. Ento o valor do ms 4 e voc procura por animais nascidos em Maio (ms 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 adicionar um para o nmero do ms (12) e procurar por animais nascidos no ms 13, porque no existe tal ms. O certo seria procurar por animais nascidos em Janeiro (ms 1). Voc pode tambm escrever uma consulta para que funcione sem importar qual o ms atual. Assim voc no tm quee usar um nmero de ms em particular na consulta. DATE_ADD() permite adicionar um intervalo de tempo para uma data fornecida. Se voc adicionar um ms para o valor de CURDATE, ento extrair a parte do ms com MONTH(), o resultado o ms no qual voc deseja procurar por aniversrios: mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(), INTERVAL 1 MONTH)); Uma maneira diferente para realizar a mesma tarefa adicionar 1 para obter o ms seguinte ao atual (depois de usar a funo mdulo (MOD) para o valor do ms retornar 0 se ele for 12): mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1; Perceba que MONTH retorna um nmero entre 1 e 12. E MOD(alguma_coisa,12) retorna um nmero entre 0 e 11. Ento a adio tem que ser feita depois do MOD(), seno iramos de Novembro (11) para Janeiro (1).

3.3.4.6. Trabalhando com Valores Nulos (NULL)


O valor NULL pode ser supreendente at voc us-lo. Conceitualmente, NULL significa valor em falta ou valor desconhecido e tratado de uma forma diferente de outros valores. Para testar o valor NULL, voc no pode usar os operadores de comparaes aritmticas como em =, <, ou !=. Para demonstrar para voc mesmo, tente executar a seguinte consulta: mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL; +----------+-----------+----------+----------+ | 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL | +----------+-----------+----------+----------+ 170

Tutorial de Introduo Do MySQL

| NULL | NULL | NULL | NULL | +----------+-----------+----------+----------+ Claramente voc no obter resultados significativos destas comparaes. Utilize os operadores IS NULL e IS NOT NULL no lugar: mysql> SELECT 1 IS NULL, 1 IS NOT NULL; +-----------+---------------+ | 1 IS NULL | 1 IS NOT NULL | +-----------+---------------+ | 0 | 1 | +-----------+---------------+ No MySQL, 0 ou NULL significa falso e o resto verdadeiro. O valor verdadeiro por o padro em uma operao booleana 1. Este tratamento especial de NULL porque, na seo anterior, foi necessrio determinar quais animais no estavam mais vivos usando death IS NOT NULL no lugar de death <> NULL. Dois valores NULL so considerados como iguais em um GROUP BY. Ao fazer um ORDER BY, valores NULL so apresentados primeiro se voc fizer ORDER BY ... ASC e por ltimo se voc fizer ORDER BY ... DESC. 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


O MySQL fornece combinao de padres do SQL bem como na forma de combinao de padres baseado nas expresses regulares extendidas similares quelas usadas pelos utilitrios Unix como o vi, grep e sed. A combinao de padres SQL lhe permite voc usar _ para coincidir qualquer caractere simples e % para coincidir um nmero arbitrrio de caracteres (incluindo zero caracter). No MySQL, padres SQL so caso insensitivo por padro. Alguns exemplos so vistos abaixo. Perceba que voc no usa = ou != quando usar padres SQL; use os operadores de comparao LIKE ou NOT LIKE neste caso. Para encontrar nomes comeando com b: mysql> SELECT * FROM pet WHERE name LIKE "b%"; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+ Para encontrar nomes com o final 'fy': mysql> SELECT * FROM pet WHERE name LIKE "%fy"; +--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+ Para encontrar nomes contendo um w: mysql> SELECT * FROM pet WHERE name LIKE "%w%"; +----------+-------+---------+------+------------+------------+ 171

Tutorial de Introduo Do MySQL

| 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 caracter _: mysql> SELECT * FROM pet WHERE name LIKE "_____"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+ O outro tipo de combinao de padres fornecido pelo MySQL usa expresses regulares extendidas. Quando voc testa por uma combinao para este tipo de padro, utilize os operadores REGEXP e NOT REGEXP (ou RLIKE e NOT RLIKE, que so sinnimos). Algumas caractersticas das expresses regulares extendidas so: . combina qualquer caractere nico 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]' combina com qualquer dgito. * combina com nenhuma ou mais instncias de sua precedncia. Por exemplo, 'x*' combina com qualquer nmero de caracteres x, '[0-9]*' combina com qualquer nmero de dgitos e '.*' combina com qualquer nmero de qualquer coisa. Um padro REGEXP casa com sucesso se ele ocorre em algum lugar no valor sendo testado. (Ele difere do padro LIKE, que s obtem suceeso se eles combinarem com todo o valor.) Para fazer com que um padro deva combinar com o comeo ou o fim de um valor sendo testado, utilize ^ no comeo ou $ no final do padro.

Para demonstrar como expresses regulares extendidas funcionam, as consultas com LIKE mostradas acima foram reescritas abaixo usando REGEXP. Para encontrar nomes comeando com b, utilize ^ para combinar com o comeo do nome: mysql> SELECT * FROM pet WHERE name REGEXP "^b"; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+ Antes da verso 3.23.4 do MySQL, REGEXP era caso sensitivo, e a consulta anterior no iria retornar nenhum registro. Neste caso, para combinar letras b maisculas e minsculas, 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 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: 172

Tutorial de Introduo Do MySQL

mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b"; Para encontrar nomes finalizados com 'fy', utilize $ para combinar com o final do nome: mysql> SELECT * FROM pet WHERE name REGEXP "fy$"; +--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+ Para encontrar nomes contendo um w, utilize esta consulta: mysql> SELECT * FROM pet WHERE name REGEXP "w"; +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+ | 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 qualquer lugar no valor comparado, no necessrio utiliar, na consulta anterior, nenhum metacaracter em nenhum dos lados do padro para faz-lo coincidir com todo o valor, como seria feito se fosse utilizado o padro SQL. Para encontrar nomes contendo exatamente cinco caracteres, utilize ^ e $ para combinar com o comeo e fim do nome e cinco instncias de . entre eles. mysql> SELECT * FROM pet WHERE name REGEXP "^.....$"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+ Voc pode tambm escrever a consulta anterior utilizando o operador '{n}' ``repete-n-vezes'': mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$"; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+

3.3.4.8. Contando Registros


Bancos de dados normalmente so usados para responder a perguntas, ``Qual a frequncia que certo tipo de dados ocorre em uma tabela?'' Por exemplo, voc deve querer saber quantos animais tem, ou quantos animais cada dono tem, ou voc pode querer fazer vrios outros tipos de operaes de censo com seus animais. Contando o nmero total de animais que voc tem a mesma questo como em ``Quantos 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 com isto: mysql> SELECT COUNT(*) FROM pet; 173

Tutorial de Introduo Do MySQL

+----------+ | COUNT(*) | +----------+ | 9 | +----------+ Logo, voc recuperar os nomes das pessoas que possuam animais. Voc pode usar COUNT() se voc desejar encontrar quantos animais cada dono possui: mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Benny | 2 | | Diane | 2 | | Gwen | 3 | | Harold | 2 | +--------+----------+ Perceba o uso de GROUP BY para agrupar todos os registros para cada owner (dono). Sem ele, voc teria uma mensagem de erro: mysql> SELECT owner, COUNT(*) FROM pet; ERROR 1140: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause COUNT() e GROUP BY so teis para personalizar seus dados de diversas maneiras. Os seguintes exemplos mostram diferentes maneiras para realizar operaes de censo nos animais. Nmero de animais por espcie: 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: mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; +------+----------+ | sex | COUNT(*) | +------+----------+ | NULL | 1 | | f | 4 | | m | 4 | +------+----------+ (Nesta sada, NULL indica que o sexo desconhecido.) Nmero de animais combinando espcie e sexo: mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | NULL | 1 | | bird | f | 1 | | cat | f | 1 | 174

Tutorial de Introduo Do MySQL

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


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

Dadas estas consideraes, a instruo CREATE TABLE para a tabela event deve se parecer com isto: mysql> CREATE TABLE event (name VARCHAR(20), date DATE, -> type VARCHAR(15), remark VARCHAR(255)); Como na tabela pet, mais fcil carregar os registros iniciais criando um arquivo texto delimitado por tabulaes contendo a informao:

175

Tutorial de Introduo Do MySQL

name Fluffy Buffy Buffy 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 flea 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 apto para realizar pesquisas na tabela event; os princpios so o mesmo. Mas quando a tabela event, sozinha, insuficiente para responder s suas questes? Suppose you want to find out the ages at which each pet had its litters. We saw earlier how to calculate ages from two dates. The litter date of the mother is in the event table, but to calculate her age on that date you need her birth date, which is stored in the pet table. This means the query requires both tables: Suponha que voc deseje descobrir as idades de cada animal quando eles tiveram cria. Ns vemos logo que possvel calcular a idade a partir das duas datas. A idade dos filhotes est na tabela event, mas para calcular a idade da me, voc precisar da data de nascimento dela, que est armazenado na tabela pet. Isto significa que voc precisar das duas tabelas para a consulta: mysql> SELECT pet.name, -> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age, -> remark -> FROM pet, event -> WHERE pet.name = event.name AND type = "litter"; +--------+------+-----------------------------+ | name | age | remark | +--------+------+-----------------------------+ | Fluffy | 2 | 4 kittens, 3 female, 1 male | | Buffy | 4 | 5 puppies, 2 female, 3 male | | Buffy | 5 | 3 puppies, 3 female | +--------+------+-----------------------------+ Existem vrias coisas que devem ser percebidas sobre esta consulta: A clusula FROM lista as duas tabelas porque a consulta precisa extrair informao de ambas. Quando combinar (unir) informaes de mltiplas tabelas, voc precisa especificar como registros em uma tabela podem ser coincididas com os registros na outra. Isto simples porque ambas possuem uma coluna name. A consulta utiliza a clusula WHERE para coincidir registros nas duas tabelas baseadas nos valores de name. Como a coluna name ocorre em ambas tabelas, voc deve especificar qual a tabela a que voc est se referindo. Isto feito usando o nome da tabela antes do nome da coluna separados por um ponto (.).

176

Tutorial de Introduo Do MySQL

Voc no precisa ter duas tabelas diferentes para realizar uma unio. Algumas vezes til unir uma tabela a ela mesma, se voc deseja comparar registros em uma tabela com outros registros na mesma tabela. Por exemplo, para encontrar pares entre seus animais, voc pode unir a tabela pet com ela mesma para produzir pares candidatos de machos e fmeas de acordo com as espcies: 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 especificamos apelidos para os nomes das tabelas para conseguir referenciar s colunas e manter com qual instncia da tabela cada coluna de referncia est associdada.

3.4. Obtendo Informaes Sobre Bancos de Dados e Tabelas


E se voc esquecer o nome de um banco de dados ou tabela, ou como a estrutura de uma certa tabela (por exemplo, como suas colunas so chamadas)? O MySQL resolve este problema atravs de diversas instrues que fornecem informaes sobre os bancos de dados e as tabelas que ele suporta. Voc j viu SHOW DATABASES, que lista os bancos de dados gerenciados pelo servidor. Para saber qual banco de dados est sendo usado atualmente, utilize a funo DATABASE(): mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | menagerie | +------------+ Se voc ainda no selecionou nenhum banco de dados ainda, o resultado NULL. (ou a string vazia antes do MySQL 4.1.1). Para saber quais tabelas o banco de dados atual contm (por exemplo, quando voc no 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 til; ele mostra informaes sobre cada uma das colunas da tabela: mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | 177

Tutorial de Introduo Do MySQL

| 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, Null indica se a coluna pode conter valores nulos (NULL), key indica se a coluna indexada ou no e Default especifica o valor padro da coluna. Se voc tem ndices em uma tabela, SHOW INDEX FROM tbl_nome traz informaes sobre eles.

3.5. Utilizando mysql em Modo Batch


Nas sees anteriores, voc usou mysql interativamente para fazer consultas e ver os resultados. Voc pode tambm executar mysql no modo batch. Para fazer isto, coloque os comando que voc deseja executar em um arquivo, e diga ao mysqld para ler sua entrada do arquivo: shell> mysql < batch-file Se voc estiver executando o mysql no Windows e tiver algum caracter especial no arquivo que provocou o problema, voc pode fazer: dos> mysql -e "source batch-file" Se voc precisa especificar parmetros de conexo na linha de comando, o comando deve parecer com isto: shell> mysql -h host -u user -p < batch-file Enter password: ******** Quando voc utilizar o mysql desta forma, voc estar criando um arquivo script, depois executando o script. Se voc quiser que o script continue mesmo se hopuver erros, voc deve usar a opo de linha de comando --force. Por que usar um script? Existem vrias razes: Se voc executa uma query repetidamente (digamos, todos os dias ou todas as semanas), transform-lo em um script permite que voc no o redigite toda vez que o executa. Voc pode gerar novas consultas a partir das j existentes copiando e editando os arquivos de script. O modo batch pode tambm ser til quando voc estiver desenvolvendo uma consulta, particularmente para comandos de mltiplas linhas ou sequncias de comandos com vrias instrues. Se voc cometer um erro, no ser necessrio redigitar tudo. Apenas edite seu arquivo script e corrija o erro, depois diga ao mysql para execut-lo novamente. Se voc tem uma query que produz muita sada, voc pode encaminhar a sada atravs de um pginador. shell> mysql < batch-file | more Voc pode capturar a sada em um arquivo para processamento posterior: shell> mysql < batch-file > mysql.out

178

Tutorial de Introduo Do MySQL

Voc pode distribuir seu script para outras pessoas para que elas possam executar os comandos tambm. Algumas situaes no permitem uso interativo, por exemplo, quando voc executa uma consulta atravs de um processo automtico (cron job). Neste caso, voc deve usar o modo batch.

A formato padro de sada diferente (mais conciso) quando voc executa o mysql no modo batch do que quando voc o usa interativamente. Por exemplo, a sada de SELECT DISTINCT species FROM pet se parece com isto quando voc o executa interativamente: +---------+ | species | +---------+ | bird | | cat | | dog | | hamster | | snake | +---------+ Mas fica assim quando voc o executa no modo batch: species bird cat dog hamster snake Se voc desejar obter o formato de sada interativa no modo batch, utilize mysql -t. Para mostrar a sada dos comandos que so executados, utilize mysql -vvv. Voc tambm pode utilizar scripts no prompt de linha de comando mysql usando o comando source: mysql> source filename;

3.6. Exemplos de Consultas Comuns


Aqui esto os exemplos de como resolver problemas comuns com o MySQL. Alguns dos exemplos usam a tabela shop para armazenar o preo de cada tem (article) para certas revendas (dealers). Supondo que cada revenda tenha um preo fixo por artigo, ento (article, dealer) uma chave primria para os registros. 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). Voc pode criar e popular a tabela exemplo assim: mysql> -> -> -> -> 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)); INSERT INTO shop VALUES (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69), 179

Tutorial de Introduo Do MySQL

-> (3,'D',1.25),(4,'D',19.95);

Depois de executar as instrues a tabela deve ter o seguinte contedo: 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


``Qual o maior nmero dos tens?'' SELECT MAX(article) AS article FROM shop; +---------+ | article | +---------+ | 4 | +---------+

3.6.2. O Registro que Armazena o Valor Mximo para uma Coluna Determinada
``Encontre o nmero, fornecedor e preo do tem mais caro.'' No SQL ANSI isto feito fcilmente com uma sub-consulta: 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: 1. Obtenha o valor do preo mximo da tabela com uma instruo SELECT. 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, grave uma consulta para localizar e mostrar o registro correspondente: mysql> SELECT article, dealer, price -> FROM shop -> WHERE price=19.95; +---------+--------+-------+ | article | dealer | price | 180

Tutorial de Introduo Do MySQL

+---------+--------+-------+ | 0004 | D | 19.95 | +---------+--------+-------+

Outra soluo ordenar todos os registros por preo de forma descendente e obtenha somente o primeiro registro utilizando a clusula especfica do MySQL LIMIT: SELECT article, dealer, price FROM shop ORDER BY price DESC LIMIT 1; NOTA: Se existir diversos tens mais caros, cada um com um preo de 19.95, a soluo LIMIT mostra somente um deles !

3.6.3. Mximo da Coluna por Grupo


``Qual o maior preo por tem?'' 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 Campo


``Para cada tem, encontre o(s) fornecedor(s) com o maior preo.'' 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: 1. 2. Obtenha a lista de pares (article,maxprice). Para cada tem, obtenha os registros correspondentes que tenham o maior preo.

Isto pode ser feito facilmente com uma tabela temporria e um join: CREATE TEMPORARY TABLE tmp ( article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, 181

Tutorial de Introduo Do MySQL

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. ``Posso fazer isto com uma nica query?'' Sim, mas somente com um truque ineficiente chamado ``truque MAX-CONCAT'': SELECT article, SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer, 0.00+LEFT( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price FROM shop GROUP BY article; +---------+--------+-------+ | article | dealer | price | +---------+--------+-------+ | 0001 | B | 3.99 | | 0002 | A | 10.99 | | 0003 | C | 1.69 | | 0004 | D | 19.95 | +---------+--------+-------+ O ltimo exemplo pode, claro, ser feito de uma maneira mais eficiente fazendo a separao da coluna concatenada no cliente.

3.6.5. Utilizando Variveis de Usurio


Voc pode usar variveis de usurios no MySQL para lembrar de resultados sem a necessidade de armazen-las em variveis no cliente. See Seco 6.1.4, Variveis de Usurio. Por exemplo, para encontrar os tens com os preos mais altos e mais baixos voc pode fazer 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 verificao de restries de chaves estrangerias. See Seco 7.5, Tabelas InnoDB. Veja tambm Seco 1.8.4.5, Chaves Estrangeiras. Voc no precisa de chaves estrangeiras para unir 2 tabelas. Para outros tipos de tabela diferentes de InnoDB, As nicas coisas que o MySQL atualmente no faz so 1) CHECK, para ter certeza que as chaves que voc usa realmente existem na tabela ou tabelas referenciadas e 2) apagar automatica182

Tutorial de Introduo Do MySQL

mente registros da tabela com uma definio de chave estrangeira. Usando suas chaves para unir a tabela funcionar bem: CREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 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 | | 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 | +----+-------+--------+-------+

183

Tutorial de Introduo Do MySQL

3.6.7. Pesquisando em Duas Chaves


O MySQL ainda no otimiza quando voc pesquisa em duas chaves diferentes combinadas com OR (Pesquisa em uma chave com diferentes partes OR muito bem otimizadas). SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1' OR field2_index = '1' A razo que ns ainda no tivemos tempos para fazer este tratamento de uma maneira eficiente no caso geral. (A manipulao do AND , em comparao, completamente geral e funciona muito bem). No MySQL 4.0 e acimo, voc pode solucionar este problema eficientemente usando um UNION que combina a sada de duas instrues SELECT separadas. See Seco 6.4.1.2, Sintaxe UNION. Cada SELECT busca apenas uma chave e pode ser otimizada. 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 tabela TEMPORARY e instrues SELECT separadas. Este tipo de otimizao tambm muito boa se voc estiver utilizando consultas muito complicadas no qual o servidor SQL faz as otimizaes na ordem errada. CREATE TEMPORARY TABLE tmp SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'; INSERT INTO tmp SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1'; SELECT * from tmp; DROP TABLE tmp; A maneira descrita acima para resolver esta consulta uma unio (UNION) de duas consultas.

3.6.8. Calculando Visitas Dirias


O seguinte exemplo mostra como voc pode usar as funes binrias de agrupamento para calcular o nmero de dias por ms que um usurio tem visitado uma pgina web.

CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, day INT(2) UNSIGN INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),(2000,2,23),( A tabela exemplo contm valores ano-ms-dia representando visitas feitas pelos usurios a pgina. Para determinar quantos quantos dias diferentes em cada ms estas visitas ocorriam, use esta consulta:

SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month; que retornar: +------+-------+------+ | year | month | days | +------+-------+------+ | 2000 | 01 | 3 | | 2000 | 02 | 2 | +------+-------+------+ O exemplo acima calcula quantos dias diferentes foram usados para uma combinao fornecida de ms/ano, com remoo automtica de entradas duplicadas.

184

Tutorial de Introduo Do MySQL

3.6.9. Usando AUTO_INCREMENT


O atributo AUTO_INCREMENT pode ser usado para gerar uma identificao nica para um 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_ID() ou a funo da API C mysql_insert_id(). Nota: para uma insero de vrias linhas LAST_INSERT_ID()/mysql_insert_id() retornar atualmente a AUTO_INCREMENT chave da primeira linha inserida. Isto permite que inseres multi-linhas sejam reproduzidas corretamente em outros servidores em uma configrao de replicao. Para tabelas MyISAM e BDB voc pode especificar AUTO_INCREMENT em uma coluna secundria em um ndice multi-coluna. Neste caso, o valor gerado para a coluna AUTO_INCREMENT calculado como MAX(auto_increment_column)+1) WHERE prefix=given-prefix. Isto til quando voc quer colocar dados em grupos ordenados. CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ); INSERT INTO animals (grp,name) VALUES("mammal","dog"),("mammal","cat"), ("bird","penguin"),("fish","lax"),("mammal","whale"), ("bird","ostrich"); SELECT * FROM animals ORDER BY grp,id; Que retorna: +--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+

185

Tutorial de Introduo Do MySQL

Note que neste caso (quando o valor AUTO_INCREMENT parte de um ndice multi-coluna), o valor de AUTO_INCREMENT ser reutilizado se voc deletar a linha com o maior valor AUTO_INCREMENT em qualquer grupo. Isto caontece mesmo para tabelas MyISAM, para as quais os valores AUTO_INCREMENT normalmente no so reusados.)

3.7. Consultas de Projetos Gmeos


Em Analytikerna e Lentus, ns estamos fazendo os sistemas e trabalho de campo para um grande projeto de pesquisa. Este projeto uma colaborao entre o Institudo de Medicina Ambiental em Karolinksa Institutet Stockholm e a Seo de Pesquisa Clnica 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 anos so entrevistados por telefone. Gmeos que preenchem certos critrios passam para o prximo estgio. Neste estgio posterior, gmeos que desejam participar so visitados por uma equipe de doutores/enfermeiros. Alguns dos consultas incluem exames fsicos e neuropsicolgico, testes de laboratrio, imagem neural, determinao do estado psicolgico e coletas de histrico familiar. Adicionalmente, dados so coletados em fatores de riscos mdicos e ambientais. Mais informaes sobre o estudos http://www.mep.ki.se/twinreg/index_en.html dos gmeos pode ser encontrados em:

A parte posterior do projeto administrada com uma interface Web escrita utilizando a linguagem Perl e o MySQL. Cada noite todos dados das entrevistas so movidos para um banco de dados MySQL.

3.7.1. Encontrando Todos Gmeos No-distribudos


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

Tutorial de Introduo Do MySQL

/* For Twin 2 */ LEFT JOIN twin_data AS td2 ON p2.id = td2.id AND p2.tvab = td2.tvab LEFT JOIN informant_data AS id2 ON p2.id = id2.id AND p2.tvab = id2.tvab LEFT JOIN harmony AS h2 ON p2.id = h2.id AND p2.tvab = h2.tvab LEFT JOIN lentus AS l2 ON p2.id = l2.id AND p2.tvab = l2.tvab, person_data AS p1, person_data AS p2, postal_groups AS pg WHERE /* p1 gets main twin and p2 gets his/her twin. */ /* ptvab is a field inverted from tvab */ p1.id = tp.id AND p1.tvab = tp.tvab AND p2.id = p1.id AND p2.ptvab = p1.tvab AND /* Just the sceening survey */ tp.survey_no = 5 AND /* Skip if partner died before 65 but allow emigration (dead=9) */ (p2.dead = 0 OR p2.dead = 9 OR (p2.dead = 1 AND (p2.death_date = 0 OR (((TO_DAYS(p2.death_date) - TO_DAYS(p2.birthday)) / 365) >= 65)))) AND ( /* Twin is suspect */ (td.future_contact = 'Yes' AND td.suspect = 2) OR /* Twin is suspect - Informant is Blessed */ (td.future_contact = 'Yes' AND td.suspect = 1 AND id.suspect = 1) OR /* No twin - Informant is Blessed */ (ISNULL(td.suspect) AND id.suspect = 1 AND id.future_contact = 'Yes') OR /* Twin broken off - Informant is Blessed */ (td.participation = 'Aborted' AND id.suspect = 1 AND id.future_contact = 'Yes') OR /* Twin broken off - No inform - Have partner */ (td.participation = 'Aborted' AND ISNULL(id.suspect) AND p2.dead = 0)) AND l.event = 'Finished' /* Get at area code */ AND SUBSTRING(p1.postal_code, 1, 2) = pg.code /* Not already distributed */ AND (h.nurse IS NULL OR h.nurse=00 OR h.doctor=00) /* Has not refused or been aborted */ AND NOT (h.status = 'Refused' OR h.status = 'Aborted' OR h.status = 'Died' OR h.status = 'Other') ORDER BY tvid; Algumas explicaes: CONCAT(p1.id, p1.tvab) + 0 AS tvid N queremos ordenar o id e o tvab concatenados na ordem numrica. Adicionando 0 ao resultado faz o MySQL tratar o resultado como um nmero. coluna id Esta identifica um par de gmeos. Ela uma chave em todas as tabelas. column tvab

187

Tutorial de Introduo Do MySQL

Esta identifica um gmeo em um par. Ela pode ter um valor de 1 ou 2. column ptvab Esta o inverso de tvab. Quando tvab 1 este campo 2 e vice versa. Ela existe para poupar digitao e tornar mais fcil para o MySQL otimizar a query. Esta consulta demonstra, entre outras coisas, como fazer buscas em uma tabela a partir da mesma tabela com uma uniao (p1 e p2). No exemplo, isto usado para conferir se um par de um gmeo morreu antes de 65 anos. Se for verdade, a linha no retornada. Tudo acima existe em todas as tabelas com informaes relacionada aos gmeos. Ns temos uma chave em ambos id,tvab (todas as tabelas) e id,ptvab (person_data) para tornar as consultas mais rpidas. Na nossa mquina de produo (Um UltraSPARC 200MHz), esta consulta retorna entre 150-200 linhas e gasta menos que um segundo. O nmero atual de registros nas tabelas usadas acima: Tabela person_data lentus twin_project twin_data informant_data harmony postal_groups Registros 71074 5291 5286 2012 663 381 100

3.7.2. Mostrando uma Tabela sobre a Situao dos Pares Gmeos


Cada entrevista termina com um cdigo da situao chamado event. A consulta mostrada abaixa usada para mostrar uma tabela sobre todos pares gmeos combinados por evento. Ela indica em quantos pares ambos gmeos terminaram, em quantos pares um gmeo terminou e o outro foi recusado e assim por diante. SELECT t1.event, t2.event, COUNT(*) FROM lentus AS t1, lentus AS t2, twin_project AS tp WHERE /* We are looking at one pair at a time */ t1.id = tp.id AND t1.tvab=tp.tvab 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;

188

Tutorial de Introduo Do MySQL

3.8. Utilizando MySQL com Apache


Existem programas que lhe permite autenticar seus usurios a partir de um banco de dados MySQL e tambm permite gravar seus arquivos de log em uma tabela MySQL. Voc pode alterar o formato de log do Apache para ser facilmente lido pelo MySQL colocando o seguinte no arquivo de configurao do Apache: 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 instruo deste tipo: 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.

189

Captulo 4. Administrao do Bancos de Dados MySQL


4.1. Configurando o MySQL
4.1.1. Opes de Linha de Comando do mysqld
Na maioria dos casos voc deve gerenciar as opes do mysqld por meio dos arquivos de opes. See Seco 4.1.2, Arquivo de Opes my.cnf. mysqld e mysqld.server lem opes dos grupos mysqld e server. mysqld_safe l as opes dos grupos mysqld, server, mysqld_safe e mysqld_safe. Um servidor MySQL embutido normalmente l opes do grupos server, embedded e xxxxx_SERVER, onde xxxxx o nome da aplicao. mysqld aceita os seguintes opes de linha de comando. Aqui est uma lista das mais comuns. Para uma lista completa execute mysqld --help. As opes usadas para replicao esto listadas em uma seo separada, veja Seco 4.11.6, Opes de Inicializao da Replicao. --ansi Utilizar a sintaxe ANSI SQL no lugar da sintaxe MySQL See Seco 1.8.2, Executando o MySQL no modo ANSI. -b, --basedir=path Encaminho para o diretrio de instalao. Todos os caminhos normalmente so resolvidos em relao a este. --big-tables Permite grandes conjuntos de resultados salvando todos os conjuntos temporrios em um arquivo. Ele resolve a maioria dos erros 'table full', mas tambm abaixa a velocidade das consultas nas quais as tabelas em memria seriam suficientes. Desde a Verso 3.23.2, o MySQL capaz de resolver isto automaticamente usando memria para pequenas tabelas temporrias e trocando para o disco as tabelas, quando for necessrio. --bind-address=IP Endereo IP para ligar. --console Grava a mensagem de erro no stderr/stdout mesmo se --log-error espeficado. No Windows o mysqld no fechar a tela de console se esta opo usada. --character-sets-dir=path Diretrio onde esto os conjuntos de caracteres. See Seco 4.7.1, O Conjunto de Caracteres Utilizado para Dados e Ordenao. --chroot=path Coloca o daemon mysqld no diretorio chroot durante a inicializao. Medida de segurana recomendada desde o MySQL 4.0 (MySQL 3.23 no est apto a fornecer um chroot 100% fechado. Limita os comandos LOAD DATA INFILE e SELECT ... INTO OUTFILE. --core-file 190

Administrao do Bancos de Dados MySQL

Grava um arquivo core se o mysqld morrer. Para alguns sistemas voc deve tambm especificar --core-file-size para mysqld_safe. See Seco 4.8.2, mysqld-safe, o wrapper do mysqld. Note que em alguns sistemas, como Solaris, voc no consiguir um arquivo core se voc tambm estiver usando a opo --user. -h, --datadir=caminho Encaminha para o diretrio raiz dos bancos de dados. --debug[...]= Se o MySQL est configurado com --with-debug, voc pode usar esta opo para obter um arquivo de rastreamento indicando o que o mysqld est fazendo. See Seco E.1.2, Criando Arquivos Trace (Rastreamento). --default-character-set=conjunto_caracter Configura o conjunto de caracteres padro. See Seco 4.7.1, O Conjunto de Caracteres Utilizado para Dados e Ordenao. --default-table-type=tipo Configura o tipo de tabela padro. See Captulo 7, Tipos de Tabela do MySQL. --delay-key-write[= OFF | ON | ALL] Como o DELAYED KEYS do MyISAM deve ser usado. See Seco 5.5.2, Parmetros de Sintonia do Servidor. --delay-key-write-for-all-tables; No MySQL 4.0.3 voc deve usar --delay-key-write=ALL. No descarrega buffers das chaves entre escritas em nenhuma tabela MyISAM. See Seco 5.5.2, Parmetros de Sintonia do Servidor. --des-key-file=filename Read the default keys used by DES_ENCRYPT() and DES_DECRYPT() from this file. --enable-external-locking (era --enable-locking) Habilita o bloqueio do sistema. Perceba que se usar esta opo em um sistema que no possui um lockd() completamente funcional (como no Linux) voc pode fazer com que o mysqld entre em deadlock. --enable-named-pipe Habilita suporte para named pipes (somente no NT/Win2000/XP). -T, --exit-info Esta uma mscara binria com diferntes parmetros que pode ser usada para depurar o servidor mysqld; Esta opo no deve ser usada por algum que no a conhea muito bem! --flush Atualiza todas as alteraes no disco depois de cada comando SQL. Normalmente o MySQL s faz a escrita de todas as alteraes no disco depois de cada comando SQL e deixa o sistema operacional lidar com a sincronizao com o disco. See Seco A.4.1, O Que Fazer Se o MySQL Continua Falhando. -?, --help

191

Administrao do Bancos de Dados MySQL

Mostra uma pequena ajuda e sai. --init-file=arquivo L comandos SQL do arquivo especificado na inicializao. -L, --language=... Mensagens de erro do cliente na lngua especificada. Pode ser fornecido como um caminho completo. See Seco 4.7.2, Mensagens de Erros em Outras Lnguas. -l, --log[=arquivo] Log de conexes e consultas ao arquivo. See Seco 4.10.2, O Log de Consultas. --log-bin=[arquivo] Registra todas as consultas que alteram dados em arquivo. Usado para backup e replicao. See Seco 4.10.4, O Log Binrio. --log-bin-index[=arquivo] Arquivo de ndice para nomes de arquivos de log binario. See Seco 4.10.4, O Log Binrio. --log-error[=arquivo] Registra mensagens de erro e inicializao neste arquivo. See Seco 4.10.1, O Log de Erros. --log-isam[=arquivo] Log de todas alteraes ISAM/MyISAM no arquivo (usado somente quando estiver depurando bancos ISAM/MyISAM). --log-long-format Registra algumas informaes extras nos aruivos de log (log de atualizaes, log binrio de atualizaes e log de consultas lentas, independente de qual est ativado). Por exemplo, nome do usurio e timestamp so registrados para a consulta. Se voc estiver usando -log-slow-queries e --log-long-format, ento consultas que no esto usando ndices so registradas ao log de consultas lentas. Note que --log-long-format est obsoleto a partir do MySQL verso 4.1, quando --log-short-format foi introduzido (-log-long-format a configurao padro desde a verso 4.1). Note tambm que a partir do MySQL 4.1, a opo --log-queries-not-using-indexes est disponvel para propsito de registro de consultas que no usam ndices para o log de consultas lentas. --log-queries-not-using-indexes Se voc estiver usando --log-slow-queries, ento consultas que no esto usando ndices esto registradas no log de consultas lentas. Esta opes est disponvel a partir do MySQL 4.1. See Seco 4.10.5, O Log para Consultas Lentas. --log-short-format Registra menos informaes extras nos aruivos de log (log de atualizaes, log binrio de atualizaes e log de consultas lentas, independente de qual est ativado). Por exemplo, nome do usurio e timestamp so registrados para a consulta. Esta opo foi introduzida no MySQL 4.1. --log-slow-queries[=arquivo] Log de todas as consultas que levam mais de long_query_time segundos de execuo para 192

Administrao do Bancos de Dados MySQL

um arquivo. Note que o padro para a quantidade de informao registrada alterou no MySQL 4.1. Veja as opes --log-long-format e --log-long-format para mais detalhes. See Seco 4.10.5, O Log para Consultas Lentas. --log-update[=arquivo] Log de atualizaes para file.# onde # um nmero nico se no for fornecido. See Seco 4.10.3, O Log de Atualizaes. O log de atualizao estobsoleto e ser removido no MySQL 5.0; voc deve usar o log binrio em seu lugar (--log-bin). See Seco 4.10.4, O Log Binrio. A partir da verso 5.0, usar --log-update apenar ligar o log binrio. --low-priority-updates Operaes de alteraes das tabelas (INSERT/DELETE/UPDATE) iro ter prioridade menor do que as selects. Isto tambm pode ser feito usando {INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... para baixar a prioridade de somente uma consulta, ou SET OPTION SQL_LOW_PRIORITY_UPDATES=1 para alterar a prioridade em uma nica thread. See Seco 5.3.2, Detalhes sobre Lock de Tabelas. --memlock Bloqueia o processo mysqld na memria. Isto funciona somente se o seu sistema 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 o mysqld faa a troca em disco. Note que o uso desta opo exige que voc execute o servidor como root, que normalmente no uma boa idia por razes de segurana. --myisam-recover [=opo[,opo...]]] onde opo qualquer combinao de DEFAULT, BACKUP, FORCE ou QUICK. Voc tambm pode configurar isto explicitamente para "" se voc deseja desabilitar esta opo. Se esta opo for usada, o mysqld ir conferir na abertura se a tabela est marcada como quebrada ou se a tabela no foi fechada corretamente. (A ltima opo funciona somente se voc estiver executando com --skip-locking). Se este for o caso mysqld ir executar uma conferncia na tabela. Se a tabela estiver corrompida, o mysqld ir tentar repar-la. As seguintes opes afetam no funcionamento da reparao. Opo DEFAULT BACKUP Descrio O mesmo que no fornecer uma opo para --myisam-recover. Se os dados da tabela foram alterados durante a recuperao, salve um backup do arquivo de dados nome_tabela.MYD como nome_tabela_dia_hora.BAK. Execute a recuperao mesmo se perdermos mais de uma linha do arquivo .MYD. No confira as linhas na tabela se no existir nenhum bloco apagado.

FORCE QUICK

Antes da tabela ser reparada automaticamente, o MySQL ir adicionar uma nota no log de erros. Se voc desejar que a recuperao da maioria dos problemas no tenha a interveno de algum usurio, devem ser usadas as opes BACKUP,FORCE. Isto ir forar um reparo de uma tabela mesmo se alguns registros forem apagados, mas ele manter o arquivo de dados antigo como um backup para que voc possa examinar posteriormente o que aconteceu. --new A partir da verso 4.0.12, a opo --new pode ser usada para fazer o servidor se comportar como 4.1 em certos aspectos, facilitando a atualizao da verso 4.0 para 4.1: TIMESTAMP retornado com uma string com o formato 'YYYY-MM-DD HH:MM:SSS. 193

Administrao do Bancos de Dados MySQL

See Seco 6.2, Tipos de Campos. --pid-file=caminho Encaminha para o arquivo pid usado pelo mysqld_safe. -P, --port=... Nmero da porta para conexes TCP/IP. -o, --old-protocol Utilize o protocolo 3.20 para compatibilidade com alguns clientes muito antigos. See Seco 2.5.5, Atualizando da verso 3.20 para 3.21. --one-thread Usa somente uma thread (para depurao sobre Linux). Esta opo est disponvel apenas se o servidor est construdo com a depurao habilitada. See Seco E.1, Depurando um Servidor MySQL. --open-files-limit= Para alterar o nmero de descritores de arquivos disponveis para o mysqld. Se isto no estiver configurado com 0, ento o mysqld usar este valor para reservar descritores de arquivos para usar com setrlimit(). Se este valor 0 ento o mysqld reservar max_connections*5 ou max_connections + table_cache*2 (que sempre maior) nmero de arquivos. Voc deve tentar aumentar isto se o mysqld lhe retornar o erro 'Too many open files'. -O, --set-variable=name=value Fornece um valor para uma varivel. --help lista as variveis. Voc pode encontrar uma descrio completa para todas as variveis na seo SHOW VARIABLES deste manual. See Seco 4.6.8.4, SHOW VARIABLES. A seo de sintonia dos parmetros do servidor inclui informaes sobre como otimiz-los. Por favor, note que --set-variable=name=value e -O name=value esto obsoletos desde o MySQL 4.0, apenas use --var=opo. See Seco 5.5.2, Parmetros de Sintonia do Servidor. No MySQL 4.0.2 pode-se definir uma varivel diretamente com --variable-name=opo e set-variable no mais preciso no arquivo de opes. Se voc quiser restringir o valor mximo uma opo de inicializao pode ser definida com SET, voc pode defin-la usando a opo de linha de comando -maximum-variable-name. See Seco 5.5.6, Sintaxe de SET. Note que quando um valor atribudo a uma varivel, o MySQL pode carrig-lo automaticamente para permanecer dentro de uma faixa dada e tambm ajusta o valor um pouco para corrigir para o algoritmo usado. --safe-mode Salta alguns estgios de otimizao. --safe-show-database Com esta opo, o comando SHOW DATABASES retorna apenas aqueles bancos de dados para os quais o usurio tem algum tipo de privilgio. Desde a verso 4.0.2 esta opo esta obsoleta e no faz nada (a opo est habilitada por padro) j que agora temos o privilgio SHOW DATABASES. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE. --safe-user-create

194

Administrao do Bancos de Dados MySQL

Se isto estiver ativo, um usurio no pode criar novos usurios com o comando GRANT, se o usurio no ter o privilgio de INSERT na tabela mysql.user ou em alguma coluna desta tabela. --skip-bdb Disabilita o uso de tabelas BDB. Isto economizar memria e pode aumentar a velocidade de algumas operaes. --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). --skip-delay-key-write; No MySQL 4.0.3 voc deve usar --delay-key-write=OFF. Ignore a opo DELAY_KEY_WRITE para todas as tabelas. See Seco 5.5.2, Parmetros de Sintonia do Servidor. --skip-grant-tables Esta opo faz com que o servidor no use o sistema de privilgio. Isto d a todos acesso pleno a todos os bancos de dados! (Voc pode dizer a um servidor em execuo para iniciar a usar as tabelas de permisso novamente executando mysqladmin flush-privileges ou mysqladmin reload.) --skip-host-cache Nunca utiliza cache para nomes de mquina para resolues de nomes mais rpidos, mas pesquisa o servidor DNS em todas conexes. See Seco 5.5.5, Como o MySQL Utiliza o DNS. --skip-innodb Disabilita o uso de tabelas Innodb. Isto ir economizar memria, espao em disco e aumentar a velocidade de algumas operaes. --skip-external-locking (era --skip-locking) No utilizar bloqueio de sistema. Para usar isamchk ou myisamchk voc deve desligar o servidor. See Seco 1.2.3, Estabilidade do MySQL. Perceba que na Verso 3.23 do MySQL pode ser usado REPAIR e CHECK para reparar/conferir tabelas MyISAM. --skip-name-resolve Nomes de mquinas no so resolvidos. Todos os valores da coluna Host nas tabelas de permisses devem conter nmeros IP ou localhost. See Seco 5.5.5, Como o MySQL Utiliza o DNS. --skip-networking No escutair conexes TCP/IP. Toda interao com mysqld deve ser feito atravs de named pipes ou sockets Unix. Esta opo altamente recomendada para sistemas onde requisies locais so permitidas. See Seco 5.5.5, Como o MySQL Utiliza o DNS. --skip-new No utilizar rotinas novas, possvelmente erradas. --skip-symlink Opo obsoleta a partir da 4.0.13; use --skip-symbolic-links em seu lugar. --symbolic-links, --skip-symbolic-links 195

Administrao do Bancos de Dados MySQL

Habilita ou desabilita suporte a link simblico. Esta opo tem efeitos diferentes no Windows e Unix. No Windows, habilitar links simblicos lhe permite estabelecer um link simblico a um diretrio de banco de dadosi criando um arquivo directory.sym que contm o caminho para o diretrio real. See Seco 5.6.1.3, Usando Links Simblicos para Bancos de Dados no Windows. No Unix, habilitar links simblicos, significa que voc pode ligar uma tabela MyISAM ou um arquivo de dados em outro dirtrio com as opes INDEX DIRECTORY ou DATA DIRECTORY da instruo CREATE TABLE. Se voc deletar ou renomear a tabela, os arquivos para o qual o link simblico aponta tambm ser deletado/renomeado. --skip-safemalloc Se o MySQL configurado com --with-debug=full, todos os programas verificam a memria por erros para cada operao de alocao e liberao de memria. Esta consistncia muito lenta, assim para o servidor voc pode evit-la, quando voc no precisar dela usando a opo --skip-safemalloc. --skip-show-database No permite o comando 'SHOW DATABASE', a menos que o usurio tenha privilgio SHOW DATABASES. --skip-stack-trace No gravar os rastreamentos de pilha. Esta opo til quando voc estiver executando o mysqld sob um depurador. El alguns sistemas voc tambm deve usar esta opo para conseguir um arquivo core. See Seco E.1, Depurando um Servidor MySQL. --skip-thread-priority Desabilita o uso de prioridade das threads para um tempo de resposta mais rpido. --socket=path

No Unix, o arquivo socket para usar em conexes locais no lugar do padro / tmp/mysql.sock. No Windows, o nome do pipe para usar em conexes locais que usam named pipe (padro MySQL).

--sql-mode=value[,value[,value...]] Os valores de opo pode ser qualquer combinao de: REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, ONLY_FULL_GROUP_BY, NO_UNSIGNED_SUBTRACTION, NO_AUTO_VALUE_ON_ZERO, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_DIR_IN_CREATE, MYSQL323, MYSQL40, DB2, MAXDB, MSSQL, ORACLE, POSTGRESQL, ou ANSI. O valor tambm pode ficar vazio (--sql-mode="") se voc desejar limp-la. NO_AUTO_VALUE_ON_ZERO afeta o tratamento de colunas AUTO_INCREMENT. Normalmente, voc gera a prxima sequncia de nmeros da coluna inserindo NULL 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 til se 0 foi armazenado em uma coluna AUTO_INCREMENT da tabela (isto no recomendado). Por exemplo, se voc fizer um dumpo de uma tabela com mysqldump e ento recarreg-la, normalmente o MySQL ira gerar uma nova sequncia de nmeros quando encontrar valores 0, resultando em uma tabela com contedo 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 disponvel, o mysqldump inclui automaticamente a sada do dump para habilitar 196

Administrao do Bancos de Dados MySQL

NO_AUTO_VALUE_ON_ZERO.) Diversos dos valores de opo so usados para compatibilidade com outros servidores. Se especificado, eles fazer o servidor omitir da sada de SHOW CREATE TABLE aquelas partes da instruo que no so entendidas pelas verses anteriores 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 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 pertencentes a definio de colunas ou ndices. Os valroes MYSQL323 e MYSQL40 so para compatibilidade com o MySQL 3.23 e MySQL 4.0. O valor usado para compatibilidade com outros servidores so DB2, MAXDB, MSSQL, ORACLE, e POSTGRESQL.

Estas opes tambm afetam a sada do mysqldump, porque este programa usa SHOW CREATE TABLE para obter a instruo de criao da tabela a qual ele inclue em sua prpria sada. Diversos valores de opes podem ter um efeito complexo porque eles so atalhos para um grupo ou conjunto de valores. Por exemplo, voc pode dizer ao servidor para executar em modo ANSI usando a opo --sql-mode=ansi (ou --ansi), que equivalente a especificar ambas das seguintes opes de linhas de comando:

--sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_G --transaction-isolation=SERIALIZABLE Note que especificar o modo ANSI desta forma tambm tem o efeito de configurar o nvel de isolao da transao. Para mais informaes sobre executar o servidor em modo ANSI, veja Seco 1.8.2, Executando o MySQL no modo ANSI. Outros valores de ``grupos'' so DB2, MAXDB, MSSQL, ORACLE, e POSTGRESQL. Esepcificar 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_SUBTRACTION foi adicionado na verso 4.0.0. NO_DIR_IN_CREATE foi adicionado na verso 4.0.15. NO_AUTO_VALUE_ON_ZERO, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_KEY_OPTIONS, MYSQL323, MYSQL40, DB2, MAXDB, MSSQL, ORACLE, POSTGRESQL, e ANSI foram adicionados na verso 4.1.1. --temp-pool Usar esta opo far com que a maioria dos arquivos temporrios criados pelo servidor para usarem um pequeno conjunto de nomes, em vez de um nico nome para cada novo arquivo. Isto para contornar um problema no kernel do Linux ao tratar com a criao de muitos arquivos novos com nomes diferentes. Com o comportamento antigo, o Linux parece ter ``perda'' de memria, j que ela alocada na cache de entrada do diretrio em vez da cache de disco. --transaction-isolation={ READ-UNCOMMITTED REPEATABLE-READ | SERIALIZABLE } | READ-COMMITTED |

Configura o nvel de isolao da transao padro. See Seco 6.7.6, Sintaxe SET TRANSACTION. -t, --tmpdir=path

197

Administrao do Bancos de Dados MySQL

Caminho do diretrio usado para criar os arquivos temporrios. Ele pode ser til se o seu diretrio padro /tmp est em uma partio muito pequena para armazenar tabelas temporrias. A partir do MySQL 4.1, esta opo aceita diversos caminhos usados do modo round-robin. Os caminhos devem ser separados por dois pontos (:) (ponto e vrgula (;) no Windows). Eles sero usados de acordo com o mtodo round-robin. -u, --user=[nome_usurio | id_usurio] Executar o servidor mysqld como o usurio nome_usurio ou id_usrio (numrica). (``User'' neste contexto se refere a conta de login do sistema, no um usurio MySQL listado na tabela de permisses.) Esta opo obrigatria quando o mysqld iniciado como usurio root. O servidor ir alterar o ID do usurio durante sua inicializao, fazendo com que ele seja executado como este usurio particular em vez de root. See Seco 4.3.2, Como Tornar o MySQL Seguro contra Crackers. A partir do MySQL 3.23.56 e 4.0.12: Para evitar um possvel furo na segurana onde um usurio adiciona uma opo --user=root a algum arquivo my.cnf (fazendo o servidor executar como root, o mysqld usa apenas a primeira opo --user especificada e produz um aviso se houver mltiplas opes --user. As opes em /etc/my.cnf e datadir/my.cnf so processadas antes de uma opo de linha de comando, assim recomendado que voc coloque uma opo --user em / etc/my.cnf e especifique um outro valor diferente de root. A opo em /etc/my.cnf ser encontrada antes de qualques outra opo --user, o que assegura que o servidor no execute como root, e que um aviso seja exibido se qualquer outra opo --user for encontrada. -V, --version Mostra a informao da verso e sai. -W, --log-warnings Imprime avisos como Aborted connection... no arquivo .err. recomendvel habilitar esta opo, por exemplo, se voc estiver usando replicao (voc obter a mensagem sobre o que est acontecendo como falhas de rede e reconexes). See Seco A.2.10, Erros de Comunicao / Comunicao Abortada. Esta opo se chamava --warnings. Pode se alterar a maioria dos valores de um servidor em execuo com o comnado SET. See Seco 5.5.6, Sintaxe de SET.

4.1.2. Arquivo de Opes my.cnf


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

Windows-directory a localizao do seu diretrio Windows. No Unix, o MySQL l opes padres dos seguintes arquivos:

198

Administrao do Bancos de Dados MySQL

Nome do arquivo /etc/my.cnf DATADIR/my.cnf defaults-extra-file ~/.my.cnf

Propsito Opes globais Opes especficas do servidor O arquivo especificado -defaults-extra-file=# Opes especficas do usurio com -

DATADIR o diretrio de dados do MySQL (normalmente /usr/local/mysql/data para instalaes binrias ou /usr/local/var para instalaes de cdigo fonte). Perceba que este o diretrio que foi especificado na hora da configurao, no o especificado com --datadir quando o mysqld inicia! (--datadir no tem efeito sobre o local onde o servidor procura por arquivos de opes, porque ele procura pelos arquivos antes de processar qualquer argumento da linha de comando.) Note que no Windows, voc deve especificar todos os caminhos no arquivo de opo com / no lugar de \. Se for utilizado o \, ser necessrio digit-lo duas vezes, pois o \ o caractere de escape no MySQL. O MySQL tenta ler os arquivos de opes na ordem listada acima. Se mltiplos arquivos de opes existirem, uma opo especificada em um arquivo lido depois recebe a precedncia sobre a mesma opo especificada em um arquivo lido anteriormente. Opes especificadas na linha de comando recebem a precedncia sobre opes especificadas em qualquer arquivo de opes. Algumas opes podem ser especificadas usando variveis de ambiente. Opes especificadas na linha de comando ou nos arquivos de opo tem precendencia sobre valores nas variveis de ambiente. See Apndice F, Variveis de Ambientes do MySQL. Os seguintes programas suportam arquivos de opes: mysql, mysqladmin, mysqld, mysqld_safe, mysql.server, mysqldump, mysqlimport, mysqlshow, mysqlcheck, myisamchk, e myisampack. Desde a verso 4.0.2, voc pode usar o prefixo loose para opes de linha de comando (ou opes no my.cnf). Se uma opo possui o prefixo loose, o programa que a ler no finalizar com um erro se uma opo for desconhecida, mas apenas enviar um aviso: shell> mysql --loose-no-such-option Voc pode usar arquivos de opes para especificar qualquer opo extendida que o programa suporte! Execute o programa com --help para obter uma lista das opes disponveis. Um arquivo de opes pode conter linhas na seguinte forma: #comentario Linhas de comentrio iniciam com o caractere # ou ;. Comentrios podem iniciar no meio de uma linha tambm. Linhas vazias so ignoradas. [grupo] grupo o nome do programa ou grupo para o qual voc ir configurar as opes. Depois de uma linha de grupo, qualquer linha de opo ou set-variable so referentes ao grupo at o final do arquivo de opes ou outra linha de incio de grupo. opo Isto equivalente --opo na linha de comando. opo=valor Isto equivalente --opo=valor na linha de comando. Por favor, note que voc deve co199

Administrao do Bancos de Dados MySQL

locar um argumento entre aspas duplas, se o argumento de uma opo conter um caracter de comentrio. set-variable = nome=valor Isto equivalente --set-variable nome=valor na linha de comando. Por favor, notem que --set-variable est obsoleto desde o MySQL 4.0; a partir desta verso os nomes das variveis de programa podem ser usados como nome de opes. Na linha de comando, use apenas --nome=valor. Em um arquivo de opo, use nome=valor. O grupo [client] permite especificar opes para todos clientes MySQL (no o mysqld). Este o grupo perfeito de se usar para espeficar a senha que voc usa para conectar ao servidor. (Mas tenha certeza que o arquivo de opes s pode ser lido e gravado por voc) Se voc quiser criar opes que devem ser lidas por uma verso especfica do servidor mysqld voc pode fazer isto com [mysqld-4.0], [mysqld-4.1] etc: [mysqld-4.0] new A nova opo acima s ser usada com o verses 4.0.x do servidor MySQL. Perceba que para opes e valores, todos espaos em branco so automaticamente apagados. Voc pode usar a sequencia de escape '\b', '\t', '\n', '\r', '\\' e '\s' no valor da string ('\s' == espao). Aqui est um tpico arquivo de opes globais. [client] port=3306 socket=/tmp/mysql.sock [mysqld] port=3306 socket=/tmp/mysql.sock set-variable = key_buffer_size=16M set-variable = max_allowed_packet=1M [mysqldump] quick Aqui est um tpico arquivo de opes do usurio [client] # A senha seguinte ser enviada para todos clientes MySQL 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 configurao chamados my-xxxx.cnf no diretrio support-files. Se voc tem uma distribuio binria olhe no diretrio de instalao DIR/support-file, onde DIR o caminho para o diretrio de instalao (normalmente C:\mysql ou /usr/local/mysql). Atualmente existem arquivos de configurao para sistemas pequenos, mdios, grandes e enormes. Voc pode copiar my-xxxx.cnf para seu diretrio home (renomeie a cpia para .my.cnf para experimentar.

200

Administrao do Bancos de Dados MySQL

Todos os programas MySQL que suportam arquivos de opes aceitam opes: Opo --no-defaults --print-defaults Descrio No l nenhum arquivo de opes. Imprima o nome do programa e todas opes.

Utilize somente o arquivo de configurao especfica-dedo. faults-file=caminho-para-arquivo-padr o Leia este arquivo de configurao depois do arquivo -dede configurao global mas antes do arquivo de confifaults-exgurao do usurio. tra-file=caminho-para-arquivo-padr o

Perceba que as opes acima devem vir primeiro na linha de comando para funcionar, com exceo que --print-defaults deve ser usado logo depois dos comandos --defaults-file ou -defaults-extra-file. Notas para desenvolvedores: O tratamento de arquivos de opes implementado simplesmente processando todos as opes coincidentes (isto , opes no grupo apropriado) antes de qualquer argumento da linha de comando. Isto funciona bem para programas que usam a ltima instncia de uma opo que especificada diversas vezes. Se voc tem um programa antigo que trata opes especificadas vrias vezes desta forma mas no l arquivos de opes, voc s precisa adicionar duas linhas para lhe dar esta capacidade. Verifique o cdigo fonte de qualquer um dos clientes MySQL padro para ver como fazer isto. Nos scripts shell voc pode usar o comando my_print_defaults para analisar os arquivos de opo. O seguinte exemplo mostar a sada que my_print_defaults pode produzir quando quando pedido para mostrar as opes encontradas nos grupos [client] e [mysql]: shell> my_print_defaults client mysql --port=3306 --socket=/tmp/mysql.sock --no-auto-rehash

4.2. Executando Mltiplos MySQL Servers na Mesma Mquina


Em alguns casos voc pode precisar de executar mltiplos servidores mysqld executando na mesma mquina. Voc pode desejar testar uma nova verso do MySQL enquanto a deixa a sua instalao da verso de produo existente sem perturbao. Ou voc pode desejar dar acesso a diferentes usurios em diferentes servidores mysqld gerenciados por eles mesmos. (Por exemplo, voc pode seu um provedor de servios de internet que quer fornecer instalaes independentes do MySQL para clientes diferentes). Para executar mltiplos servidores em uma nica mquina, cada servidor deve ter valores nicos para diversos parmetros operacionais. Isto deve ser configurado na linha de comando ou em arquivos de opes. Veja Seco 4.1.1, Opes de Linha de Comando do mysqld e Seco 4.1.2, Arquivo de Opes my.cnf. Pelo menos as seguintes opes devem ser diferente para cada servidor:

201

Administrao do Bancos de Dados MySQL

--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 do arquivo de socket no Unix e o nome do named pipe no Windows. ( necessrio nomes de pipes distintos no Windows apenas para aqueles servidores que suportam conexo named pipes.) --shared-memory-base-name designa o nome da memria compartilhada por um servidor Windows para permitir que o cliente se conecte via memria compartilhada. --pid-file 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: --log=path --log-bin=path --log-update=path --log-error=path --log-isam=path --bdb-logdir=path

Se voc quiser mais desempenho, voc tambm pode especificar as seguinte opes diferentemente para cada servidor para distribuir a carga entre vrios discos fsicos: --tmpdir=path --bdb-tmpdir=path

Normalmente, cada servidor tambm deve usar um diretrio de dados diferentes, que especificado usando a opo --datadir=path. AVISO: Normalmente voc nunca deve ter dois servidores que atualizam dados no mesmo banco de dados! Isto pode levar a supresas inesperadas se seu o seu sistema operacionalno suporta lock de sistema a prova de falhas, isto pode provocar surpresas indesejveis! Se (apesar deste aviso) voc executar diversos servidores usando o mesmo diretrio de dados e eles tiverem com o log habilitado, voc usar as opes apropriadas para especificar os nomes dos arquivos de log que so nicos em cada servidor. Seno, o servidores podem tentar gravar no mesmo arquivo de log. Este aviso contra o compartilhamento de arquivos de dados entre servidores tambm se aplica em um ambeinte NFS. Permitir vrios servidores MySQL acessarem um diretrio de dados comum sobre NFS, normalmente uma M IDIA! O primeiro problema que o NFS se tornar um gargalo, tornando o sistema lento. Ele no se destina para este tipo de uso. Outro risco com NFS que voc ter que conseguir um modo de se certificar que dois ou mais servidores no esto interferindo uns com os outros. Normalmente o lock de arquivo tratado pelo daemon lockd, mas no momento no existe nenhuma plataforma que fara o locck 100% de segurana, em todas as situaes. 202

Administrao do Bancos de Dados MySQL

Facilite a sua vida: esquea sobre compartilhar um diretrio de dados entre servidores sobre NFS. A soluo melhor ter um computador com um sistema operacional que manipule threads de forma eficiente threads e tenha diversas CPUs nele. Se voc tiver mltiplas instalaes do MySQL em diferentes locais, normalemente voc pode especificar o diretrio de instalao base de cada servidor com a opo --basedir=caminho para fazer que cada servidor use diferentes diretrios de dados, arquivos de log e arquivos PID. (O padro para todos estes valores so determinados em relao ao diretrio base.) Neste caso, as nicas outras opes que voc precisa especificar so as opes --socket e --port. Por exempo, suponha que voc instalou a verso binria do MySQL (arquivos .tar) em diferentes locais, assim voc pode iniciar o servidor usando o comando ./bin/mysqld_safe sob o diretrio base correspondente de cada instalao. mysqld_safe determinar a opo --basedir apropriada para passar para mysqld, e voc precisa especificar apenas as opes --socket e --port para o mysqld_safe. Como discutido nas sees a seguir, possvel iniciar servidores adicionais configurando variveis de ambiente ou especificando as opes de linha de comando apropriada. No entanto, se voc precisa executar mltiplos servidores em uma base mais permanente, ser mais coonveniente usar os arquivos de opes para especificar, para cada servidor, aquelas opes que devem ser nicas para ele. See Seco 4.1.2, Arquivo de Opes my.cnf.

4.2.1. Executando Mltiplos Servidores no Windows


Voc pode executar mltiplos servidor no Windows iniciando-os manualmente a partir da linha de comando, cada um com o parmetro operacional apropriado. Em sistemas baseados no Windows NT, voc tambm tem a opo de instalar vrios servidores como servios Windows e execut-los deste modo. Instrues gerais sobre a execuco de servidores MySQL a partir da linha de comando ou como servios so dados em Seco 2.6.1, Notas Windows. Esta seo descreve como se certificar de que voc inicioou cada servidor com valores diferentes para aquelas opes de inicializao que devem ser unicas por servidor, como o diretrio de dados. (Estas opes so descritas em Seco 4.2, Executando Mltiplos MySQL Servers na Mesma Mquina.)

4.2.1.1. Iniciando Mltiplos Servidores na Linha de Comando


Para iniciar vrios servidores manualmente na linha de comando, voc pode especificar a opo apropriada na linha de comando ou no arquivo de opes. mais conveniente colocar as opes em um arquivo de opo. Para fazer isto, crie uma arquivo de opo para cada servidor e mostre ao servidor o nome do arquivo com a opo --defaults-file quando voc execut-lo. Suponha que voc queira executar o mysqld na porta 3307 com um diretrio de dados de C:\mydata1, e mysqld-max na porta 3308 com um diretrio de dados de C:\mydata2. Para conseguir isto, crie dois arquivos de opes. Por exemplo, crie um arquivo chamado C:\my-opts1.cnf que se parea com isto: [mysqld] datadir = C:/mydata1 port = 3307 Crie um segundo arquivo chamado C:\my-opts2.cnf que se parea com isto: [mysqld] datadir = C:/mydata2 port = 3308 Ento inicie cada servidor com seus prprios arquivos de opo: 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 comandos em 203

Administrao do Bancos de Dados MySQL

janelas de console separadas.) Para desligar o servidor, voc deve conectar a porta apropriada: shell> mysqladmin --port=3307 shutdown shell> mysqladmin --port=3308 shutdown Servidores configurados como descrito permitir que clientes se conectem por TCP/IP. Se voc tambm quiser permitir conexes named pipe, use os servidores mysqld-nt ou mysqld-max-nt e especifique as opo que habilitem o named pipe e especifique os seus nomes. (Cada servidor que suporta conexes named pipes deve ter um nome nico). Por exemplo, o arquivo C:\my-opts1.cnf pode ser escrito da seguinte maneira: [mysqld] datadir = C:/mydata1 port = 3307 enable-named-pipe socket = mypipe1 Esto inicie o servidor desta forma: shell> mysqld-nt --defaults-file=C:\my-opts1.cnf C:\my-opts2.cnf seria modificado de forma parecida para uso com o segundo servidor.

4.2.1.2. Iniciando Mltiplos Servidores Como Servios


Em sistemas baseados no NT, um servidor MySQL pode ser executado como um servio Windows. O procedimento para instalao, controle e remoo de um nico servio MySQL est descrito em Seco 2.1.1.7, Iniciando o MySQL no Windows NT, 2000, ou XP. A partir do MySQL 4.0.2, voc pode instalar vrios servidores como servios. Neste caso, voc deve ter certeza de que cada servidor usa um nome de servio diferente junto com todos os outros parmetros que devem ser nico por servidor. Para as seguintes instrues, assuma que voc queira executar o servidor mysqld-nt a partir de duas verses diferentes do MySQL que est instalado em C:\mysql-4.0.8 e C:\mysql-4.0.17, respectivamente. (Este pode ser o caso se voc estiver executando a verso 4.0.8 como seu servidor de produo, mas queira testar o 4.0.17 antes de atualiz-lo.) Os seguintes princpios so relevantes ao instalr um servio MySQL com a opo --install: Se voc especificar um nome de servio depois da opo --install, o servidor ignora o grupo de opo [mysqld] e l as opes do grupo que tem o mesmo nome que o servio. O servidor l as opes do arquivo de opo padro. Se voc especificar uma opo --defaults-file depois do nome do servio, o servidor ignora o arquivo de opes padro e l as opes apenas do grupo [mysqld] do arquivo chamado. Se voc no especificar o nome do servio, o servidor usa o nome padro do servio (MySQL) e o servidor l as opes do grupo [mysqld] no arquivo de opes padro.

Este princpios tambm se aplicam se voc intalar um servidor usando a opo -install-manual. Baseado na informao anterior, voc tem diversos de configurar vrios servios. As seguintes instrues descrevem alguns exemplos. Antes de tentar qualquer uma delas esteja certo de que voc 204

Administrao do Bancos de Dados MySQL

desligou e removeu qualquer servio MySQL existente primeiro. Especifique as opes para todos os servios em um dos arquivos de opes padro. Para fazer isto, use um nome de servio diferente para cada servidor. Suponha que voc queira executar o mysqld-nt 4.0.8 usando o nome de servio [mysqld1] e o mysqld-nt 4.0.17 usando o nome de servio mysqld2. Neste caso voc pode usar o grupo [mysqld1] para o 4.0.8 e o grupo [mysqld2] para o MySQL 4.0.14. Por exemplo, voc pode configurar o C:\my.cnf desta forma: # opes para o servio mysqld1 [mysqld1] basedir = C:/mysql-4.0.8 port = 3307 enable-named-pipe socket = mypipe1 # opes para o servio mysql2 [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 assegurar que o Windows registra o programa executvel correto para cada servio: 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 de servio apropriado: shell> NET START mysqld1 shell> NET START mysqld2 Para parar os servios, use o gerenciador de servios, ou use NET STOP com o mesmo nome de servio. shell> NET STOP mysqld1 shell> NET STOP mysqld2 Nota: Antes do MySQL 4.0.17, apenas um servidor instalado usando o nome de servio padro (MySQL) ou instalado com um nome de servio de mysqld ir ler o grupo [mysqld] no arquivo de opes padro. A partir da verso 4.0.17, todos os servidores lem o grupo [mysqld] se eles lem o arquivo de opes padro, mesmo de esles esto instalados usando outro nome de servio. Isto permite que voc use o grupo [mysqld] para opes que devam ser usadas por todos os servios MySQL, e um grupo de opo com o nome de cada servio para o uso do servidor com aquele nome de servio. Especifique as opes para cada servidor em arquivos separados e use --defaults-file quando instalar os servios para dizer para cada servidor que arquivo usar. Neste caso, cada arquivo deve listar as opes usando um grupo [mysqld]. Com esta abordagem, para especificar as opes para o mysqld-nt 4.0.8, crie um arquivo C:\my-opts1.cnf que se parea com: [mysqld] basedir = C:/mysql-4.0.8 port = 3307 enable-named-pipe socket = mypipe1 205

Administrao do Bancos de Dados MySQL

Para o mysqld-nt 4.0.17, crie um arquivo C:\my-opts2.cnf que se parea com: [mysqld] basedir = C:/mysql-4.0.17 port = 3308 enable-named-pipe socket = mypipe2 Instale o servio como indicado a seguir (digite cada comando em uma nica linha): shell> C:\mysql-4.0.8\bin\mysqld-nt --install mysqld1 --defaults-file=C:\my-opts1.cnf shell> C:\mysql-4.0.17\bin\mysqld-nt --install mysqld2 --defaults-file=C:\my-opts2.cnf Para usar uma opo --defaults-file quando instalar um servidor MySQL como um servio, voc deve anteceder a opo com o nome do servio. Depois de instalarm, inicie e para os servios do mesmo modo que no exemplo anterior. Para remover vrios servios, use mysqld --remove para cada um, especificando um nome de servio depois da opo --remove se o servio a ser removido tiver um nome difertente do padro.

4.2.2. Executando Mltiplos Servidores no Unix


O modo mais fcil de executar diversos servidores no Unix compil-los com diferentes portas TCP/IP e arquivos socket, assim cada um est escutando em diferentes interfaces de rede. Tambm, compilando em diferentes diretrios bases para instalao, que automaticamente resulta em diferentes localizaes de diretrios de dados, arquivos log e arquivos PID para cada um dos seus servidores. Considere que um servidor existente est configurado para a porta e arquivo socket padres. Para configurar um novo servidor para ter parmetros operacionais diferentes, use um comando 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 do arquivo socket padres e o valor --prefix deve especificar um diretrio de instalao diferente daquele usado pelo servidor existente. Voc pode conferir o socket usado por qualquer servidor MySQL em execuo com este comando: Se voc tem um servidor MySQL escutando em uma porta dada, voc pode usar o seguinte comando para descobrir quaie parmetros operacionais ele est usando para diversas variveis importantes configurveis, inclundo o diretrio base e o nome do socket: shell> mysqladmin --host=host_name --port=port_number variables Com a informao exibida por aquele comando, voc pode dizer quais valores de opo no usar ao configurar um servidor adicional. Note que se voc especificar ``localhost'' como o nome da mquina, mysqladmin ir por padro usar uma conexo sockets Unix em vez de TCP/IP. No MySQL 4.1 voc tambm pode especi206

Administrao do Bancos de Dados MySQL

ficar o protocolo a ser usado com a opo --protocol={TCP | SOCKET | PIPE | MEMORY}. No necessrio compilar um novo servidor MySQL apenas para iniciar com uma arquivo socket ou nmero de porta TCP/IP diferentes. Tambm possvel especificar estes valores em tempo de execuo. Um modo de faz-lo usando as opes de linha de comando: 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 -datadir=caminho para o mysqld_safe. Um outro modo de conseguir este efeito usar as variveis de ambiente para configurar o nome do socket e o nmero da porta: shell> shell> shell> shell> shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock MYSQL_TCP_PORT=3307 export MYSQL_UNIX_PORT MYSQL_TCP_PORT scripts/mysql_install_db bin/mysqld_safe &

Este um modo rpido para iniciar um segundo servidor para teste. O bom deste mtodo que a configurao das variveis de ambiente se aplicaro a qualquer programa cliente que voc chame da shell acima. Assim, as conexes para estes clientes sero automaticamente direcionadas para o segundo servidor! Apndice F, Variveis de Ambientes do MySQL inclue uma lista de outras variveis de ambiente que voc pode usar e que afetam o mysqld. Para a execuo automatica do servidor, seu script de inicializao que executado no tempo de boot deve executar o seguinte comando uma vez para cada servidor com um caminmho apropriado do arquivo de opo para cada comando: mysqld_safe --defaults-file=path-to-option-file Cada arquivo de opo deve conter valores especficos para um dados servidor. No Unix, o script mysqld_multi outro modo de de iniciar vrios servidores. See Seco 4.8.3, mysqld_multi, programa para gerenciar mltiplos servidores MySQL.

4.2.3. Usando Programas Clientes em um Ambiente Multi-Servidor


Quando voc quiser conectar com um programa cliente a um servidor MySQL que est escutando diferentes interfaces de rede em vez daquelas compiladas em seu programa cliente, voc pode conectar usando um dos seguintes mtodos: Inicie o cliente com --host=nome_mquina --port=nmero_porta para conectar com TCP/IP a uma mquina remota, ou com --host=localhost -socket=nome_arquivo para conectar a mquina local via um socket Unix ou um named pipe do Windowes. 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. Para conexes TCP/IP, voc tambm pode precisar especificar as opes --host e --port. Para outros tipos de conexes, voc pode precisar especificar uma opo --socket para definir um nome de socket ou named pipe name, ou uma opo --shared-memory-base-name para especificar o nome da memria compartilhada.

207

Administrao do Bancos de Dados MySQL

No Unix, configure as variveis de ambiente MYSQL_UNIX_PORT e MYSQL_TCP_PORT para apontar para o socket Unix e porta TCP/IP antes de iniciar seus clientes. Se voc normalmente utiliza uma porta ou socket especfico, voc pode colocar os comandos para configurar as variveis de ambiente no arquivo .login, assim eles sero aplicados sempre quer voc logar no sistema. See Apndice F, Variveis de Ambientes do MySQL. Especifique o socket e porta TCP/IP padres no grupo [clients] de um arquivo de opes. Por exemplo, voc pode usar C:\my.cnf no WIndows ou o arquivo .my.cnf em seu diretrio home no Unix. See Seco 4.1.2, Arquivo de Opes my.cnf. Em um programa C, voc pode especificar os argumentos de porta ou socket na chamada de mysql_real_connect(). Voc tambm pode ter o programa lendo de um arquivo de opes chamando mysql_options(). See Seco 12.1.3, Descrio das Funes da API C. Se voc estiver usando o mdulo Perl DBD::mysql voc pode ler as opes dos arquivos de opes do MySQL. Por exemplo: $dsn = "DBI:mysql:test;mysql_read_default_group=client;" . "mysql_read_default_file=/usr/local/mysql/data/my.cnf"; $dbh = DBI->connect($dsn, $user, $password); See Seco 12.5.2, A interface DBI.

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


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

4.3.1. Segurana Geral


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

Administrao do Bancos de Dados MySQL

Tente mysql -u root. Se voc conseguir conectar com sucesso ao servidor sem a solicitao de uma senha, voc tem problemas. Qualquer um pode conectar ao seu servidor MySQL como o usurio root com privilgios plenos! Revise as instrues de instalao do MySQL, prestando ateno particularmente ao item sobre configurao da senha do usurio root. Utilize o comando SHOW GRANTS e confira para ver quem tem acesso a o que. Remova aqueles privilgios que no so necessrios utilizando o comando REVOKE.

No mantenha nenhuma senha de texto puro no seu banco de dados. Quando seu computador fica comprometido, o intruso pode obter a lista completa de senhas e utiliz-las. Utilize a funo MD5(), SHA1() ou qualquer funo de embaralhamento de via nica. No escolha senhas de dicionrios. Existem programas especiais para quebr-las. Mesmo senhas como ``xfish98'' no sao boas. Muito melhor seria ``duag98'' que contm a mesma palavra 'fish mas digitada uma letra a esquerda em um teclado QWERTY convencional. Outro mtodo seria usar ``Mhall'' que obtido dos primeiros caracteres de cada palavra na frase ``Mary has a litle lamb''. Isto fcil de lembrar e digitar, mas dificulta que algum que no a conhea a advinhe. Invista em um firewall. Ele protege voc de pelo menos 50% de todos os tipos de exploits em qualquer software. Coloque o MySQL atrs do firewall ou em uma zona desmilitarizada (DMZ). Checklist: Tente examinar suas portas da Internet utilizando alguma ferramenta como o nmap. O MySQL utiliza a porta 3306 por padro. Esta porta no deve ser acessvel para mquinas no confiveis. Outra maneira simples para conferir se sua porta do MySQL est aberta ou no tentar o seguinte comando de alguma mquina remota, onde nome_mquina o nome da mquina ou o endereo IP de seu servidor MySQL: shell> telnet nome_mquina 3306 Se voc obter uma conexo e alguns caracteres, a porta est aberta e deve ser fechada no seu firewall ou roteador, a menos que voc realmente tenha uma boa razo para mant-la aberta. Se o telnet apenas parar ou a conexo for recusada, tudo est bem; a porta est bloqueada.

No confie em nenhum dado includos pelos seus usurios. Eles podem tentar enganar seu cdigo entrando com caracteres especiais ou sequencias de escape nos formulrios Web, URLS ou qualquer aplicao que voc construa. Tenha certeza que sua aplicao continua segura se um usurio entrar com algo do tipo ``; DROP DATABASE mysql;''. Este um exemplo extremo, mas grandes falhas de segurana ou perda de dados podem ocorrer como o resultado de hackers utilizando tcnicas similares, se voc no estiver preparado para eles. Tambm lembre de conferir dados numricos. Um erro comum proteger somente as strings. Em alguns casos as pessoas pensam que se um banco de dados contm somente dados disponveis publicamente, ele no precisa ser protegido. Isto no verdade. No mnimo 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 das contantes numricas: SELECT * FROM tabela WHERE ID='234' em vez de SELECT * FROM table WHERE ID=234. O MySQL automaticamente converte esta string para um nmero e corta todos os smbolos nonumricos dela. Checklist: Todas aplicaes Web: Tente inserir ' e " em todos seus formulrios Web. Se voc obter qualquer tipo de erro do MySQL, investigue o problema imediatamente. Tente modificar qualquer URL dinmica adicionando %22 ("), %23 (#) e %27 (') na URL. 209

Administrao do Bancos de Dados MySQL

Tente modificar os tipos de dados nas URLs dinmicas de numrico para caractere contendo caracteres dos exemplos anteriores. Sua aplicao deve ser segura contra estes ataques e similares. Tente inserir caracteres, espaos e smbolos especiais no lugar de nmero nos campos numricos. Sua aplicao deve remov-los antes de pass-los para o MySQL ou sua aplicao deve gerar um erro. Passar valores no verificados ao MySQL extramente perigoso! Confira o tamanho dos dados antes de pass-los ao MySQL. Considere ter sua aplicao conectando ao banco de dados utilizando um usurio diferente doq ue o que utilizado com propsitos administrativos. No fornea s suas aplicaes mais privilgios de acesso do que elas necessitam.

Usurios do PHP: Confira a funo addslashes(). No PHP 4.0.3, uma funo mysql_escape_string() est disponvel e baseada na funo com o mesmo nome da API C do MySQL.

Usurios do API C do MySQL: Confira a chamada API mysql_escape_string().

Usurios do MySQL: Confira os modificadores escape e quote para consultas streams.

Usurios do Perl DBI: Confira o mtodo quote() ou utilize aspas simples ou duplas.

Usurios do Java JDBC: Utilize um objeto PreparedStatement e aspas simples ou duplas.

No transmita dados sem criptografia na Internet. Estes dados so acessveis para todos que tenham o tempo e habilidade para intercept-lo e us-lo para seu propsito prprio. No lugar, utilize um protocolo de criptografia como o SSL ou SSH. O MySQL suporta conexes SSL interno desde a verso 3.23.9. O repasse de portas do SSH pode ser usado para criar um tunel criptografado (e com compresso) para a comunicao. Aprenda a usar os utilitrios tcpdump e strings. Para a maioria dos casos voc pode conferir se o fluxo de dados do MySQL est ou no criptografado utilizando um comando parecido com este: shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings (Isto funciona sobre Linux e deve funcionar com pequenas modificaes sob outros sistemas.) Alerta: Se voc no ver dados no significa sempre que esteja criptografado. Se voc necessita de alta segurana, voc deve consultar um especialista em segurana.

4.3.2. Como Tornar o MySQL Seguro contra Crackers


Quando voc conectar a um servidor MySQL, voc normalmente deve usar uma senha. A senha no transmitida em texto puro sobre a conexo, porm o algortimo de criptografica no muito forte e com algum esforo um atacante engenhoso pode quebrar a senha se ele conseguir capturar o trfego entre o cliente e o servidor. Se a conexo entre o cliente e o servidor passar por uma rede no confi210

Administrao do Bancos de Dados MySQL

vel, voc deve usar um tunnel SSH para criptografar a comunicao. Todas outras informaes so transferidas como texto que podem ser lido por qualquer um que consiga ver a conexo. Se voc se preocupa com isto, voc pode usar o protocol de compresso (No MySQL verso 3.22 e superiores) para tornar o trfico muito mais dificil de decifrar. Para deixar tudo ainda mais seguro voc deve usar ssh. Voc pode encontrar um cliente ssh open source em http://www.openssh.org, e um cliente ssh comercial em http://www.ssh.com. Com isto, voc pode obter uma conexo TCP/IP critografada entre um servidor MySQL e um cliente MySQL. Se voc estiver usando o MySQL 4.0, voc tambm pode usar o suporte interno OpenSSL See Seco 4.4.10, Usando Conexes Seguras. Para deixar um sistema MySQL seguro, voc deve considerar as seguintes sugestes: Utilize senhas para todos os usurios MySQL. Lembre-se que qualquer um pode logar como qualquer outra pessoa simplesmente com mysql -u outro_usurio nome_bd se outro_usurio no tiver senha. Isto um procedimento comum com aplicaes cliente/servidor que o cliente pode especificar qualquer nome de usurio. Voc pode alterar a senha de todos seus usurios editando o script mysql_install_db antes de execut-lo ou somente a senha para o usurio root do MySQL desta forma: 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, porque qualquer usurio com privilgios FILE estar apto a criar arquivos como o root (por exemplo, ~root/.bashrc). Para prevenir esta situao, mysqld ir recusar a execuo como root a menos que ele seja especificado diretamente usando a opo --user=root. O mysqld pode ser executado como um usurio normal sem privilgios. Voc pode tambm criar um novo usurio Unix mysql para tornar tudo mais seguro. Se voc executar o mysqld como outro usurio Unix, voc no precisar alterar o usurio root na tabela user, porque nomes de usurio do MySQL no tem nada a ver com nomes de usurios Unix. Para iniciar o mysqld como outro usurio Unix, adicione uma linha user que especifica o nome de usurio para o grupo [mysqld] do arquivo de opes /etc/my.cnf ou o arquivo de opes my.cnf no diretrio de dados do servidor. Por exemplo: [mysqld] user=mysql Estas opes configuram o servidor para iniciar como o usurio designado quando voc o inicia manualmente ou usando mysqld_safe ou mysql.server. Para maiores detalhes, veja Seco A.3.2, Como Executar o MySQL Como Um Usurio Normal. No suportar links simblicos para tabelas (Isto pode ser desabilitado com a opo -skip-symlink. Isto muito importante caso voc execute o mysqld como root, assim qualquer um que tenha acesso escrita aos dados do diretrio do mysqld podem apagar qualquer arquivo no sistema! See Seco 5.6.1.2, Utilizando Links Simblicos para Tabelas. Verfique se o usurio Unix que executa o mysqld o nico usurio com privilgios de leitura/ escrita nos diretrios de bancos de dados. No fornea o privilgio PROCESS para todos os usurios. A sada de mysqladmin processlits mostra as consultas atualmente em execuo, portanto qualquer usurio que consiga executar este comando deve ser apto a ver se outro usurio entra com uma consulta do tipo UPDATE user SET password=PASSWORD('no_seguro'). O mysqld reserva uma conexo extra para usurios que tenham o privilgio process, portanto o usurio root do MySQL pode logar e verificar a atividade do servidor mesmo se todas as co211

Administrao do Bancos de Dados MySQL

nexes normais estiverem em uso. No conceda o privilgio FILE a todos os usurios. Qualquer usurio que possua este privilgio pode gravar um arquivo em qualquer lugar no sistema de arquivos com os privilgios do daemon mysqld! Para tornar isto um pouco mais seguro, todos os arquivos gerados com SELECT ... INTO OUTFILE so lidos por todos, e no se pode sobrescrever arquivos existentes. O privilgio FILE pode tambm ser usado para ler qualquer arquivo acessvel para o usurio Unix com o qual o servidor est sendo executado. Pode ocorrer abusos como, por exemplo, usar LOAD DATA para carregar o arquivo /etc/passwd em uma tabela, que pode ento ser lido com SELECT. Se voc no confia em seu DNS, voc deve utilizar nmeros IP no lugar de nomes de mquinas nas tabelas de permisso. De qualquer forma, voc deve ter muito cuidado ao criar entradas de concesso utilizando valores de nomes de mquinas que contenham metacaractes! Se voc deseja restrigir o nmero de conexes para um nico usurio, voc pode faze-lo configurando a varivel max_user_connections no mysqld.

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


As seguintes opes do mysqld afetam a segurana: --local-infile[=(0|1)] Se algum usa --local-infile=0 ento no de pode usar LOAD DATA LOCAL INFILE. --safe-show-database Com esta opo, SHOW DATABASES retorna somente os bancos de dados nos quais o usurio tem algum tipo de privilgio. A partir da verso 4.0.2 esta opo est obsoleta e no faz nada (a opo est habilitada por padro) j que agora temos o privilgio SHOW DATABASES. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE. --safe-user-create Se for habilitado, um usurio no consegue criar novos usurios com o comando GRANT, se o usurio no tiver privilgio de INSERT na tabela mysql.user. Se voc desejar fornecer a um usurio acesso para s criar novos usurios com privilgios que o usurio tenha direito a conceder, voc deve dar ao usurio o seguinte privilgio: mysql> GRANT INSERT(user) ON mysql.user TO 'user'@'hostname'; Isto ir assegurar que o usurio no poder alterar nenhuma coluna de privilgios diretamente, mas tem que usar o comando GRANT para conceder direitos para outros usurios. --skip-grant-tables Esta opo desabilita no servidor o uso do sistema de privilgios. Isto d a todos os usurios acesso total a todos os bancos de dados! (Voc pode dizer a um servidor em execuo para para uar as tabelas de permisses executando mysqladmin flush-privileges ou mysqladmin reload.) --skip-name-resolve Nomes de mquinas no so resolvidos. Todos os valores da coluna Host nas tabelas de permisses devem ser nmeros IP ou localhost. 212

Administrao do Bancos de Dados MySQL

--skip-networking No permitir conexes TCP/IP sobre a rede. Todas as conexes para mysqld devem ser feitas via Sockets Unix. Esta opo no possvel em sistemas que usam MIT-pthreads, porque o pacote MIT-pthreads no suporta sockets Unix.

--skip-show-database No permite o comando SHOW DATABASES, a menos que o usurio tenha o privilgio SHOW DATABASES. A partie da verso 4.0.2 voc no deve mais precisar desta opo, j que o aceesso pode agora ser concedido especificamente com o privilgio SHOW DATABASES.

4.3.4. Detalhes de Segurana com LOAD DATA LOCAL


No MySQL 3.23.49 e MySQL 4.0.2 (4.0.13 no Windows), adicionamos algumas novas opes para lidar com possveis detalhes de segurana junto ao LOAD DATA LOCAL. Exstem dois problemas possveis com o suporte a este comando: Como a leitura deste arquivo iniciada por um servidor, pode-se teoricamente criar um servidor MySQL corrigido que poderia ler qualquer arquivo na mquina cliente na qual o usurio atual tenha acesso, quando o cliente envia uma consulta a tabela. Em um ambiente web onde os clientes esto conectados a um servidor web, um usurio poderia usar LOAD DATA LOCAL para ler qualquer arquivo no qual o processo do servidor web tenha acesso de leitura (assumindo que um usurio poderia executar qualquer comando no servidor SQL). Existem dois arquivos separados para isto: Se voc no configurar o MySQL com --enable-local-infile, ento LOAD DATA LOCAL ser disabilitado por todos os clientes, a menos que se chame mysql_options(... MYSQL_OPT_LOCAL_INFILE, 0) no cliente. See Seco 12.1.3.40, mysql_options(). Para o cliente de linha de comando mysql, LOAD DATA LOCAL pode ser habilitado especificado a opo --local-infile[=1], ou disabilitando com --local-infile=0. Por padro, todos os clientes e bibliotacas MySQL so compilados -enable-local-infile, para ser compatvel com o MySQL 3.23.48 e anterior. com -

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 receber a seguinte mensagem de erro (1148): The used command is not allowed with this MySQL version

4.3.5. O Que o Sistema de Privilgios Faz


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

4.3.6. Como o Sistema de Privilgios Funciona


O sistema de privilgios do MySQL garante que todos usurios possam fazer exatamente as operaes que lhe permitido. Quando voc conecta a um servidor MySQL, sua identidade determinada 213

Administrao do Bancos de Dados MySQL

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

Note que se os seus privilgios so alterados (tanto por voc quanto por outro) enquanto voc est conectado, estas alteraes no iro necessariamente ter efeito com a sus prxima consulta ou consultas. Veja Seco 4.4.3, Quando as Alteraes nos Privilgios tem Efeito para maiores detalhes. O servidor utiliza as tabelas user, db e host no banco de dados mysql em ambos estgios do controle de acesso. Os campos nestas tabelas de permisso so detalhados abaixo: Nome da Tabela Campos de Escopo user Host User Password Campos de Privilgio 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 CreaCreaCreate_tmp_table_pri te_tmp_table_pri te_tmp_table_pri v v v Lock_tables_priv Lock_tables_priv Lock_tables_priv 214 db Host Db User Select_priv Insert_priv Update_priv Delete_priv Index_priv Alter_priv Create_priv Drop_priv Grant_priv References_priv Select_priv Insert_priv Update_priv Delete_priv Index_priv Alter_priv Create_priv Drop_priv Grant_priv References_priv host Host Db

Administrao do Bancos de Dados MySQL

Execute_priv Repl_slave_priv Repl_client_priv ssl_type ssl_cypher x509_issuer x509_cubject max_questions max_updates max_connections

No segundo estgio do controle de acesso (verificao da solicitao), o servidor pode, se a solicitao involver tabelas, consultar adicionalmente as tabelas tables_priv e columns_priv. Os campos nestas tabelas so mostrados abaixo: Nome da tabela Campos de escopop tables_priv Host Db User Table_name Campos de privilgio Outros campos Table_priv Column_priv Timestamp Grantor Timestamp columns_priv Host Db User Table_name Column_name Column_priv

Cada tabela de permisses contm campos de escopo e campos de privilgios. Campos de escopo determinam o escopo de cada entrada nas tabelas, isto , o contexto no qual a entrada se aplica. Por exemplo, uma entrada na tabela user com valores Host e User de 'thomas.loc.gov' e 'bob' devem ser usados para autenticar conexes feitas ao servidor por bob da mquina thomas.loc.gov. De maneira similar, uma entrada na tabela db com campos Host, User e Db de 'thomas.loc.gov', 'bob' e 'reports' devem ser usados quando bob conecta da mquina thomas.loc.gov para acessar o banco de dados 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. Para propsitos de verificao de acessos, comparaes de valores Host so caso insensitivo, valores User, Password, Db e Table_name so caso sensitivo. Valores Column_name so caso insensitivo no MySQL verso 3.22.12 ou posterior. Campos de privilgios indicam os privilgios concedidos por uma entrada na tabela, isto , quais operaes podem ser realizadas. O servidor combina as informaes de vrias tabelas de concesso para formar uma descrio completa dos privilgios de um usurio. As regras usadas para fazer isto so descritas em Seco 4.3.10, Controle de Acesso, Estgio 2: Verificao da Requisio. Campos de escopo so strings, declaradas como mostrado abaixo; os valores padro para cada a string vazia: Nome do Campo Tipo Host User CHAR(60) CHAR(16) 215

Administrao do Bancos de Dados MySQL

Password Db Table_name Column_name

CHAR(16) CHAR(64) CHAR(60) CHAR(60) (CHAR(60) para lumns_priv) as tabelas tables_priv e co-

Nas tabelas user, db e host, todos campos de privilgios so declarados como ENUM('N','Y') --- cada um pode ter um valor de 'N' ou 'Y' e o valor padro 'N'. Nas tabelas tables_ e columns_priv, os campos de privilgios so declarados como campos SET: Nome de tabela Nome do cam- Possveis elementos do conjunto po tables_priv Table_priv 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'

tables_priv Column_priv 'Select', 'Insert', 'Update', 'References' columns_priv Column_priv 'Select', 'Insert', 'Update', 'References'

De maneira resumida, o servidor utiliza as tabelas de permisses desta forma: Os campos de escopo da tabela user determinam quando permitir ou aceitar conexes. Para conexes permitidas, qualquer privilgio concedido em uma tabela user indica o privilgio global (superusurio) do usurio. Estes privilgios se aplicam a todos os bancos de dados no servidor. As tabelas db e host so usadas juntas: Os campos de escopo da tabela db determinam quais usurios podem acessar determinados bancos de dados de mquinas determinadas. Os campos de privilgios determinam quais operaes so permitidas. A tabela host usada como uma extenso da tabela db quando voc quer que uma certa entrada na tabela db seja aplicada a diversas mquinas. Por exemplo, se voc deseja que um usurio esteja apto a usar um banco de dados a partir de diversas mquinas em sua rede, deixe o campo Host vazio no registro da tabela db, ento popule a tabela Host com uma entrada para cada uma das mquinas. Este mecanismo descrito com mais detalhes em Seco 4.3.10, Controle de Acesso, Estgio 2: Verificao da Requisio.

As tabelas tables_priv e columns_priv so similares tabela db, porm so mais finas: Elas se aplicam ao nvel de tabelas e colunas em vez do nvel dos bancos de dados.

Perceba que os privilgios administrativos (RELOAD, SHUTDOWN e etc) so especificados somente na tabela user. Isto ocorre porque operaes administrativas so operaes no prprio servidor e no so especficas e no especficas dos bancos de dados, portanto no existe razo para listar tais privilgios nas outras tabelas de permisso. De fato, somente a tabela user necessita ser consultada para determinar se voc pode ou no realizar uma operao administrativa. O privilgio FILE tambm s especificado na tabela user. Ele no um privilgio administrativo, mas sua habilidade para ler ou escrever arquivo no servidor independtende do banco de dados que voc est acessando. O servidor mysqld le o contedo das tabelas de permisses uma vez, quando iniciado. Alteraes nas tabelas de permisses tem efeito como indicado em Seco 4.4.3, Quando as Alteraes nos Privilgios tem Efeito. 216

Administrao do Bancos de Dados MySQL

Quando voc modifica o contedo das tabelas de permisses, uma boa idia ter certeza que suas alteraes configuraram os privilgios da forma desejada. Para ajuda no diagnostico de problemas, veja Seco 4.3.12, Causas dos Erros de Accesso Negado. Para conselhos sobre asssuntos de segurana, See Seco 4.3.2, Como Tornar o MySQL Seguro contra Crackers. Uma ferramenta de diagnstico til o script mysqlaccess, que Yves Carlier fornece na distribuio MySQL. Chame mysqlaccess com a opo --help para descobrir como ele funciona. Perceba que o mysqlaccess confere o acesso usando somente as tabelas user, db e host. Ele no confere privilgios no nvel de tabelas ou colunas.

4.3.7. Privilgios Fornecidos pelo MySQL


Informaes sobre privilgios de usurios so armazenados nas tabelas user, db, host, tables_priv e columns_priv no banco de dados chamado mysql. O servidor MySQL l o contedo destas tabelas quando ele inicia e sob as circunstncias indicadas em Seco 4.4.3, Quando as Alteraes nos Privilgios tem Efeito. Os nomes usados neste manual que se referem-se aos privilgios fornecidos pelo MySQL so vistos abaixo juntos com o nome da coluna associada com cada privilgio nas tabelas de permisso e o contexto em que o privilgio se aplica. Informaes adicionais sobre o significado de cada privilgio pode ser encontrado em Seco 4.4.1, A Sintaxe de GRANT e REVOKE. Privilgio ALTER DELETE INDEX INSERT SELECT UPDATE CREATE DROP GRANT REFERENCES Coluna Alter_priv Delete_priv Index_priv Insert_priv Select_priv Update_priv Create_priv Drop_priv Grant_priv References_priv Contexto tabelas tabelas tabelas tabelas tabelas tabelas banco de dados, tabelas, ou ndices banco de dados ou tabelas banco de dados ou tabelas banco de dados ou tabelas

CREATE TEMPO- Creaadministrao do servidor RARY TABLES te_tmp_tabela_priv EXECUTE FILE LOCK TABLES PROCESS RELOAD REPLICATION CLIENT REPLICATION SLAVE SHOW SES SUPER Execute_priv File_priv Lock_tabelas_priv Process_priv Reload_priv Repl_client_priv Repl_slave_priv administrao do servidor acessa a arquivos no servidor administrao do servidor administrao do servidor administrao do servidor administrao do servidor administrao do servidor administrao do servidor administrao do servidor administrao do servidor

DATABA- Show_db_priv Shutdown_priv Super_priv

SHUTDOWN

Os privilegios SELECT, INSERT, UPDATE e DELETE permitem realizar operaes em registros nas tabelas existentes em um banco de dados.

217

Administrao do Bancos de Dados MySQL

Instrues SELECT necessitam do privilgio select somente se ele precisar recuperar registros de uma tabela. Voc pode executar certas instrues SELECT mesmo sem permisso para acessar algum dos bancos de dados no servidor. Por exemplo, voc pode usar o cliente mysql como uma simples calculadora: mysql> SELECT 1+1; mysql> SELECT PI()*2; O privilgio INDEX permite a criao ou remoo de ndices. O privilgio ALTER permite utilizar ALTER TABLE. Os privilgios CREATE e DROP permitem a criao de novos bancos de dados e tabelas, ou a remoo de bancos de dados e tabelas existentes. Perceba que se for concedido o privilgio DROP no banco de dados mysql para algum usurio, este usurio pode remover o banco de dados no qual os privilgios de acesso do MySQL esto armazenados! O privilgio GRANT permite a voc fornecer a outros usurios os privilgios que voc mesmo possui. O privilgio FILE fornece permisso para ler e escrever arquivos no servidor usando instrues LOAD DATA INFILE e SELECT ... INTO OUTFILE. Qualquer usurio que tenha este privilgio pode ler ou gravar qualquer arquivo que o servidor MySQL possa ler ou escrever. O usurio tambm pode ler qualquer arquivo no diretrio de banco de dados atual. O usurio no pode, no entanto, alterar qualquer arquivo existente. Os privilgios restantes so usados para operaes administrativas, que so realizadas utilizando o programa mysqladmin. A tabela abaixo mostra quais comandos do mysqladmin cada privilgio administrativos permite a execuo: Privilgio RELOAD SHUTDOWN PROCESS SUPER Comandos permitidos reload, refresh, flush-privileges, flush-hosts, flush-logs, and flush-tables shutdown processlist kill

O comando reload diz ao servidor para recarregar as tabelas de permisses. O comando 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 refresh mas so mais limitados no escopo e podem ser preferveis em alguns casos. Por exemplo, se voc deseja descarregar apenas os arquivos log, flush-logs uma melhor escolha do que refresh. O comando shutdown desliga o servidor. O comando processlist mostra informaes sobre as threads em execuo no servidor. O comando kill mata threads no servidor. Voc sempre poder mostrar ou matar suas prprias threads, mas voc precisa do privilgio PROCESS para mostrar e privilgio SUPER para matar threads iniciadas por outros usurios. See Seco 4.6.7, Sintaxe de KILL. uma boa idia em geral conceder privilgios somente para aqueles usurios que necessitem deles, mas voc deve ter muito cuidado ao conceder certos privilgios: O privilgio grant permite aos usurios repassarem seus privilgios a outros usurios. Dois usurios com diferentes privilgios e com o privilgio grant conseguem combinar seus privilgios. O privilgio alter pode ser usado para subverter o sistema de privilgios renomeando as tabelas. 218

Administrao do Bancos de Dados MySQL

O privilgio FILE pode ser usado com abuso para ler qualquer arquivo de leitura no servidor em uma tabela de banco de dados, o contedo pode ser acessando utilizando SELECT. Isto inclui o contedo de todos os bancos de dados hospedados pelo servidor! O privilgio SHUTDOWN pode ser utilizado para negar inteiramente servios para oturos usurios, terminando o servidor. O privilgio PROCESS pode ser usado para ver o texto das consultas atualmente em execuo, incluindo as consultas que configuram ou alteram senhas. Privilgios no banco de dados mysql pode ser utilizado para alterar senhas e outras informaes de privilgio de acesso. (Senhas so armazenadas criptografadas, portanto um usurio malicioso no pode simplesmente l-las para saber as senhas em texto puro). Se fosse possvel acessar a coluna password do banco mysql.user, seria possvel logar ao servidor MySQL como outro usurio. (Com privilgios suficientes, o mesmo usurio pode trocar a senha por outra diferente.)

Existema algumas coisas que voc no pode fazer com o sistem de privilgios do MySQL: Voc no pode especificar explicitamente que um determinado usurio deve ter acesso negado. Voc no pode explicitamente comparar um usurio e depois recusar sua conexo. Voc no pode especificar que um usurio tenha privilgios para criar ou remover tabelas em um banco de dados, mas no possa criar ou remover o banco de dados.

4.3.8. Conectando ao Servidor MySQL


Programas clientes do MySQL geralmente necessitam de parmetros de conexo quando voc precisar acessar um servidor MySQL: a mquina na qual voc deseja se conectar, seu nome de usurio e sua senha. Por exemplo, o cliente mysql pode ser iniciado desta forma (argumentos opcionais so colocandos entre [ e ]): shell> mysql [-h nome_mquina] [-u nome_usurio] [-psua_senha] Formas alternativas das opes -h, -u e -p so --host=nome_mquina, -user=nome_usurio e --password=sua_senha. Perceba que no existe espao entre -p ou --password= e a senha que deve vir a seguir. NOTA: Especificar a senha na linha de comando no seguro! Qualquer usurio no seus sistema pode saber sua senha digitando um comando do tipo: ps auxww. See Seco 4.1.2, Arquivo de Opes my.cnf. O mysql utiliza valores padro para parmetros de conexo que no so passados pela linha de comando: O nome padro da mquina (hostname) localhost. O nome de usurio padro o mesmo nome do seu usurio no Unix. Nenhuma senha fornecida se faltar o parmetro -p.

Ento, para um usurio Unix joe, os seguintes comandos so equivalentes: shell> shell> shell> shell> mysql -h localhost -u joe mysql -h localhost mysql -u joe mysql

219

Administrao do Bancos de Dados MySQL

Outros clientes MySQL comportam-se de forma similar. Em sistemas Unix, voc pode especificar valores padres diferentes para serem usados quendo voc faz uma conexo, assim voc no precisa digit-los na linha de comando sempre que chamar o programa cliente. Isto pode ser feito de vrias maneiras: Podem ser especificados parmetros de conexo na seo [client] do arquivo de configurao .my.cnf no seu diretrio home. A seo relevante do arquivo deve se parecer com isto: [client] host=nome_mquina user=nome_usurio password=senha_usurio See Seco 4.1.2, Arquivo de Opes my.cnf. Voc pode especificar parmetros de conexo utilizando variveis de ambiente. O nome de mquina pode ser especificado para o mysql utilizando a varivel MYSQL_HOST. O nome do usurio MySQL pode ser especificado utilizando USER (isto somente para Windows). A senha pode ser especificada utilizando MYSQL_PWD (mas isto no seguro; veja a prxima seo). See Apndice F, Variveis de Ambientes do MySQL.

4.3.9. Controle de Acesso, Estgio 1: Verificao da Conexo


Quando voc tenta se conectar a um servidor MySQL, o servidor aceita ou rejeita a conexo baseado na sua identidade e se pode ou no verificar sua identidade fornecendo a senha correta. Seno, o servidor nega o acesso a voc completamente. De outra forma, o servidor aceita a conexo, entra no estgio 2 e espera por requisiies. Sua identidade baseada em duas partes de informao: A mquina de onde est conectando Seu nome de usurio no MySQL

A conferncia da identidade feita utilizando os tres campos de escopo da tabela user (Host, User e Password). O servidor aceita a conexo somente se uma entrada na tabela user coincidir com a mquina, nome de usurio e a senha fornecidos. Valores dos campos escopo na tabela user podem ser especificados como segue: Um valor Host deve ser um nome de mquina ou um nmero IP ou 'localhost' para indicar a mquina local. Voc pode utilizar os metacaracteres % e _ no campo Host. Um valor Host de '%' coincide com qualquer nome de mquina. Um valor Host em branco significa que o privilgio deve ser adicionado com a entrada na tabela host que coincide com o nome de mquina fornecido. Voc pode encontrar mais informaes sobre isto no prximo captulo. Como no MySQL Verso 3.23, para valores Host especificados como nmeros IP, voc pode especificar uma mscara de rede indicando quantos bits de endereo sero usados para o nmero da rede. Por exemplo:

220

Administrao do Bancos de Dados MySQL

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 seguinte seja verdadeira: IP_usurio & mscara_rede = ip_maquina. No exemplo acima todos IPs no Intervalo 192.58.197.0 - 192.58.197.255 podem se conectar ao servidor MySQL. Metacaracteres no so permitidos no campo User, mas voc pode especificar um valor 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 um usurio annimo (o usurio sem nome), em vez do nome que o cliente especificou. Isto significa que um nome de usurio em branco usado para todos as verificaes de acessos durante a conexo. (Isto , durante o estgio 2). O campo Password pode ficar em branco. O que no significa que qualquer senha possa ser usada, significa que o usurio deve conectar sem especificar uma senha.

Valores de Password que no esto em branco so apresentados como senhas criptografadas. O MySQL no armazena senhas na forma de texto puro para qualquer um ver. Em vez disso, a senha fornecida por um usurio que est tentando se conectar criptografada (utilizando a funo PASSWORD()). A senha criptografada ento usada quando o cliente/servidor estiver conferindo se a senha correta (Isto feito sem a senha criptografada sempre trafegando sobre a conexo.) Perceba que do ponto de vista do MySQL a senha criptografada a senha REAL, portanto voc no deve pass-la para ningum! Em particular, no fornea a usurios normais acesso de leitura para as tabelas no banco de dados mysql! A partir da verso 4.1, o MySQL emprega um mecanismo de senha e login diferente que seguro mesmo se fizerem um sniff nos pacotes TCP/IP e/ou o banco de dados mysql capturado. Os exemplos abaixo mostram vrias combinaes de valores de Host e User nos registros da tabela user aplicando a novas conexes: Valor em host 'thomas.loc.gov' '%' '%' '%.loc.gov' 'x.y.%' Valor user '' 'fred' '' 'fred' 'fred' em Conexes casadas com o registro Qualquer usurio, mas.loc.gov conectando de tho-

fred, conectando a partir de qualquer mquina Qualquer usurio, conectando a partir de qualquer mquina fred, conectando de qualquer mquina do domnio loc.gov fred, conectando de x.y.net, x.y.com,x.y.edu, etc. (Isto provavelmente no til) fred, conectando da mquina com endereo IP 144.155.166.177 fred, conectando de qualquer mquina na subrede de classe C 144.155.166 o mesmo que no exemplo anterior

'144.155.166.177' '144.155.166.%'

'fred' 'fred'

'144.155.166.0/255.255 'fred' .255.0'

Como voc pode usar valores coringas de IP no campo Host (por exemplo, '144.155.166.%' 221

Administrao do Bancos de Dados MySQL

combina com todas mquinas em uma subrede), existe a possibilidade que algum possa tentar explorar esta capacidade nomeando a mquina como 144.155.166.algumlugar.com. Para evitar tais tentativas, O MySQL desabilita a combinao com nomes de mquina que iniciam com dgitos e um ponto. Portanto se voc possui uma mquina nomeada como 1.2.foo.com, este nome nunca ir combinar com uma coluna Host das tabelas de permisses. Somente um nmero IP pode combinar com um valor coringa de IP. Uma conexo de entrada pode coincidir com mais de uma entrada na tabela user. Por exemplo, uma conexo a partir de thomas.loc.gov pelo usurio fred pode combinar com diversas das entradas vistas na tabela anterior. Como o servidor escolhe qual entrada usar se mais de uma coincide? O servidor resolve esta questo ordenando a tabela user no tempo de inicializao, depois procura pelas entradas na ordem da classificao quando um usurio tenta se conectar. A primeira entrada que coincidir a que ser usada. A ordenao da tabela user funciona da forma mostrada a seguir. Suponha que a tabela user se parea com isto: +-----------+----------+| Host | User | ... +-----------+----------+| % | root | ... | % | jeffrey | ... | localhost | root | ... | localhost | | ... +-----------+----------+Quando o servidor l a tabela, ele ordena as entradas com os valores mais especficos de Host primeiro ('%' na coluna Host significa ``qualquer mquina'' e menos especfico). Entradas com o mesmo valor Host so ordenadas com os valores mais especficos de User primeiro (um valor em branco na coluna User significa ``qualquer usurio'' e menos especfico). O resultado da tabela user ordenada ficaria assim: +-----------+----------+| Host | User | ... +-----------+----------+| localhost | root | ... | localhost | | ... | % | jeffrey | ... | % | root | ... +-----------+----------+Quando uma conexo iniciada, o servidor procura entre as entradas ordenadas e utiliza a primeira entrada coincidente. Para uma conexo a partir de localhost feito por jeffrey, 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 entrada '%'/'jeffrey' tambm casaria, mas ela no a primeira entrada coincidente na tabela. Aqui est outro exemplo. Suponha que a tabela user fosse assim: +----------------+----------+| Host | User | ... +----------------+----------+| % | jeffrey | ... | thomas.loc.gov | | ... +----------------+----------+A tabela ordenada pareceria com isto: +----------------+----------+| Host | User | ... +----------------+----------+| thomas.loc.gov | | ... | % | jeffrey | ... +----------------+----------+222

Administrao do Bancos de Dados MySQL

Uma conexo a partir de thomas.loc.gov feita por jeffrey coincide com a primeira entrada, no entanto, uma conexo de whitehouse.gov fetia por jeffrey coincidiria com a segunda entrada na tabela. Um erro comum pensar que para um determinado usurio, todas as entradas que citam explicitamente este usurio sero usadas primeiro quando o usurio tentar encontrar uma combinao para a conexo. Simplesmente isto no verdade. O exemplo anterior ilustra isto, onde uma conexo de thomas.loc.gov feita por jeffrey combina primeiro no com a entrada contendo 'jeffrey' no valor do campo user, mas sim pela entrada sem o nome de usurio! Se voc tiver problemas conectando ao servidor, imprima a tabela user e ordene-a na manualmente para ver onde se deu o primeiro coincidncia de valores. Se a conexo obtiver sucesso mas os seus privilgios no so os esperados, voc pode usar a funo CURRENT_USER() (nova na verso 4.0.6) para ver com qual combinao usurio/mquina a sua conexo coincide. See Seco 6.3.6.2, Funes Diversas.

4.3.10. Controle de Acesso, Estgio 2: Verificao da Requisio


Uma vez estabelecida uma conexo, o servidor entra no 2o estgio. Para cada requisio que vem na conexo, o servidor verifica se voc tem privilgios suficientes para realiz-la, baseado nas operaes que voc deseja fazer. aqui que os campos de concesses nas tabelas de permisses entram em ao. Estes privilgios pode vir de qualquer uma das tabelas user, db, host, tables_priv ou columns_priv. As tabelas de permisses so manipuladas com os comandos GRANT e REVOKE. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE. (Voc pode achar til fazer referencia a Seco 4.3.6, Como o Sistema de Privilgios Funciona, que lista os campos presentes em cada uma das tabelas de permisses.) A tabela user concede privilgios que so especificados por voc em uma base global e que se aplicam sem importar qual o banco de dados atual. Por exemplo, se a tabela user concede a algum o privilgio delete, este usurio pode apagar linhas de qualquer banco de dados no servidor! Em outras palavras, privilgios na tabela user so privilgios de superusurio. O correto conceder privilgios na tabela user apenas para superusurios tais como os administradores de servidor ou de bancos de dados. Para outros usurios, voc deve deixar os privilgios na tabela user configurados para 'N' e conceder privilgios somente em bancos de dados especficos, utilizando as tabelas db e host. As tabelas db e host concedem privilgios para bancos de dados especficos. Valores nos campos de escopo podem ser especificados 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, especifique-o como '\_' no comando GRANT. O valor '%' em Host na tabela db significa ``qualquer mquina.'' Um valor em branco em Host na tabela db significa ``consulte a tabela host para informao adicional.'' O valor '%' ou em branco no campo Host na tabela host significa ``qualquer mquina.'' O valor '%' ou em branco no campo Db de ambas as tabelas significa ``qualquer banco de dados.'' O valor em branco no campo User em ambas tabelas coincide com o usurio annimo.

As tabelas db e host so lidas e ordenadas quando o servidor inicia (ao mesmo tempo que ele l a tabela user). A tabela db ordenada nos campos de escopo Host, Db e User e a tabela host ordenada nos campos de escopo Host e Db. Assim como na tabela user, a ordenao coloca os valores mais especficos no incio e os menos especficos por ltimo, e quando o servidor procura 223

Administrao do Bancos de Dados MySQL

por entradas coincidentes, ele usa a primeira combinao que encontrar. As tabelas tables_priv e columns_priv concedem privilgios especficos para tabelas e campos. Valores nos campos escopo podem ser especificados como a seguir: Os meta caracteres % e _ podem ser usados no campo Host de ambas tabelas. O valor '%' ou em branco no campo Host em ambas tabelas significam ``qualquer mquina'' Os campos Db, Table_name e Column_name no podem conter meta caracteres ou serem brancos em ambas tabelas.

As tabelas tables_priv e columns_priv so ordenadas nos campos Host, DB e User. Isto parecido com a ordenao da tabela db, no entanto, a ordenao mais simples porque somente o campo Host pode conter meta caracteres. O processo de verificao da requisio descrito abaixo. (Se voc j est familiarizado com o cdigo de verificao de acesso, voc ir perceber que a descrio aqui um pouco diferente do algortimo usado no cdigo. A descrio equivalente ao que o cdigo realmente faz; ele s diferente para tornar a explicao mais simples.) Para requisies administrativas (SHUTDOWN, RELOAD, etc.), o servidor confere somente a entrada da tabela user, porque ela a nica tabela que especifica privilgios administrativos. O acesso concedido se o registro permitir a operao requisitada ou negado caso o contrrio. Por exemplo, se voc deseja executar mysqladmin shutdown mas a entrada em sua tabela user no lhe concede o privilgio SHUTDOWN, o acesso negado mesmo sem consultar as tabelas db ou host. (elas no contm o campo Shutdown_priv, portanto no existe esta necessidade.) Para requisies relacionadas aos bancos de dados (insert, udpdate, etc.), o servidor primeiro confere os privilgios globais do usurio consultando as entradas da tabela user. Se a entrada permitir a operao requisitada, o acesso concedido. Se os privilgios globais na tabela user so insuficientes, o servidor determina os privilgios especficos de banco de dados para o usurio consultando as tabelas db e host: 1. O servidor consulta a tabela db por uma combinao nos campos Host, Db e User. Os campos Host e User so comparados com o nome da mquina e o nome do usurio que faz a requisio. O campo Db comparado com o banco de dados que o usurio deseja acessar. Se no existir entradas coincidentes para o Host e User, o acesso negado. Se existir uma combincao com a entrada da tabela db e seu campo Host no estiver em branco, aquela entrada define os privilgios especificos do banco de dados do usuario. Se o registro coincidente da tabela db tiver o campo Host em branco, significa que a tabela host enumera quais mquinas so permitidas acessar o banco de dados. Neste caso, uma consulta adicional feita na tabela host para encontrar uma valores coincidentes nos campos Host e Db. Se nenhuma entrada na tabela host coincide, o acesso negado. Se existir uma coincidncia, os privilgios especficos de bancos de dados para o usurio so computados como a interseo (no a unio!) dos privilgios nas entradas das tabelas db e host, isto , os privilgios que so 'Y' em ambas entradas. (Desta forma voc pode conceder privilgios gerais em entradas na tabela db e ento restringi-los em uma base de mquina a mquina utilizando as entradas da tabela host.)

2. 3.

Depois de determinar os privilgios especficos do banco de dados concedido pelas entradas nas tabelas db e host, o servidor os adiciona aos privilgios globais concedidos pela tabela user. Se o resultado permitir a operao requisitada, o acesso ser concedido. De outra forma, o servidor consulta os privilgios de tabelas e campos do usuario nas tabelas tables_priv e columns_priv e os adiciona aos privilgios do usurio. O acesso ser permitido ou negado baseado no resultado. Expresso em termos booleanos, a descrio precedente de como os privilgios de um usurio so calculados podem ser resumido assim: 224

Administrao do Bancos de Dados MySQL

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 insuficientes para a operao requisitada, o servidor adiciona estes privilgios mais tarde aos privilgios especficos de banco de dados, tabelas e colunas. A razo que uma requisio pode exigir mais que um tipo de privilgio. Por exemplo, se voc executar uma instruo INSERT ... SELECT, voc precisa dos privilgios INSERT e SELECT. Seu privilgio pode ser tal que a entrada da tabela user concede um privilgio e a entrada da tabela db concede o outro. Neste caso, voc tem os privilgios necessrios para realizar a requisio, mas o servidor no pode obt-los de ambas as tabelas por si prprio; os privilgios concedidos pelas entradas em ambas as tabelas de ser combinados. A tabela host pode ser usada para manter uma lista dos servidores seguros. Na Tcx, a tabela host contm uma lista de todas as mquina na rede local. A elas so concedidos todos os privilgios. Voc pode tambm usar a tabela host para indicar mquinas que no so seguras. Suponha que voc tenha uma mquina public.your.domain que est localizada em uma rea pblica que voc no considera segura. Voc pode permitir o acesso a todas as mquinas de sua rede exceto a esta mquina usando entradas na tabela host desta forma: +--------------------+----+| Host | Db | ... +--------------------+----+| public.your.domain | % | ... (todos os privilgios configurados para 'N') | %.your.domain | % | ... (todos os privilgios configurados para 'Y') +--------------------+----+Naturalmente, voc deve sempre testar suas entradas nas tabelas de permisses (por exemplo, usar o mysqlaccess para ter certeza que os privilgios de acesso esto atualmente configurados da forma que voc imagina.

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. Para cada conta do MySQL definida uma senha, no entanto o que est armazenado na coluna Password da tabela user no seja uma verso da senha em texto puro, mas um valor hash computado para ela. Valores hash de senha so calculados pela funo PASSWORD(). O MySQL usa senhas em duas fases da comunicao cliente/servidor: 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 hash armazenado na tabela de usurios para a conta que aquele cliente deseja usar. Em segundo lugar, depois que o cliente conecta, ele pode configurar ou alterar o hash da senha para as contas listadas na tabela de usurio (se ele tiver privilgios suficientes).O cliente pode fazer isto usando a funo PASSWORD() para gerar uma hash da senha ou usando as instrues GRANT ou SET PASSWORD.

Em outra palavras, o servidor usa valores hash durante a autenticao quando um cliente tenta a primeira conexo. O servidor gera os valores hash se um cliente conectado chama a funo PASSWORD() ou usa uma instruo GRANT ou SET PASSWORD para definir ou alterar uma senha. O mecanismo de hash da senha foi atualizado no MySQL 4.1 para fornecer melhor segurana e reduzir os riscos de senhas serem roubadas. No entanto, Este novo mecanismo s interpretado pelo servidor 4.1 e clientes 4.1, que podem resultar em alguns problemas de compatibilidade. Um cliente 225

Administrao do Bancos de Dados MySQL

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 dificuldades. 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 A seguinte discusso descreve a diferena entre o antigo e o novo mecanismo de senha, e o que voc deve fazer se voc atualizar o seu servidor para a verso 4.1 mas precizar de manter compatibilidade com clientes pre-4.1. Nota: Esta discusso contrasta no comportamento da verso 4.1 com o comportamento da pre-4.1, mas o da verso 4.1 descrito aqui comea relamente na verso 4.1.1. O MySQL uma distribuio ``disferente'' porque ela tem um mecanismo um pouco diferente daquele implementado na 4.1.1 e acima. Diferenas entre a verso 4.1.0 e as verses mais recentes so descritas posteriormente. Antes do MySQL 4.1, o hash de senha calculado pela funo PASSWORD() tem tamanho de 16 bytes. Este hash se parece com: mysql> SELECT PASSWORD('mypass'); +--------------------+ | PASSWORD('mypass') | +--------------------+ | 6f8c114b58f2ce9e | +--------------------+ A coluna Password da tabela user (na qual estes hashes so armazenados) tambm tm 16 bytes de tamanho antes do MySQL 4.1. A partir do MySQL 4.1, a funo PASSWORD() foi modificada para produzir um valor hash de 41 bytes. mysql> SELECT PASSWORD('mypass'); +-----------------------------------------------+ | PASSWORD('mypass') | +-----------------------------------------------+ | *43c8aa34cdc98eddd3de1fe9a9c2c2a9f92bb2098d75 | +-----------------------------------------------+ De acordo com o mostrado, a coluna Password na tabela user tambm deve ter 41 bytes para armazeanar estes valores. Se voc realiza uma nova instalao do MySQL 4.1, a coluna Password ser convertida para o tamanho de 41 bytes automaticamente. Se voc atualizar uma instalao mais antiga para a verso 4.1, voc executar o script 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 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) A segunda diferena que os hashes de senha no novo formato sempre comeam com um caracter *, que as senhas no formato antigo nunca faziam.

226

Administrao do Bancos de Dados MySQL

O formato maior do hash de senha tetm melhores propriedades criptogrficas, e a autenticao do cliente baseada em hashs mais longos mais segura que aquela baseada nos antigos hashes menores. A diferena entre os hashs de senhas menores e maiores so relevantes em como o servidor usa as senhas durante a autenticao e como ela gera hash de senhas para clientes conectados que realizam operaes de alterao de senha. O modo no qual o servidor usa o hash de senha durante a autenticao afetada pela largura da coluna Password: Se a coluna no for larga, apenas a autenticao de hash curto usada. Se a coluna larga, ela pode guardar tanto hash curtas quanto hashs longas, e o servidor pode usar ambos os formatos: Clientes pre-4.1 podem conectar, mas como els s conhecem o mecanismo hash antigo, eles s podem se conectar pelas contas com hashes curtos. Clientes 4.1 podem autenticar contas com hashes longos ou curtos.

Para contas com o hash curto, o processo de autenticao na verdade um pouco mais seguro para clientes 4.1 que para clientes mais antigos. Em termos de segurana, o gradiente do menos para o mais seguro : 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 largura da coluna Password e pela opo --old-passwords. Um servidor 4.1 gera hashes longos apenas se certas condices forem encontradas: A coluna Password deve ser grande o suficiente para armazenar valores longos e a opo --old-passwords no deve ser dada. Estas condies se aplicam da seguinte forma: A coluna Password deve ser grande o suficiente para armazenar hashes longos (41 bytes). Se a coluna no foi atualizada e ainda tem a largura de 16 bytes (antes da 4.1), o servidor avisa que o hash no pode caber nela e gera apenas hashes curtos quando um cliente realiza a operao de troca de senha usando PASSWORD(), GRANT, ou SET PASSWORD. (Este comportamento ocoree se voc tiver atualizado para a verso 4.1 mas no executou o script mysql_fix_privilege_tables para aumentar a coluna Password.) Se a coluna Password for larga, ela poder aramazenar tanto os hashes de senha curtos quanto os longos. Neste caso, PASSWORD(), GRANT, e SET PASSWORD iro gerar hashes longos a menos que o servidor tenha sido iniciado com a opo --old-passwords. Esta opo fora o servidor a gerar hashes de senha curtos.

O propsito da opo --old-passwords permitir que voc mantenha compatibilidade com clientes com verses anteriores 4.1 sob circunstncias nas quais os servidores gerariam hashes de senha longos. Ele no afeta a autenticao (clientes 4.1 podem ainda usar contas que possuem hash de senha longo), mas ele no previne a criaa de um hash de senha longo na tabela user como resultado de uma operao de troca de senha. Onde isto ocorrer, a conta no mais poder ser usada por clientes pr-4.1. Se a opo --old-passwords, o seguinte cenrio possvel: Um cliente antigo conecta a uma conta que tm um hash de senha curto.

227

Administrao do Bancos de Dados MySQL

O cliente altera a senha das contas. Sem --old-passwords, isto resulta na conta que tm um hash de senha longo. A prxima vez que o cliente antigo tentar se conectar conta, ele no conseguir, porque a conta agora exige o novo mecanismo de hash durante a autenticao. (Uma vez que uma conta tem um hash de senha longo na tabela de usurio, apenas os clientes 4.1 podero ser autenticados, porque clientes de verses anteriores a 4.1 no entendem o hash longo.)

Este cenrio mostra que perigoso executar um servidor 4.1 sem usar a opo -old-passwords, operaes de alterao de senha no iro gerar hashes de senha longos e assim no faz com que as contas se tornem inacessveis para clientes mais antigos. (Estes clientes no podem bloquear eles mesmos inadivertidamente alterando suas senhas e ficando com um hash de senha longo. A desvantagem da opo --old-passwords que qualquer senha que voc criar ou alterar usar hashes curtos, mesmo para clientes 4.1. Assim, voc perde a segurana adicional fornecida pelos hashes de senha longos. Se voc quiser criar uma conta qye tenha um hash longo (por exemplom parr uso pelos clientes 4.1), voc deve faz-lo enquanto executa o servidor sem a opo -old-passwords. Os seguintes cenrios so possveis para executar um servidor 4.1: Cenario 1) Coluna Password menor na tabela de usurios Apenas hashes curtos podem ser armazenados na coluna Password. O servidor usa apenas hasghes curtos durante a autenticao do cliente. Para clientes conectados, operaes de gerao de hash de senha envolvendo 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. A opo --old-passwords pode ser usada mas superflua porque com uma coluna Password menor, o servidor ir gerar hashes de senha curtos de qualquer forma.

Cenrio 2) Colunas Password longas; servidor no iniciado com a opo --old-passwords Hashes de senha longos e curtos podem ser armazenados na coluna Password. Clientes 4.1 podem autenticar contas com hashes curtos ou longos. Clientes anteioriores ao 4.1 s podem autenticar contas com hash curto. Para clientes conectados, operaes de gerao de hash de senha envolvendo 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. 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 possvel que contas com hashes de senha curtos se tornem inacessveis para cliente anteriores ao 4.1. Qualquer alterao a senha de uma conta feita via GRANT, SET PASSWORD, ou PASSWORD() faz com que a conta tenha um hash de senha longo, e a partir deste ponto, nenhum cliente anterior ao 4.1 poder autenticar esta 228

Administrao do Bancos de Dados MySQL

conta at que ele seja atualizado para a verso 4.1. Cenrio 3) Coluna Password longa; servidor iniciado com a opo --old-passwords 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 possvel criar hashes longos apenas quando o servidor iniciado sem --old-passwords). Clientes anteriores ao 4.1 podem autentticar apenas contas com hashes curtos. Para clientes conectados, operaes de gerao de hash de senha envolvendo 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.

Neste cenrio, voc no pode criar contas que tenham hashes de senha longo, porque -old-passwords previne a criao de hashes longos. Tambm, se voc criar uma conta com um hash longo antes de usar a opo --old-passwords, alterar a senha da conta enquanto -old-passwords est funcionando faz com que seja dada a conta uma sena curta, fazendo com que ela perca os benefcios de segurana de um hash longo. As disvantagens para este cenrio pode ser resumido como a seguir: Cenrio 1) Voc no pode tirar vantagem do hash longo que fornece mais autenticao segura. Cenrio 2) Contas com hashes curtos tornam clientes anteriores ao 4.1 inacessveis se voc alterar a senha deles sem usar OLD_PASSWORD() explicitamente. Cenrio 3) --old-passwords evita que as contas com hashes curtos se tornem inacessveis, mas operaes de alterao de senhas fazem com que as contas com hashes longos seja revertida para hashes curtos, e voc no pode alter-las de volta para hashes longos enquanto -old-passwords est em efeito. Implicaes de Alterao de Hashes de Senha para Aplicativos Um atualizao para o MySQL 4.1 para trazer problemas de compatibilidade para aplicaes que usam PASSWORD() para gerar senha para os seus prprios propsitos. (Aplicativos no devem fazer isto, porque PASSWORD() deve ser usado paenas para gerenciar contas do MySQL. Mas algumas aplicaes usam PASSWORD() para seus prprios propsitos.) Se voc atualizar para o MySQL 4.1 e executar o servidor sob condies onde ele gera hashes de senha longo, uma aplicao que usa PASSWORD() para as suas prprias senhas ir falhar. O curso de ao recomendado modificar o aplicativo para usar outras funes como SHA1() ou MD5() para produzir valores de hash. Se isto no for possvel voc pode utilizar a funo OLD_PASSWORD(), que fornecida para gerar hashes curtos no formato antigo. (Mas note que OLD_PASSWORD() pode vir a no ser mais suportado.) Se o servidor est rodando sob circuntncias onde ele gera hashes de senha curtos, OLD_PASSWORD() est disponvel mas equivalente a PASSWORD(). Hash de senhas no MySQL 4.1.0 difere do hash no 4.1.1 e acima. As diferenas da verso 4.1.0 so as seguintes: Hashes de senhas de 45 bytes em vez de 41 bytes. A funo PASSWORD() no repetitvel. Isto , com um dado argumento X, successivas chamadas a PASSWORD(X) geram diferentes resultados.

4.3.12. Causas dos Erros de Accesso Negado


Se voc encontrar erros de Accesso Negado (Access denied) quando tentar conectar-se ao servi229

Administrao do Bancos de Dados MySQL

dor MySQL, a lista abaixo indica alguns caminhos que voc pode seguir para corrigir o problema: Depois de instalar o MySQL, voc executou o script mysql_install_db para configurar o contedo inicial das tabelas de permisses ? Se no, faa isto. See Seco 4.4.4, Configurando os Privilgios Iniciais do MySQL. Testes os privilgios iniciais executando este comando: shell> mysql -u root test O servidor deve deixar voc conectar sem erros. Voc tambm deve assegurar que exista o arquivo user.MYD no diretrio do banco de dados do MySQL. Normalmente ele fica em CAMINHO/var/mysql/user.MYD. onde CAMINHO o caminho para a raiz da instalao do MySQL. Depois de terminar uma instalao, voc deve conectar ao servidor e configurar seus usurios e suas permisses de acesso. shell> mysql -u root mysql O servidor deve permitir a conexo pois o usurio root MySQL vem inicialmente configurado sem senha. Isto tambm um risco de segurana, portanto configurar a senha do usurio root algo que deve ser feito enquanto voc configura os outros usurios do MySQL. Se voc tentar se conectar como root e obter este erro: Access denied for user: '@unknown' to database mysql isto significa que voc no possui um registro na tabela user com o valor 'root' no campo User e que o mysqld no pode rsolver o nome de mquina do cliente. Neste caso, voc deve reiniciar o servidor com a opo --skip-grant-tables e editar seu arquivo / etc/hosts ou o \Windows\hosts para adicionar uma entrada para sua mquina. Se voc obter um erro como o seguinte: shell> mysqladmin -u root -pxxxx ver Access denied for user: 'root@localhost' (Using password: YES) Significa que voc est usando uma senha incorreta. See Seco 4.4.8, Configurando Senhas. Se voc esqueceu a senha de root, voc pode reiniciar o mysqld com a opo -skip-grant-tables para alterar a senha. See Seco A.4.2, Como Recuperar uma Senha de Root Esquecida. Se voc obter o erro acima mesmo se no tiver configurado uma senha, significa que voc tem algum arquivo my.ini configurado para passar alguma senha incorreta. See Seco 4.1.2, Arquivo de Opes my.cnf. Voc pode evitar o uso de arquivos de opes com a opo -no-defaults, como a seguir: shell> mysqladmin --no-defaults -u root ver Se voc atualizou uma instalao existente do MySQL de um verso anterior verso 3.22.11 para a Verso 3.22.11 ou posterior, voc executou o script mysql_fix_privilege_tabels ? Se no faa isto. A estrutura das tabelas de permisses alteraram com a Verso 3.22.11 do MySQL quando a instruo GRANT se tornou funcional. See Seco 2.5.6, Atualizando a Tabela de Permisses. Se os seus privilgios parecerem alterados no meio de uma sesso, pode ser que o superusurio os alterou. A recarga das tabelas de permisses afeta novas conexes dos clientes, mas ela tambm afeta conexes existentes como indicado em Seco 4.4.3, Quando as Alteraes nos Privilgios tem Efeito.

230

Administrao do Bancos de Dados MySQL

Se voc no consegue fazer a sua senha funcionar, lembre-se que voc deve usar a funo PASSWORD() se voc configurar a senha com instrues INSERT, UPDATE ou SET PASSWORD. A funo PASSWORD() desnecessria se voc especificar a senha usando a instruo GRANT ... IDENTIFIED BY ou o comando mysqladmin password. See Seco 4.4.8, Configurando Senhas. localhost um sinnimo para seu nome de mquina local, e tambm a mquina padro em que clientes tentam se conectar se voc no especificar explicitamente o nome da mquina. Entretanto, conexes para localhost no funcionam se voc estiver executando em um sistema que utilize MIT-pthreads (conexes localhost so feitas utilizando sockets Unix, que no so suportadas pelas MIT-pthreads). Para evitar este problema nestes sistemas, voc deve utilizar a opo --host para nomear explicitamente o servidor. Isto far uma conexo TCP/IP ao servidor myssqld. Neste caso, voc deve ter seu nome de mquina real nos registros da tabela user no servidor. (Isto verdadeiro mesmo se voc estiver executando um programa cliente na mesma mquina que o servidor.) Se voc obter o erro Access denied quando tentando conectar ao banco de dados com mysql -u nome_usurio _nome_bd, voc pode ter um problema com a tabela user. Verifique isto executando mysql -u root mysql e usando esta sentena SQL: mysql> SELECT * FROM user; O resultado deve incluir uma entrada com as colunas Host e User combinando com o nome de seu computador e seu nome de usurio no MySQL.

A mensagem de erro Access denied ir dizer a voc com qual usurio voc est tentando se logar, a mquina que est tentando conectar e se voc est utilizando uma senha ou no. Normalmente, voc deve ter um registro na tabela user que combine exatamente com o nome de mquina e o nome de usurio que forem fornecidos na mensagem de erro. Por exemplo, se voc obter uma mensagem de erro que contenha Using password: NO, isto significa que voc est tentando se conectar sem uma senha. Se voc obter o seguinte erro quando estiver tentando conectar de uma mquina diferente da que o servidor MySQL estiver executando, ento no deve existir um registro na tabela user que combine com esta mquina: Host ... is not allowed to connect to this MySQL server Voc pode corrigir isto utilizando a ferramenta de linha de comando mysql (no servidor!) para adicionar um registro tabela user, db ou host para coincidir com o usurio e nome de mquina de onde voc est tentando conectar, depois execute o comando mysqladmin flushprivileges. Se voc no estiver executando o MySQL Verso 3.22 e voc no sabe o nmero IP ou o nome da mquina da qual estiver conectando, voc 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 conectar a partir da mquina cliente, a informao no log do MySQL ir indicar como voc est realmente conectando. (Ento troque o '%' na tabela user com o nome da mquina mostrado pelo log. De outra forma voc teria um sistema que seria inseguro.) Outra razo para este erro no Linux pode ser porque voc est utilizando uma verso binria do MySQL que compilada com uma verso diferente da glibc que voc est usando. Neste caso voc deve atualizar seu SO/Glibc ou fazer o download da verso fonte do MySQL e compil-la. Um RPM fonte , normalmente, fcil de compilar e instalar, logo, isto no um grande problema.

Se voc obter uma mensagem de erro onde o nome da mquina no exibido ou, no lugar do nome da mquina existir um IP, mesmo se voc tenta a conexo com um nome de mquina: shell> mysqladmin -u root -pxxxx -h some-hostname ver Access denied for user: 'root@' (Using password: YES)

231

Administrao do Bancos de Dados MySQL

Isto significa 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 o cache DNS interno. See Seco 5.5.5, Como o MySQL Utiliza o DNS. Algumas solues permanentes so: Tente descobrir o que est errado com seu servidor DNS e corrija os erros. Especifique nmeros IPs no lugar de nomes nas tabelas de privilgios do MySQL. 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 mquina. Coloque os nomes das mquinas clientes em /etc/hosts.

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 tabela user. Um problema comum quando o valor de Host na entrada da tabela user especifica um nome de mquina no qualificado, mas as rotinas de resoluo de nomes de seu sistema retornam um nome qualificado completo do domnio (ou vice-versa). Por exemplo, se voc tem uma entrada com o nome 'tcx' na tabela user, mas seu DNS diz ao MySQL que o nome da mquina 'tcx.subnet.se', a entrada no ir funcionar. Tente adicionar um registro tabela user que contenha o nmero IP de sua mquina como o valor da coluna Host. (Uma alternativa, seria adicionar um registro tabela user com o valor de Host contendo um metacaracter, por exemplo, 'tcx.%'. Entretanto, o uso de nomes de mquinas terminando com % inseguro e no recomendado!) Se mysql -u nome_usurio test funciona mas mysql -u nome_usurio outro_bd no funconar, voc no possui uma entrada para outro_bd listado na tabela db. Se mysql -u nome_usurio nome_bd funciona quando executado no prprio servidor, mas mysql -u nome_mquina -u nome_usurio nome_bd no funciona quando executado em outra mquina cliente, voc no possui o nome da mquina cliente listado na tabela user ou na tabela db. Se voc no estiver entendendo porque obtem Access denied, remova da tabela user todas as entradas da coluna Host que contenham meta caracteres (entradas que contenham $ ou _). Um erro muito comum inserir uma nova entrada com Host='%' e User='algum usurio', pensando que isto ir permitir a voc especificar localhost para conectar da mesma mquina. A razo disto no funcionar que os privilgios padres incluem uma entrada com Host='localhost' e User=''. Como esta entrada tem o valor 'localhost' em Host que mais especfica que '%', ela usada no lugar da nova entrada quando se conectar de localhost! O procedimento correto inserir uma segunda entrada com Host='localhost' e User='algum_usurio', ou remover 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 host: Access to database denied Se a entrada selecionada da tabela db tiver um valor vazio na coluna Host, tenha certeza que exista uma ou mais entradas correspondentes na tabela host especificando quais mquinas aplicam-se tabela db. Se voc obter o erro quando estiver utilizando comandos SQL SELECT ... INTO OUTFILE ou LOAD DATA INFILE, a entrada na tabela user provavelmente no tem o privilgio file habilitado.

232

Administrao do Bancos de Dados MySQL

Lembre-se que programas clientes iro usar parmetros de conexes especificados em arquivos de configurao ou variveis ambientais. See Apndice F, Variveis de Ambientes do MySQL. Se parecer que algum cliente est enviando parmetros errados para a conexo e voc no os especificou na linha de comando, verifique seu ambiente e o arquivo .my.cnf no seu diretrio home. Voc pode tambm conferir os arquivos de configuraes do servidor MySQL, apesar de no ser interessante gravar configuraes de cliente nestes arquivos. See Seco 4.1.2, Arquivo de Opes my.cnf. Se voc obter a mensagem de acesso negado (Access denied) quando estiver executando um cliente sem opes, tenha certeza que voc no especificou uma senha antiga em nenhum de seus arquivos de opes! See Seco 4.1.2, Arquivo de Opes my.cnf. Se voc fizer alteraes para as tabelas de permisses diretamente (utilizando uma instruo INSERT ou UPDATE) e suas alteraes parecem ser ignoradas, lembre que voc deve usar uma instruo FLUSH PRIVILEGES ou executar um comando mysqladmin flushprivileges para o servidor ler novamente as tabelas com os privilgios. De outra forma, suas alteraes no faro efeito at que o servidor seja reiniciado. Lembre-se que depois de configurar a senha de root com um comando UPDATE, no ser necessrio especificar a senha at que voc atualize os privilgios, pois o servidor ainda no saber que voc alterou a senha! Se voc tiver problemas de acesso com Perl, PHP, Python ou um programa ODBC, tente conectar ao servidor com mysql -u nome_usurio nome_bd ou mysql -u nome_usurio -psua_senha nome_bd. Se voc consegue conectar com o cliente mysql, existe algum problema com seu programa e no o acesso aos privilgios (Note que no espao entre -p e a senha; voc tambm pode utilizar a sintaxe --password=sua_senha para especificar a senha. Se voc utilizar a opo -p sozinha, o MySQL ir lhe solicitar a senha.) Para testar, iniciae o daemon mysqld com a opo --skip-grant-tables. Ento voc pode alterar as tabelas de permisses do MySQL e utilizar o script mysqlaccess para conferir se suas modificaes fizeram o no o efeito desejado. Quando voc estiver satisfeito com suas alteraes, execute mysqladmin flush-privileges para dizer ao servidor mysqld para iniciar utilizando as novas tabelas com os privilgios. Nota: Recarregar as tabelas de permisses sobrescreve a opo --skip-grant-tables. Isto lhe permite dizer ao servidor para comear a utilizar as tabelas de permisses novamente sem reinici-lo. Se tudo mais falhar, inicie o servidor mysqld com uma opo de depurao (por exemplo, -debug=d,general,query). Isto ir imprimir informaes de mquinas e usurios sobre tentativas de conexes, e tambm informaes sobre cada comando disparado. See Seco E.1.2, Criando Arquivos Trace (Rastreamento). Se voc tiver outros problemas com as tabelas de permisses do MySQL e sente que deve enviar o problema para a lista de discusso, sempre fornea um descarga das tabelas de permisses do seu MySQL. Voc pode descarregar as tabelas com o comando mysqldump mysql. Como sempre, envie seus problemas utilizando o script mysqlbug. See Seco 1.7.1.3, Como relatar erros ou problemas. Em alguns casos voc pode precisar reiniciar o mysqld com a opo -skip-grant-tables para executar o mysqldump.

4.4. Gerenciamento das Contas dos Usurios no MySQL


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

Administrao do Bancos de Dados MySQL

[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 anteriores do MySQL, a instruo GRANT no faz nada. Os comandos GRANT e REVOKE permitem aos administradores do sistema criar usurios e conceder e revogar direitos aos usurios do MySQL em quatro nveis de privilgios: Nvel Global Privilgios globais aplicam para todos os bancos de dados em um determinado servidor. Estes privilgios so armazenados na tabela mysql.user. GRANT ALL ON *.* e REVOKE ALL ON *.* concedero e revogaro apenas privilgios globais. Nvel dos bancos de dados Privilgios de bancos de dados aplicam-se a todas as tabelas em um determinado banco de dados. Estes privilgios so armazenados nas tabelas mysql.db e mysql.host. GRANT ALL ON db.* e REVOKE ALL ON db.* concedero e revogaro apenas privilgios de banco de dados. Nvel das tabelas Privilgios de tabelas aplicam-se a todas as colunas em uma determinada tabela. Estes privilgios so armazenados na tabela mysql.tables_priv. GRANT ALL ON db.table e REVOKE ALL ON db.table concedero e revogaro apenas privilgios de tabelas. Nvel das colunas Privilgios de colunas aplicam-se a uma nica coluna em uma determinada tabela. Estes privilgios so armazenados na tabela mysql.columns_priv. Para as instrues GRANT e REVOKE, tipo_priv pode ser especificado como um dos seguintes: ALL [PRIVILEGES] ALTER CREATE CREATE TABLES DELETE DROP EXECUTE FILE INDEX INSERT LOCK TABLES PROCESS Configura todos os privilgios simples exceto WITH GRANT OPTION Permite o uso de ALTER TABLE Permite o uso de CREATE TABLE TEMPORARY 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) 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. Permite o uso de SHOW FULL PROCESSLIST 234

Administrao do Bancos de Dados MySQL

REFERENCES RELOAD REPLICATION CLIENT REPLICATION SLAVE SELECT SHOW DATABASES SHUTDOWN SUPER

Para o futuro Permite o uso de FLUSH Da o direto ao usurio de perguntar onde o slave/master est. Necessrio para a replicao dos slaves (para ler logs binrio 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 tiverem sido alcanados e executa o comando CHANGE MASTER, KILL thread, mysqladmin debug, PURGE MASTER LOGS e SET GLOBAL Permite o uso de UPDATE Sinnimo para ``sem privilgios.'' Sinnimo para WITH GRANT OPTION

UPDATE USAGE GRANT OPTION

USAGE pode ser usado quando voc quer criar um usurio sem privilgios. Os privilgios CREATE TEMPORARY TABLES, EXECUTE, LOCK TABLES, REPLICATION ..., SHOW DATABASES e SUPER so novos na verso 4.0.2. Para usar estes novos privilgios aps atualizar para 4.0.2, voc tem que executar o script mysql_fix_privilege_tables. See Seco 2.5.6, Atualizando a Tabela de Permisses. Em verses anteriores do MySQL, o privilgio PROCESS d o mesmo direitos que o novo privilgio SUPER. Para anular o privilgio grant de um usurio, utilize o valor tipo_priv de GRANT OPTION: mysql> REVOKE GRANT OPTION ON ... FROM ...; Os nicos valores de tipo_priv que voc pode especificar para uma tabela so SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX e ALTER. Os nicos valores de tipo_priv que voc pode especificar para uma coluna (isto , quando voc usar uma clusula column_list) so SELECT, INSERT e UPDATE. O MySQL permite que voc crie privilgios a nvel de banco de dados mesmo se o banco de dados no existir para tornar fcil de se preparar para o uso do banco de dados. Atualmente, no entanto, o MySQL no permite criar permisses de a nvel de tabela se a tabela no existir. O MySQL no revogar automaticamente qualquer privilgio, mesmo se voc apagar uma tabela ou banco de dados. Voc pode configurar privilgios globais utilizando a sintaxe ON *.*. Voc pode configurar privilgios de bancos de dados utilizando a sintaxe ON nome_bd.*. Se voc especificar ON * e estiver com algum banco de dados aberto, ser configurado os privilgios somente para este banco de dados. (AVISO: Se voc especificar ON * e voc no tem possui um banco de dados aberto, ir afetar os privilgios globais!). Note por favor Os metacaracteres _ e % so permitidos na especificao dos nomes de bancos de dados em comandos GRANT. Isto significa que se voc deseja usar um caracater _ como parte de um nome de banco de dados, voc deve especific-lo como '\_' no comando GRANT, para prevenir o usurio de poder acessar bancos de dados adicionais que correspondam ao padro do metacaracter, ex., GRANT ... ON `foo\_bar`.* TO .... Para acomodar concesses de direitos para usurios de mquinas arbitrrias, o MySQL suporta a especificao do valor user_name no formato usurio@mquina. Se voc desejar especificar 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 o nome de mquina entre 235

Administrao do Bancos de Dados MySQL

aspas (por exemplo, 'usurio-teste'@'mquina-teste'). Voc pode especificar meta caracteres no nome da mquina. Por exemplo, user@"%.loc.gov" se aplica a user para qualquer mquina no domnio loc.gov, e user@"144.155.166.%" se aplica a user em qualquer mquina na subrede de classe C 144.155.166. O formato simples user sinnimo de user@"%". O MySQL no suporta metacaracteres em nomes de usurios. Usurios annimos so definidos inserindo entradas com User='' na tabela mysql.user ou criando um usurio com um nome vazio com o comando GRANT. Nota: Se voc permite o acesso de usurios annimos ao seu servidor MySQL, voc deve tambm concecder privilgios a todos os usurios locais como user@localhost porque, de outra forma, a entrada de usurio annimo para a mquina local na tabela mysql.user ser usada quando o usurio tentar a conexo ao servidor MySQL da mquina local! Voc pode verificar se isto se aplica a voc executando a seguinte instruo: mysql> SELECT Host,User FROM mysql.user WHERE User=''; No momento, GRANT suporta somente nomes de mquinas, tabelas bancos de dados e colunas at 60 caracteres. Um nome de usurio pode ter at 16 caracteres. Os privilgios para uma tabela ou coluna so formados atravs do OU lgico dos privilgios em cada um dos quatro nveis de privilgios. Por exemplo, se a tabela mysql.user especifica que um usurio tem um privilgio global select, isto no pode ser negado por uma entrada no nvel de banco de dados, tabela ou coluna. Os privilgios para uma coluna podem ser calculados da seguinte forma: privilgios globais OR (privilgios de banco de dados AND privilgios de mquina) OR privilgios de tabela OR privilgios de coluna Na maioria dos casos, os direitos a um usurio so atribudos em apenas um dos nveis de privilgios, portanto a vida normalmente no to complicada como mostrado acima. Os detalhes do procedimento de verificao dos privilgios so apresentados em Seco 4.3, Detalhes Gerais de Segurana e o Sistema de Privilgio de Acesso do MySQL. Se voc concede privilgios para uma combinao de usurio e mquina que no existem na tabela mysql.user, um registro adicionado e permanece l at ser removido com um comando DELETE. Em outras palavras, GRANT pode criar registros na tabela user, mas REVOKE no as remover; para remov-las voc deve usar a instruo explcita DELETE. Na Verso 3.22.12 ou posterior do MySQL, se um novo usurio criado ou se voc possui privilgios de concesso globais, a senha do usurio ser especificada utilizando a clusula IDENTIFIED BY, se uma for dada. Se o usurio j possui uma senha, ela trocada pela nova. Se voc no quiser enviar a senha em texto puro voc pode usar a opo PASSWORD seguido de uma senha embaralhada da funo SQL PASSWORD() ou da funo da API C make_scrambled_password(char *to, const char *password). CUIDADO: Se voc criar um novo usurio mas no especificar uma clusula IDENTIFIED BY, o usurio no possuir uma senha. Isto no seguro. Senhas podem tambm ser configuradas com o comando SET PASSWORD. See Seco 5.5.6, Sintaxe de SET. Se voc conceder privilgios para um banco de dados, uma entrada na tabela mysql.db criada se necessrio. Quando todos os privilgios para o banco de dados forem removidos com REVOKE, este registro removido. 236

Administrao do Bancos de Dados MySQL

Se um usurio no tem privilgios em uma tabela, a tabela no mostrada quando o usurio solicita uma lista de tabelas (com a instruo SHOW TABLES por exemplo). O mesmo verdade para SHOW DATABASES A clusula WITH GRANT OPTION d ao usurio habilidade de fornecer outros usurios quaisquer privilgios que ele tenha em um nvel especfico de privilgio. Voc deve ter cuidado ao fornecer o privilgio grant, pois dois usurios podem se unir para unir privilgios! MAX_QUERIES_PER_HOUR #, MAX_UPDATES_PER_HOUR # e MAX_CONNECTIONS_PER_HOUR # sp novos no MySQL verso 4.0.2. Estas opes limitam o nmero de consultas/atualizaes e logins que o usurios pode fazer durente uma hora. Se # 0 (padro), ento isto significa que no h limites para aquele usurio. See Seco 4.4.7, Limitando os Recursos dos Usurios. Nota: para especificar qualquer destas opes para um usurio existente sem adicionar outros privilgios adicionais, use GRANT USAGE ON *.* ... WITH MAX_.... Voc no pode conceder a outro usurio um privilgio que no possua; o privilgio GRANT possibilita fornecer somente os privilgios que possuir. Esteja ciente que quando conceder a um usurio o privilgio GRANT em um nvel particular de privilgios, qualquer privilgio que o usurio j possua (ou seja fornecido no futuro!) nesse nvel tambm pode ser concedido por este usurio. Suponha que voc conceda a um usurio o privilgio INSERT em um banco de dados. Se voc conceder o privilgio SELECT no banco de dados e especificar WITH GRANT OPTION, o usurio alm de poder repassar o privilgio SELECT poder tambm repassar o insert. Se voc concede o privilgio UPDATE para o usurio no banco de dados, o usurio poder conceder os privilgios INSERT, SELECT e UPDATE. Voc no deve conceder privilgios ALTER a um usurio comum. Se voc fizer isto, o usurio pode tentar enganar o sistema de privilgios renomeando tabelas! Perceba que se voc estiver utilizando privilgios de tabelas ou colunas, mesmo que para apenas um usurio, o servidor examina os privilgios de tabelas e colunas para todos os usurios e isto ir deixar o MySQL um pouco mais lento. Quando o mysqld inicia, todos os privilgios so lidos na memria. Privilgios de bancos de dados, tabelas e colunas so iniciados um vez, e privilgios ao nvel de usurio fazem efeito na prxima vez que o usurio conectar. Modificaes nas tabelas de permisses que voc realiza utilizando GRANT ou REVOKE so percebidas pelo servidor imediatamente. Se voc modificar as tabelas de permisses manualmente (utilizando INSERT, UPDATE, etc), voc deve executar uma instruo FLUSH PRIVILEGES ou executar mysqladmin flush-privileges para dizer ao servidor para recarregar as tabelas de permisses. See Seco 4.4.3, Quando as Alteraes nos Privilgios tem Efeito. As maiores diferenas entre o padro SQL e verses MySQL de GRANT so: No MySQL privilgios so fornecidos para uma combinao de usurio e mquina e no somente para um usurio. O SQL-99 no possui privilgios no nvel global ou de bancos de dados, e no suporta todos os tipos de privilgios que o MySQL suporta. O MySQL no suporta os privilgios TRIGGER, EXECUTE ou UNDER do SQL-99. Os privilgios do SQL-99 so estruturadados em uma maneira hierrquica. Se voc remover um usurio, todos os privilgios do usurio so removidos. No MySQL os privilgios concedidos no so removidos automaticamente, mas voc deve remov-los se necessrio. Se no MySQL voc possuir o privilgio INSERT em somente parte das colunas em uma tabela, voc pode executar instrues INSERT na tabela; As colunas em que voc no tem o privilgio INSERT iro receber seus valores padres. O SQL-99 necessita que voc tenha o privilgio INSERT em todas as colunas. Quando voc remove uma tabela no SQL-99, todos os privilgios para a tabela so removidos. 237

Administrao do Bancos de Dados MySQL

Se voc remover um privilgio no SQL-99, todos os privilgios que foram concedidos baseado neste privilgio so tambm removidos. No MySQL, privilgios s podem ser removidos com comandos REVOKE explcitos ou manipulando as tabelas de permisses do MySQL. Para uma descrio do uso de REQUIRE, veja Seco 4.4.10, Usando Conexes Seguras.

4.4.2. Nomes de Usurios e Senhas do MySQL


Existem vrias diferenas entre a forma que nomes de usurios e senhas so usados pelo MySQL e a forma que so usados pelo Unix ou Windows: Nomes de usurios, como usado pelo MySQL para propsitos de autenticao, no tem nenhuma relao com os nomes de usurios do Unix (nomes de login) ou nomes de usurios Windows. A maioria dos clientes MySQL, por padro, tentam se conectar utilizando o nome de usurio atual do Unix como o nome de usurio no MySQL, mas isto existe somente por convenincia. Programas clientes permite especificar um nome diferente com as opes -u ou --user. Isto significa que voc no pode tornar um banco de dados seguro a menos que todos os usurios do MySQL possuam senhas. Qualquer um pode tentar se conectar ao servidor utilizando qualquer nome, e eles se conectaro com qualquer nome que no possua uma senha. Nomes de usurios MySQL podem ter o tamanho de at 16 caracteres; Nomes de usurio Unix normalmente so limitados at 8 caracteres. Senhas MySQL no tem nenhuma relao com senhas Unix. No existe nenhuma associao entre a senha em que voc utiliza para logar-se a uma mquina Unix e a senha que utilizada para acessar um banco de dados na mesma mquina. O MySQL criptografa senhas utilizando um algortimo diferente que o utilizado pelo processo de login do Unix. Veja as descries das funes PASSWORD() e ENCRYPT() em Seco 6.3.6.2, Funes Diversas. Perceba que mesmo que a senha armazenada 'embaralhada', o conhecimento da sua senha 'embaralhada' o suficiente para conseguir se conectar ao servidor MySQL! A partir da verso 4.1, o MySQL emprega um mecanismo de senha e login diferentes que seguro mesmo se for feito um sniff no pacote TCP/IP e/ou o banco de dados mysql for capturado. Usurios MySQL e seus privilgios so criados normalmente com o comando GRANT, See Seco 4.4.1, A Sintaxe de GRANT e REVOKE. Quando voc se conecta a um servidor MySQL com um cliente de linha de comando voc pode especificar a senha com --password=sua-senha. See Seco 4.3.8, Conectando ao Servidor MySQL. mysql --user=monty --password=guess nome_do_banco Se voc deseja que o cliente lhe solicite a senha, deve ser especificado o parmetro --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 ltimo exemplo a senha no 'nome_do_banco'. Se voc deseja usar a opo -p para fornecer uma senha voc deve fazer assim:

238

Administrao do Bancos de Dados MySQL

mysql -u monty -pguess database_name Em alguns sistemas, a chamada da biblioteca que utilizada pelo MySQL para solicitar por uma senha corta automaticamente a senha para 8 caracteres. Internamente o MySQL no limita o tamanho limite da senha.

4.4.3. Quando as Alteraes nos Privilgios tem Efeito


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

4.4.4. Configurando os Privilgios Iniciais do MySQL


Depois de instalar o MySQL, voc configura os privilgios iniciais dos acessos executando scripts/mysql_install_db. See Seco 2.3.1, Viso geral da instalao rpida. O script mysql_install_db inicia o servidor mysqld, depois inicializa as tabelas de permisses com a seguinte configurao dos privilgios: O usurio root do MySQL criado como um superusurio que pode fazer qualquer coisa. Conexes devem ser feitas atravs da mquina local. NOTA: A senha inicial de root vazia, portanto qualquer um que conectar como root sem senha ter direito a todos os privilgios. Um usurio annimo criado e pode fazer o que desejar com bancos de dados com nome 'test' ou iniciando com 'test_'. Conexes devem ser feitas da mquina local. Isto significa que usurios locais podem se conectar sem senha e serem tratados como usurios annimos. Outros privilgios so negados. Por exemplo, usurios normais no podem executar mysqladmin ou mysqladmin processlist.

NOTA: Os privilgios padres so diferentes no Windows. See Seco 2.1.1.8, Executando o MySQL no Windows. Como sua instao inicialmente parcialmente aberta, uma das primeiras coisas que voc deve fazer especificar uma senha para o usurio root do MySQL. Voc pode fazer isto como a seguir 239

Administrao do Bancos de Dados MySQL

(perceba que a senha foi especificada utilizando a funo PASSWORD()): shell> mysql -u root mysql mysql> SET PASSWORD FOR root@localhost=PASSWORD('nova_senha'); Substitua 'nova_senha' pela senha que voc deseja usar. Se voc souber o que esta fazendo, voc tambm pode manipular diretamente a tabela privilgios: shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD('nova_senha') -> WHERE user='root'; mysql> FLUSH PRIVILEGES; Outra forma de configurar a senha utilizando o comando mysqladmin: shell> mysqladmin -u root password nova_senha Somente usurios com acesso de escrita/atualizao ao banco de dados mysql podem alterar a senha de outros usurios. Todos os usurios comuns (no os annimos) podem alterar somente a prpria senha com um dos comandos acima ou com SET PASSWORD=PASSWORD('nova_senha'). Perceba que se voc atualizar a senha na tabela user diretamente utilizando UPDATE, voc deve dizer ao servidor para reler as tabelas de permisses (com FLUSH PRIVILEGES), de outra forma a alterao no seria notificada. Uma vez que a senha de root foi configurada, voc deve informar a senha quando se conectar ao servidor MySQL como root. Voc pode desejar deixar a senha de root em branco para que voc no precise especific-la quando realizar configuraes adicionais ou testes. Entretanto, tenha certeza de configur-la antes de utilizar sua instalao para qualquer ambiente de produo. Veja o script scripts/mysql_install_db para ver como so configurados os privilgios padres. Voc pode usar isto como uma base para ver como adicionar outros usurios. Se voc deseja que os privilgios iniciais sejam diferentes do descrito acima, possvel modificar o script mysql_install_db antes de execut-lo. Para recriar as tabelas de permisses completamente, remova todos os arquivos .frm .MYI e .MYD no diretrio contendo o banco de dados mysql. (Este o diretrio chamado mysql sob o diretrio do banco de dados, que listado quando voc executa mysqld --help.) Depois execute o script mysql_install_db, possivelmente depois de edit-lo para criar os privilgios desejveis. NOTA: Para verses do MySQL mais antigas que a verso 3.22.10, voc no deve apagar os arquivos .frm. Se voc fizer isso acidentalmente, voc deve volt-los a partir de sua distribuio MySQL antes de executar mysql_install_db.

4.4.5. Adicionando Novos Usurios ao MySQL


Existem duas maneiras de adicionar usurios: utilizando instrues GRANT ou manipulando as tabelas de permisses do MySQL diretamente. O mtodo preferido utilizar instrues GRANT, porque elas so mais concisas e menos propensas a erros. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE. Existem vrios programas de colaboradores (como o phpMyAdmin) que podem ser utilizados para criar e administrar usurios. See Apndice B, Contribuio de Programas. Os exemplos abaixo mostram como usar o cliente mysql para configurar novos usurios. Estes exemplos assumem que privilgios so configurados de acordo com os padres descritos na seo anterior. Isto significa que para fazer alteraes, voc deve se conectar na mesma mquina em que o 240

Administrao do Bancos de Dados MySQL

mysqld est executando, voc deve se conectar com o usurio root, e o usurio root deve ter os privilgios inster ao banco de dados mysql e o administrativo reload. Tambm, se voc alterou a senha do usurio root, voc deve especific-la para os comandos mysql abaixo. Primeiro, use o programa mysql para se conectar ao servidor como o usurio root do MySQL: shell> mysql --user=root mysql Voc pode adicionar novos usurios utilizando instrues GRANT: mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'alguma_senha' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO monty@'%' IDENTIFIED BY 'alguma_senha' WITH GRANT OPTION; mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost; mysql> GRANT USAGE ON *.* TO dummy@localhost; Estas instrues GRANT configuram trs novos usurios: monty Um superusurio completo que pode conectar ao servidor de qualquer lugar, mas deve utilizar uma senha 'alguma_senha' para fazer isto. Perceba que devemos utilizar instrues GRANT para monty@localhost e monty@"%". Se ns no adicionarmos a entrada com localhost, a entrada para o usurio annimo para localhost que criada por mysql_install_db toma precedncia quando nos conectarmos da mquina local, porque ele contem um campo Host com um valor mais especfico e tambm vem antes na ordenao da tabela user. admin Um usurio que possa conectar de localhost sem uma senha e que concedido os privilgios administrativos reload e process. Isto permite ao usurio a execuo dos comandos mysqladmin reload, mysqladmin refresh e mysqladmin flush-*, bem como o mysqladmin processlist. Nenhum privilgio a nvel de bancos de dados concedido. (Depois eles podem ser adicionados utilizando instrues GRANT adicionais.) dummy Um usurio que pode conectar sem uma senha, mas somente na mquina local. No so concedidos nenhum privilgio---o tipo de privilgio USAGE permite a criao de um usurio sem privilgios. Ele tem o efeito de criar todos os privilgios globais com 'N'. Considera-se que voc ir conceder privilgios especficos a conta posteriormente. Tambm possvel adicionar a mesma informao de acesso do usurio diretamente, utilizando instrues INSERT e depois dizendo ao servidor para recarregar as tabelas de permisses: 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 valores 'Y' acima. (Verses anteriores verso 3.22.11 tem menos campos de privilgios, e posteriores a 4.02 tm mais). Para o usurio admin, a maior sintaxe legvel de INSERT usando SET que est 241

Administrao do Bancos de Dados MySQL

disponvel a partir da verso 3.22.11 a utilizada. Note que para configurar um superusurio, voc s precisar criar uma entrada na tabela user com os campos de privilgios configurados para 'Y'. No necessrio gerar entradas nas tabelas db ou host. Na ltima instruo INSERT (para o usurio dummy), apenas as colunas Host, User e Password nos registros da tabela user tem valores atribudos. Nenhuma das colunas de privilgios so definidas explicitamente, assim o MySQL atribui a todas o valor padro de 'N'. Isto a mesma coisa que o GRANT USAGE faz. O seguinte exemplo adiciona um usurio custom que pode acessar o banco de dados bankaccout apenas do localhost, o banco de dados expenses somente de whitehouse.gov e o banco de dados customer de todas de server.domain. Ele deseja utilizar a senha obscure das trs mquinas. Para configurar os privilgios deste usurio utilizando instrues GRANT, execute estes comandos: shell> mysql> -> -> -> mysql> -> -> -> mysql> -> -> -> mysql --user=root mysql GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO custom@localhost IDENTIFIED BY 'obscure'; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO custom@'whitehouse.gov' IDENTIFIED BY 'obscure'; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO custom@'server.domain' IDENTIFIED BY 'obscure';

Para configurar os privilgios do usurio modificiando as tabelas de permisses diretamente, utilize estes comandos (perceba o FLUSH PRIVILEGES no final): shell> mysql> -> mysql> -> mysql> -> mysql> -> -> -> -> mysql> -> -> -> -> mysql> -> -> -> mysql --user=root mysql INSERT INTO user (Host,User,Password) VALUES('localhost','custom',PASSWORD('obscure')); 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 um nmero diferentes de valores 'Y', dependendo de sua verso do MySQL. As primeiras trs instrues INSERT adicionam entradas na tabela user que permite ao usurio custom conectar a partir de vrias mquinas com a senha determinada, mas no concede permisses ao mesmo (todos os privilgios so configurados com o valor padro de 'N'). As prximas trs instrues INSERT adicionam entradas na tabela db que concedem privilgios custom para os bancos de dados bankaccount, expenses e customer, mas s quando acessados partir 242

Administrao do Bancos de Dados MySQL

das mquinas apropriadas. Normalmente, depois de modificar as tabelas de permisses diretamente, voc deve dizer ao servidor para recarreg-las (com FLUSH PRIVILEGES) para que as alteraes nos privilgios tenham efeito. Se voc deseja fornecer a um usurio especfico acesso de qualquer mquina em um determinado domnio (por exemplo, meudomnio.com), voc pode utilizar uma instruo GRANT como a seguir: mysql> GRANT ... -> ON *.* -> TO myusername@'%.mydomain.com' -> IDENTIFIED BY 'mypassword';

Para realizar a mesma coisa modificando diretamente as tabelas de permisses, faa isto: mysql> INSERT INTO user VALUES ('%.meudominio, 'meunomedeusuario' PASSWORD('minhasenha'),...); mysql> FLUSH PRIVILEGES;

4.4.6. Deletando Usurios do MySQL


DROP USER nome_usuario Este comando foi adicionado ao MySQL 4.1.1. Ele apaga um usurio que no possua nenhum privilgio. Para deletar um usurio do MySQL voc usar o seguinte procedimento, realizando os passos na ordem mostrada. 1. 2. 3. Verifique quais privilgios o usurio tem com SHOW PRIVILEGES. See Seco 4.6.8.11, SHOW PRIVILEGES. Delete todos os privilgios do usurio com REVOKE. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE. Delete o usurio com DROP USER.

Se voc estiver usando uma verso mais antiga do MySQL voc deve primeiro revogar os privilgios e ento deletar o usurio com: DELETE FROM mysql.user WHERE user='username' and host='hostname'; FLUSH PRIVILEGES;

4.4.7. Limitando os Recursos dos Usurios


A partir do MySQL 4.0.2 pode se limitar certos recursos por usurios. At ento, o nico mtodo disponvel de limitao de uso do servidor MySQL era canfigurar a varivel de inicializao max_user_connections para um valor diferente de zero. Mas este mtodo estritamente global e no permite o gerenciamento de usurios individuais, o que pode ser de interresse particular do Provedor de Servios Internet. Consequentemente, o gerenciamento de trs recursos introduzido no nvel de usurio individual: Nmero de todas as consultas por hora: Todos os comandos que podiam ser executados por um usurio. 243

Administrao do Bancos de Dados MySQL

Nmero de todas as atualizaes por hora: Qualquer comando que altera qualquer tabela ou banco de dados. Nmeor de conexes feitas por hora: Novas conexes abertas por hora.

Um usurio no contexto mencionado acima uma nica entrada na tabela user, que identificada unicamente por suas colunas user e host. Todos os usurios no so limitados por padro no uso dos recursos acima, a menos que os limites sejam garantidos a eles. Estes limites podem ser concedidos apenas atravs do GRANT (*.*) global, usando esta sintaxe: GRANT ... WITH MAX_QUERIES_PER_HOUR N1 MAX_UPDATES_PER_HOUR N2 MAX_CONNECTIONS_PER_HOUR N3; Pode-se especificar qualquer combinao dos recursos acima. N1, N2 e N3 so inteiros e significam contagem/hora. Se os usurios alcanam o limite de conexes dentro de uma hora, no ser aceita mais nenhuma conexo at o fim desta hora. De forma parecida se o usurio alcana o limite do nmero de consultas ou atualizaes, consultas ou atualizaes adicionais sero rejeitadas at que a hora acabe. Em todos os casos, uma mensagem de erro apropriada enviada. Os valores atualmente usados por um usurio em particular pode ser descarregados (zerados) enviando uma instruo GRANT com qualquer das clusulas acima, inclundo uma instruo GRANT com os valores atuais. Os valores atuais para todos os usurios para todos os usurios sero descarregados se os privilgios forem recarregados (no servidor ou usando mysqladmin reload) ou se o comando FLUSH USER_RESOURCES executado. O resurso est habilitado assim que e concedido a um nico usurio qualquer das clusulas GRANT de limitao. Como um prerequisito para a habilitao deste recurso, a tabela user no banco de dados mysql deve conter as colunas adicionais, como definido no script de criao de tabelas mysql_install_db e mysql_install_db.sh no subdiretrio scripts.

4.4.8. Configurando Senhas


Na maioria dos casos voc deve utilizar GRANT para configurar seus usurios e senhas, portanto, as informaes exibidas a seguir so aplicadas somentes para usurios avanados. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE. Os exemplos nas sees precedentes ilustram um princpio importante: quando voc armazena uma senha no-vazia utilizando INSERT ou UPDATE voc deve utilizar a funo PASSWORD() para criptograf-la. Isto porque a tabela user armazena senhas na forma criptografada, e no como texto puro. Se voc esquecer deste fato, provvel que voc possa tentar configurar 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 o usurio jeffrey tentar se conectar ao servidor utilizando esta senha, o cliente mysql a criptografa utilizando a funo PASSWORD(), gerando um vetor de autenticao baseado em uma senha criptografada e um nmero randmico, obtido do servidor, e envia o resultado ao servidor. O servidor usa o valor do campo password na tabela user (que o valor 'biscuit' no criptografado ) 244

Administrao do Bancos de Dados MySQL

para realizar os mesmos clculos e comparar os resultados. A comparao falha e o servidor rejeita a conexo: shell> mysql -u jeffrey -pbiscuit test Access denied As senhas devem ser criptografadas quando elas so inseridas na tabela user, portanto a instruo INSERT deveria ter sido informada no seguinte formato: mysql> INSERT INTO user (Host,User,Password) VALUES('%','jeffrey',PASSWORD('biscuit')); Voc deve tambm utilizar a funo PASSWORD() quando utilizar instrues SET PASSWORD: mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit'); Se voc configurar senhas utilizando a instruo GRANT ... IDENTIFIED BY ou o comando mysqladmin password, a funo PASSWORD() desnecessria. Ambos tomam o cuidado de criptografar a senha para voc, ento voc deve especificar a senha 'biscuit' desta forma: mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit'; ou shell> mysqladmin -u jeffrey password biscuit NOTA: PASSWORD() diferente da senha criptografada do Unix.

4.4.9. Mantendo Sua Senha Segura


No aconselhvel especificar uma senha de uma forma que a exponha e possa ser descoberta por outros usurios. Os mtodos que voc pode usar para especificar sua senha quando executar programas clientes so listados abaixo, juntamente com as determinaes de riscos de cada mtodo: Nunca fornea a um usurio normal acesso tabela mysql.user. O conhecimento de uma senha criptografada possibilita a conexo como este usurio. As senhas s esto embaralhadas para que no seja possvel chegar senha real que foi usada (acontece muito a utilizao de senhas similares em outras aplicaes). Uso da opo -psua_senha ou --password=sua_senha na linha de comando. Isto conveniente mas inseguro, porque sua senha se torna visvel para programas de informao do sistema (como no ps) que pode ser chamado por outros usurios para 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 um breve intervalo no qual o valor est visvel.) Uso das opes -p ou --pasword (sem especificar o valor sua_senha). Neste caso, o programa cliente solicita a senha do terminal: shell> mysql -u user_name -p Enter password: ******** Os caracteres * representam sua senha. mais seguro digitar sua senha desta forma do que especific-la na linha de comando porque ela no fica visvel a outros usurios. Entretanto este mtodo de digitar uma senha vlido somente para programas que voc executa de forma interativa. Se voc deseja chamar um cliente de um script que no execute interativamente, no existir oportunidade de digitar a senha do terminal. 245

Administrao do Bancos de Dados MySQL

Em alguns sistemas, voc pode descobrir que a primeira linha do seu script lida e interpretada (incorretamente) como sua senha! Armazenar a sua senha em um arquivo de configurao. Por exemplo, voc pode listar sua senha na seo [client] do arquivo .my.cnf no seu diretrio home: [client] password=sua_senha Se voc armazenar sua senha em um arquivo .my.cnf, o arquivo no pode ser lido por seu grupo ou pelos outros usurios. Tenha certeza que o modo de acesso do arquivo 400 ou 600 See Seco 4.1.2, Arquivo de Opes my.cnf. Voc pode armazenar sua senha na varivel de ambiente MYSQL_PWD, mas este mtodo deve ser considerado extremamente inseguro e no deve ser usado. Algumas verses de ps incluem uma opo para exibir o ambiente de processos em execuo; sua senha estaria em texto puro para a leitura para todos os usurios. Mesmo em sistemas sem esta verso do ps, seria imprudncia assumir que no existe outro mtodo para observar o ambiente de processos. See Apndice F, Variveis de Ambientes do MySQL.

Em resumo, os mtodos mais seguros seriam que o programa cliente solicitasse a senha ou especificar a senha em um arquivo .my.cnf corretamente protegido.

4.4.10. Usando Conexes Seguras


4.4.10.1. Conceitos Basicos
A partir da verso 4.0.0, o MySQL tem suporte a conexes cri[ptografadas com SSL. Para entender como o MySQL usa SSL, necessrio explicar alguns conceits bsicos de SSL e X509. A pessoal que j esto familiarizada com eles podem saltar esta parte. Por padro o MySQL no usa conexes criptografadas entre o cliente e o servidor. Isto significa que qualquer um pode observar todo o trfico e ver os dados enviados e recebidos. Podiase at mesmo alterar os dados enquanto eles estavam em transito entre o cliente e o servidor. Algumas vezes voc precisao mover informaes sobre redes pblicas de um modo seguro; em tais casos, usar uma conexo sem criptografia inaceitvel. SSL um protocolo que utiliza diferentes algortimos de criptografia para assegurar que os dados recebidos por uma rede pblica so confiveis. Ele tem um mecanismo para detectar qualquer alterao, perda ou reenvio de dados. SSL tambm incorpora algoritmos para reconhecer e fornecer identidades de verificao usando o padro X509. Criptografia o modo de tornar qualquer tipo de dado ilegvel. De fato, as prticas de hoje precisam de muitos elementos de segurana adicionais para algoritmos de criptografia. 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 possvel identificar algum na Internet. Ele mais comumente usado em aplicaes e-commerce. Em termos bsicos, deve haver algumas empresas (chamadas ``Autoridades de Certificao'') que atribuem certificados eletrnicos para qualquer um que precise deles. Os certificados se baseiam em algortmos de criptografia assimtricos que possuem duas chaves de criptografia (uma chave pblica e uma chave secreta). Um proprietrio de certificado pode provar a sua identidade mostrnado este certificado para outra parte. Um certificado consiste das chaves pblicas do proprietrio. Qualquer dados criptografado com esta chave pblica pode ser descriptografada apenas usando a chave secreta correspondente, que guardada pelo dono do certificado. O MySQL no utiliza conexes criptografadas por padro, porque fazendo isto tornaria o protocolo cliente/servidor muito lento. Qualquer tipo de funcionalidade adiocional exige que o conputador faa um trabalho adicional e a criptografia de dados uma operao intensiva da CPU que exige tem246

Administrao do Bancos de Dados MySQL

po e pode atrasar o MySQL nas tarefas principais. Por padro o MySQL ajustado para ser o mais rpido possvel. Se voc precisa de mais informaes sobre SSL, X509 ou criptografia, voc deve usar se mecanismo de busca favorita na Internet para procurar sobre o assunto que est interessado.

4.4.10.2. Exigncias
Para conseguir conexes seguras para trabalhar com o MySQL voc deve fazer o seguinte: 1. 2. 3. Insatale o biblioteca http://www.openssl.org/. OpenSSL. Testamos o MySQL com OpenSSL 0.9.6.

Configure o MySQL com --with-vio --with-openssl. Se voc estiver usando um instalao antiga do MySQL, voc tem que atualizar a sua tabela mysql.user com algumas novas colunas relacionadas a SSL. Isto necessrio se suas tabelas de permisses so de uma verso anterior ao MySQL 4.0.0. O procedimento est descrito em Seco 2.5.6, Atualizando a Tabela de Permisses. Voc pode verificar se um servidor mysqld em execuo suporta OpenSSL examinando se SHOW VARIABLES LIKE 'have_openssl' retorna YES.

4.

4.4.10.3. Configurando Certificados SSL para o MySQL


Aqui est um exemplo para configurar certificados SSL para o MySQL: 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 $new_certs_dir (opcional) touch $DIR/index.txt echo "01" > $DIR/serial # # Gerao do Certificate Authority(CA) # openssl req -new -x509 -keyout $PRIV/cakey.pem -out $DIR/cacert.pem \ -config $DIR/openssl.cnf # # # # # # # # # # # # # # # # # Sada 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: ----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 247

Administrao do Bancos de Dados MySQL

# # # # # #

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: Using configuration from /home/monty/openssl/openssl.cnf Generating a 1024 bit RSA private key ..++++++ ..........++++++ writing new private key to '/home/monty/openssl/server-key.pem' Enter PEM pass phrase: Verifying password - Enter PEM pass phrase: ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [AU]:FI State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:MySQL server Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:

# # Remove the passphrase from the key (optional) # openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem # # Assina o certificado do servidor # openssl ca -policy policy_anything -out $DIR/server-cert.pem \ -config $DIR/openssl.cnf -infiles $DIR/server-req.pem # # # # # # # # # # # # # # # Sada exemplo: Using configuration from /home/monty/openssl/openssl.cnf Enter PEM pass phrase: Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:'FI' organizationName :PRINTABLE:'MySQL AB' commonName :PRINTABLE:'MySQL admin' Certificate is to be certified until Sep 13 14:22:46 2003 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries 248

Administrao do Bancos de Dados MySQL

# Data Base Updated # # Create client request and key # openssl req -new -keyout $DIR/client-key.pem -out \ $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf # # # # # # # # # # # # # # # # # # # # # # # # # # # # Sada exemplo: Using configuration from /home/monty/openssl/openssl.cnf Generating a 1024 bit RSA private key .....................................++++++ .............................................++++++ writing new private key to '/home/monty/openssl/client-key.pem' Enter PEM pass phrase: Verifying password - Enter PEM pass phrase: ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [AU]:FI State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:MySQL user Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:

# # Remove a passphrase from the key (optional) # openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem # # Sign client cert # openssl ca -policy policy_anything -out $DIR/client-cert.pem \ -config $DIR/openssl.cnf -infiles $DIR/client-req.pem # # # # # # # # # # # # # # # # Sada exemplo: Using configuration from /home/monty/openssl/openssl.cnf Enter PEM pass phrase: Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:'FI' organizationName :PRINTABLE:'MySQL AB' commonName :PRINTABLE:'MySQL user' Certificate is to be certified until Sep 13 16:45:17 2003 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated

# # Create a my.cnf file that you can use to test the certificates # 249

Administrao do Bancos de Dados MySQL

cnf="" cnf="$cnf [client]" cnf="$cnf ssl-ca=$DIR/cacert.pem" cnf="$cnf ssl-cert=$DIR/client-cert.pem" cnf="$cnf ssl-key=$DIR/client-key.pem" cnf="$cnf [mysqld]" cnf="$cnf ssl-ca=$DIR/cacert.pem" cnf="$cnf ssl-cert=$DIR/server-cert.pem" cnf="$cnf ssl-key=$DIR/server-key.pem" echo $cnf | replace " " ' ' > $DIR/my.cnf # # To test MySQL mysqld --defaults-file=$DIR/my.cnf & mysql --defaults-file=$DIR/my.cnf Voc tambm pode testar sua configurao modificando o arquivo my.cnf acima para fazer referncia aos certificados de demonstrao no diretrio mysql-dist-fonte/SSL.

4.4.10.4. Opes SSL do GRANT


O MySQL pode verificar atributos do certificado X509 em adio ao esquema normal de usurio/senha. Todas as opes comuns ainda so exigidas (usurio, senha, mscara do endereo IP, noome tabela/banco de dados). Existem diferentes possibilidades para limitarmos as conexes: Sem nenhuma opo SSL ou X509, todos os tipos de conexes criptografadas/ descriptografadas so permitidas se o usurio e senha so vlidos. A opo REQUIRE SSL limita o servidor para permitir apenas conexes criptografadas SSL. Note que esta opo pode ser omitida se no houver nenhum registro ACL que permita conexes no SSL. mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost -> IDENTIFIED BY 'goodsecret' REQUIRE SSL; REQUIRE X509 significa que o cliente deve ter um certificado vlido mas no nos procupamos sobre o certificado, o emissor ou assunto exato. A nica restrio que deve ser possvel verificar a sua assinatura com um dos certificados CA. mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost -> IDENTIFIED BY 'goodsecret' REQUIRE X509; REQUIRE ISSUER 'emissor' coloca uma restrio na tentativa de conexo: O cliente deve apresentar um certificado X509 vlido emitido pelo CA 'emissor'. Usar o certificado X509 sempre implica em criptografia, assim a opo SSL desnecessria. mysql> -> -> '> GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY 'goodsecret' REQUIRE ISSUER 'C=FI, ST=Some-State, L=Helsinki, O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com';

REQUIRE SUBJECT 'assunto' exige que o cliente tenha um certificado X509 com o assunto 'assunto'. Se o cliente apresenta um certificado que valido mas tem um 'assunto' diferente, a conexo disabilitada.

250

Administrao do Bancos de Dados MySQL

mysql> -> -> '> '>

GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY 'goodsecret' REQUIRE SUBJECT 'C=EE, ST=Some-State, L=Tallinn, O=MySQL demo client certificate, CN=Tonu Samuel/Email=tonu@mysql.com';

REQUIRE CIPHER 'mtodo' necessrio para assegurar que uma criptografia forte ser usada. O SSL pode ser fraco se algoritmos antigos com chaves de criptografias curtas so usados. Usando esta opo, podemos pedir por algum mtodo de criptografia exato para permitir a conexo. mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost -> IDENTIFIED BY 'goodsecret' -> REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA'; As opes SUBJECT, ISSUER e CIPHER podem ser combinadas na clusula REQUIRE desta forma: mysql> -> -> '> '> -> '> -> GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY 'goodsecret' REQUIRE SUBJECT 'C=EE, ST=Some-State, L=Tallinn, O=MySQL demo client certificate, CN=Tonu Samuel/Email=tonu@mysql.com' AND ISSUER 'C=FI, ST=Some-State, L=Helsinki, O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA';

A partir do MySQL 4.0 a palavra chave AND opcional entre opes REQUIRE. A ordem das opes no importa, mas nenhuma opo pode ser especificada duas vezes.

4.4.10.5. Opes SSL de Linha de Comando


A seguinte tabela lista opes que so usadas para especificar o uso de SSL, arquivos de certificado e arquivos de chaves. Estas opes esto disponveis a partir do MySQL 4.0. Elas podem ser dadas na linha de comando ou no arquivo de opo. --ssl Para o servidor, especifica que o servidor permite conexes SSL. Para um programa cliente, permite que o cliente se conecte ao servidor usando SSL. Esta opo por si s no suficiente para fazer uma conexo SSL ser usada. Voc tambm deve especificar as opes --ssl-ca, -ssl-cert, e --ssl-key. Note que esta opo no exige uma conexo SSL. Por exemplo, se o servidor ou clienteest compilado sem suporte SSL, uma conexo no criptografada normal ser usada. O modo seguro de de se certificar que uma conexo SSL ser usada criar uma conta no servidor que inclua uma clusula REQUIRE SSL na instruo GRANT. Ento use esta conta para se conectar ao servidor, com um servidor e cliente que tenham suporte a SSL habilitado. Voc pode usar esta opo para indicar que a conexo no deve usar SSL. Faa isto especificando a opo como --skip-ssl ou --ssl=0. --ssl-ca=file_name O caminho para um arquivo vom uma lista de Certifcados SSL confiveis. --ssl-capath=directory_name 251

Administrao do Bancos de Dados MySQL

O caminho para um diretrio que contm certificados SSL confiveis no formato pem. --ssl-cert=file_name O nome do arquivo de certificado SSL usado para estabelecer uma conexo segura. --ssl-cipher=cipher_list Uma lista de chaves permitidas, usado para criptografia SSL. cipher_list tem o mesmo formato que o comando openssl ciphers. Example: --ssl-cipher=ALL:-AES:-EXP --ssl-key=file_name O nome do arquivo de chave SSL a ser usado para estabelecer uma conexo segura.

4.5. Preveno de Disastres e Recuperao


4.5.1. Backups dos Bancos de Dados
Como as tabelas do MySQL so armazenadas como arquivos, mais fcil realizar um backup. Para obter um backup consistente, faa um LOCK TABLES nas tabelas relevantes seguido por FLUSH TABLES para as tabelas. See Seco 6.7.5, Sintaxe LOCK TABLES e UNLOCK TABLES. See Seco 4.6.4, Sintaxe de FLUSH. Voc s precisa de um bloqueio de leitura; isto possibilita outras threads a continuarem a pesquisar nas tabelas enquanto voc copia os arquivos no diretrio do banco de dados. O FLUSH TABLE necessrio para garantir que todas as pginas ativas de ndices sero escritas em disco antes de iniciar o backup. A partir das verses 3.23.56 e 4.0.12 BACKUP TABLE no permitir que voc sobrescreva arquivos exixtentes j que isso colocaria em risco a segurana. Se voc desejar realizar um backup ao nvel da linguagem SQL de um tabela, voc pode utilizar SELECT INTO OUTFILE ou BACKUP TABLE. See Seco 6.4.1, Sintaxe SELECT.See Seco 4.5.2, Sintaxe de BACKUP TABLE. Outra maneira de efetuar um backup de um banco de dados utilizar o programa mysqldump ou o script mysqlhotcopy. See Seco 4.9.7, mysqldump, Descarregando a Estrutura de Tabelas e Dados. See Seco 4.9.8, mysqlhotcopy, Copiando Bancos de Dados e Tabelas do MySQL. 1. Fazer um backup completo do seu banco de dados: shell> mysqldump --tab=/path/to/some/dir --opt db_name ou shell> mysqlhotcopy db_name /path/to/some/dir Voc tambm pode simplesmente copiar os arquivos das tabelas (*.frm, *.MYD) e os arquivos *.MYI) quando o servidor no estiver atualizando nada. O script mysqlhotcopy utiliza este mtodo. (Mas nopte que estes mtodos no funcionaro se seu banco de dados contm tabelas InnoDB. InnoDB no armazena o contedo das tabelas em diretrios de banco de dados, e o mysqlhotcopy funciona apenas para tabelas MyISAM e ISAM.) 2. Interrompa o mysqld caso ele esteja em execuo, depois inicie-o com a opo -log-bin[=nome_arquivo]. See Seco 4.10.4, O Log Binrio. Os arquivos de log binrio fornecem a informao necessria para replicar alteraes ao banco de dados que forem 252

Administrao do Bancos de Dados MySQL

feitas depois do ponto em que voc executou mysqldump. Se o seu servidor MySQL um slave, seja qual for o mtodo de backup que voc escolha, quando voc faz backup dos dados do slave, voc deve tambm fazer backup dos arquivos master.info e relay-log.info que so necessrios para continuar a replicao depois que voc restaurar os dados do slave. Se seu slave est sujeito a replicao de comandos LOAD DATA INFILE, voc tambm deve fazer backup dos arquivos SQL_LOAD-* que podem existir no diretrio especificado pela opo slave-load-tmpdir. (A localizao padro desta opo o valor da varivel tmpdirse no especificado.) O slave precisar destes arquivos para continuar a replicao de qualquer LOAD DATA INFILE interrompido. Se voc necessita restaurar alguma coisa, tente primeiro recuperar suas tabelas utilizando REPAIR TABLE ou myisamchk -r. Isto deve funcionar em 99.9% de todos os caso, Se o myisamchk falhar, tente o seguinte procedimento: (Isto s ir funcionar se voc iniciou o MySQL com -log-update, veja Seco 4.10.4, O Log Binrio,): 1. 2. Restaure o backup original feito com o mysqldump ou backup binrio. Execute o seguinte comando para re-executar as atualizaes armazenadas no log binrio: shell> mysqlbinlog hostname-bin.[0-9]* | mysql Em seu caso voc pode querer re-executar apenas alguns log binrios, a partir de certas posis (normalmente voc quer re-executar todos os log binrios a partir da data de restaurao do backup, co exceo de algumas consultas erradas). Veja Seco 4.9.5, mysqlbinlog, Executando as Consultas a Partir de um Log Binrio fpara mais informaes sobre o utilitrio mysqlbinlog e como us-lo. Se voc estiver utilizando o log atualizado, voc pode executar o contedo do log de atualizao desta forma: shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql

O comando ls usado para obter todos os arquivos de log na ordem correta. Voc pode tambm fazer backups seletivos com SELECT * INTO OUTFILE 'nome_arquivo' FROM nome_tabela e restaurar com LOAD DATA INFILE 'nome_arquivo' REPLACE.... Para evitar registros duplicados, voc precisar de um chave PRIMARY KEY ou uma UNIQUE na tabela. A palavra chave REPLACE substitui os antigos registros com os novos quando um novo registro duplica um antigo registro em uma chave de valores nicos. Se voc tiver problemas de performance realizando backups no seu sistema, voc pode resolver isto configurando uma replicao e fazendo os backups na mquina slave no lugar da master. See Seco 4.11.1, Introduo. Se voc estiver utilizando um sistema de arquivos Veritas, voc pode fazer: 1. 2. 3. 4. 5. Executar em um cliente (perl ?) FLUSH TABLES WITH READ LOCK Bifurcar uma shell ou executar em outro cliente mount vfxs snapshot. Executar no primeiro cliente UNLOCK TABLES Copiar arquivos do snapshot Desmontar snapshot

253

Administrao do Bancos de Dados MySQL

4.5.2. Sintaxe de BACKUP TABLE


BACKUP TABLE nome_tabela[,nome_tabela...] TO '/caminho/para/diretrio/backup' Faz uma cpia de todos os arquivos de tabela para o diretrio de backup que o mnimo necessrio para restaur-lo. Atualmente s funciona para tabelas MyISAM. Para tabela MyISAM, copia os arquivos .frm (definies) e .MYD (dados). O arquivo de ndice pode ser reconstrudo a partir destes dois. Antes de utilizar este comando, por favor veja See Seco 4.5.1, Backups dos Bancos de Dados. Durante o backup, o bloqueio de leitura (read lock) ser usado para cada tabela, uma de cada vez, medida que o backup realizado. Se voc deseja fazer backup de diversas tabelas como um snapshot, voc deve primeiro usar LOCK TABLES obtendo um bloqueio de leitura para cada tabela no grupo. O comando retorna uma tabela com as seguintes colunas: Coluna Table Op Msg_type Msg_text Valor Nome da Tabela Sempre backup Um dos seguintes: status, error, info ou warning. A mensagem

Note que o comando BACKUP TABLE est disponvel somente no MySQL verso 3.23.25 e posterior.

4.5.3. Sintaxe de RESTORE TABLE


Restaura a tabela ou tabelas utilizando o backup feito com BACKUP TABLE. Tabelas existentes no sero reescritas - se voc tentar restaurar sobre uma tabela existente, obter um erro. A restaurao demora mais tempo do que o backup pois necessrio reconstruir o ndice. Quanto mais chaves tiver, mais demorado ser. Como no comando BACKUP TABLE, atualmente s funciona com tabelas MyISAM. O comando retorna uma tabela com as seguintes colunas: Coluna Table Op Msg_type Msg_text Valor Nome da Tabela Sempre restore Um dos seguintes: status, error, info ou warning A mensagem

RESTORE TABLE nome_tabela[,nome_tabela...] FROM '/caminho/para/diretrio/backup'

4.5.4. Sintaxe de CHECK TABLE


CHECK TABLE nome_tabela[,nome_tabela...] [opo [opo...]] opo = QUICK | FAST | MEDIUM | EXTENDED | CHANGED CHECK TABLE funciona somente em tabelas MyISAM. Em tabelas MyISAM a mesma coisa que executar myisamchk --medium-check nome_tabela na tabela.

254

Administrao do Bancos de Dados MySQL

Se voc no especificar nenhuma opo, MEDIUM usado. Verifica se existem erros na(s) tabela(s). Para as tabelas MyISAM as estatsticas das chaves so atualizadas. O comando retorna uma tabela com as seguintes colunas: Coluna Table Op Msg_type Msg_text Valor Nome da Tabela. Sempre check Um dos seguintes: status, error, info, or warning A mensagem

Note que a instruo pode produzir vrias linhas de informaes para cada tabela conferida. A ltima linha ir ser do tipo Msg_type status e normalmente deve estar OK. Se voc no obteve OK ou Not checked, deve ser executado, normalmente, um reparo da tabela. See Seco 4.5.6, Utilizando myisamchk para Manuteno de Tabelas e Recuperao em Caso de Falhas. Table is already up to date significa que o gerenciador de armazenamento para a tabela indica que no h necessidade de verificar a tabela. Os diferentes tipos de consistncias so as seguintes: Tipo QUICK FAST CHANGED MEDIUM Significado No busca os registros verificando ligaes incorretas. S confere tabelas que no foram fechadas corretamente. S verifica as tabelas que foram alteradas desde a ltima conferncia ou que no foram fechadas corretamente. Busca os registros para verificanado que ligaes removidas esto ok. Isto tambm calcula uma chave de conferncia para os registros e verifica isto com um checksum calculado para as chaves. Faz uma busca completa nas chaves para todas as chaves em cada registro. Isto assegura que a tabela est 100% consistente, mas pode demorar muito tempo para executar!

EXTENDED

Para tabelas MyISAM de tamanho dinmico, uma verificao iniciada sempre far uma verificao MEDIUM. Para registros de tamanho esttico ns saltamos a busca de registros para QUICK e FAST j que os registros esto raramente corrompidos. Voc pode combinar opes de consistncia como no exemplo a seguir que faz uma verificao rpida na tabela para ve se ela foi fechada corretamente: CHECK TABLE test_table FAST QUICK; NOTA: em alguns casos CHECK TABLE ir alterar a tabela! Isto acontece se a tabela estiver marcada como 'corrupted' (corrompida) ou 'not closed properly' (no foi fechada corretamente) mas o CHECK TABLE no encontrar no encontrar nenhum problema na tabela. Neste caso, CHECK TABLE ir marcar a tabela como ok. Se uma tabela estiver corrompida, prefervel que seja um problema nos ndices e no na parte de dados. Todos os tipos de consistncia acima sempre confere os ndices e deve ento encontrar a maioria dos erros. Se voc s quiser conferir uma tabela que acredita estar ok, voc no deve utilizar nenhuma opo para o comando check ou utilizar a opo QUICK. O ltimo deve ser utilizado quando voc estiver com pressa e o rsco do QUICK no encontrar um erro no arquivo de dados for mnimo (Na maioria dos casos o MySQL pode encontrar, sob utilizao normal, qualquer erro no arquivo de dados. Se isto ocorrer, ento a tabela ser marcada como 'corrupted', neste caso a tabela no poder ser utilizada at ser reparada). 255

Administrao do Bancos de Dados MySQL

FAST e CHANGED so normalmente chamados a partir de um script (um exemplo ser executado a partir do cron) Se voc desejar conferir suas tabelas de tempos em tempos. Na maioria dos casos, o FAT uma opo melhor que CHANGED. (O nico caso em que isto no acontece quando voc suspeita que encontrou um bug no cdigo do MyISAM.). EXTENDED deve ser utilizado somente depois de ter executado um check normalmente, mas continuar obtendo erros de uma tabela quando o MySQL tenta atualizar um registro ou encontrar um registro pela chave (isto seria muito difcil ocorrer caso uma conferncia normal tenha executado com sucesso!). Alguns problemas relatados por CHECK TABLE, no podem ser corrigidas automaticamente: Found row where the auto_increment column has the value 0. Isto significa que voc possui um registro na tabela onde o campo ndice que utiliza o recurso auto_increment contem o valor 0. ( possvel criar um registro onde a coluna de auto incremento seja 0 definindo explicitamente 0 em uma instruo UPDATE). Isto no exatamente um erro, mas pode causar problemas se voc decidir descarregar a tabela e restaur-la ou executar um ALTER TABLE na tabela. Neste caso a coluna de auto incremento ir alterar seu valor, de acordo com as regras das colunas de auto incremento, que pode causar problemas como um erro de chave duplicada. Para se livrar do alerta, basta executar uma instruo UPDATE para configurar a coluna para algum outro valor diferente de 0.

4.5.5. Sintaxe do REPAIR TABLE


REPAIR TABLE funciona somente em tabelas MyISAM e a mesma coisa que executar myisamchk -r nome_tabela na tabela. Normalmente voc nunca deve executar este comando, mas se um disastre ocorrer voc vai precisar recuperar seus dados de uma tabela MyISAM utilizando REPAIR TABLE. Se as suas tabelas estiverem muito corrompidas, voc deve encontrar a razo, para eleiminar a necessidade de se usar REPAIR TABLE! See Seco A.4.1, O Que Fazer Se o MySQL Continua Falhando. See Seco 7.1.3, Problemas com Tabelas MyISAM. REPAIR TABLE repara uma tabela possivelmente corrompida. O comando retorna uma tabela com as seguintes colunas: Coluna Table Op Msg_type Msg_text Valor Nome da Tabela Sempre repair Um dos seguintes: status, error, info ou warning A mensagem

REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name[,tbl_name...] [QUICK] [EXTEND

Note que a instruo pode produzir vrias linhas de informaes para cada tabela recuperada. A ultima linha ser de Msg_type status e normalmente deve exibir OK. Se o retorno no for OK, voc pode tentar reparar a tabela com myisamchk -o, j que REPAIR TABLE ainda no implementa todas as opes de myisamchk. Futuramente iremos torn-lo mais flexvel. Se o parmetro QUICK for especificado, REPAIR tenta reparar somente a rvore de ndices. Se voc utilizar EXTENTED, o MySQL criar o ndice, registro a registro em vez de criar um ndice de uma vez com ordenao; Isto pode ser melhor que a ordenao em chaves de tamanho fixo se vo256

Administrao do Bancos de Dados MySQL

c tiver grandes chaves do tipo char() que compactam muito bem. No MySQL 4.0.2, existe um modo USE_FRM para REPAIR. Use-o se o arquivo .MYI estiver faltando ou o seu cabealho estiver corrompido. Neste modo o MySQL recriar a tabela, usando a informao do arquivo .frm. Este tipo de reparo no pode ser feito com myisamchk. Aviso: Se o mysqld morre durante um REPAIR TABLE, essencial que voc faa imediatamente outro REPAIR na tabela antes de executar qualquer outro comando nela. (Claro que sempre bom inciar com um backup). No pior caso voc pode ter um novo arquivo de ndice limpo sem informao sobre o arquivo de dados e quando voc executar o prximo comando o arquivo de dados pode ser sobreescrito. Isto no um cenrio desejvel, mas possvel. Antes do MySQL 4.1.1, o comando REPAIR no era gravado no log binrio. Desde o MySQL 4.1.1. eles so escritos no log binrio a menos que a palavra chave opcional NO_WRITE_TO_BINLOG (ou seu alias LOCAL) seja usada.

4.5.6. Utilizando myisamchk para Manuteno de Tabelas e Recuperao em Caso de Falhas


A partir do MySQL verso 3.23.13 voc pode mandar verificar as tabelas MyISAM com o comando CHECK TABLE. See Seco 4.5.4, Sintaxe de CHECK TABLE. Pode-se reparar tabelas com o comando REPAIR TABLE. See Seco 4.5.5, Sintaxe do REPAIR TABLE. Para verificar/reparar tabelas MyISAM (.MYI e .MYD) voc deve utilizar o utilitrio myisamchk. Para consistir/reparar tabelas ISAM (.ISM e .ISD) voc deve usar o utilitrio isamchk. See Captulo 7, Tipos de Tabela do MySQL. No texto a seguir iremos comentar sobre o myisamchk, mas tudo tambm se aplica ao antigo isamchk. Voc pode utilizar o utilitrio myisamchk para obter informaes sobre suas tabelas de bancos de dados, verfic-las, repar-las ou otimiz-las. As seguintes sees descrevem como executar myisamchk (incluindo uma descrio de suas opes), como montar um calendrio de manuteno, e como utilizar o myisamchk para executar suas vrias funes. Voc pode, na maioria dos casos, utilizar o comando OPTIMIZE TABLES para otimizar e reparar tabelas, mas no to rpido e confivel (no caso real de erros fatais) como o mysisamchk. Por outro lado, OPTIMIZE TABLE mais fcil de usar e voc no tem que se preocupar com a recarrega das tabelas. See Seco 4.6.1, Sintaxe de OPTIMIZE TABLE. Embora os reparos realizados pelo myisamchk sejam bastante seguros, porm sempre uma boa idia fazer um backup dos dados ANTES de realizar um reparo (ou qualquer coisa que far grandes alteraes em alguma tabela)

4.5.6.1. Sintaxe do myisamchk


myisamchk chamado desta forma: shell> myisamchk [opes] nome_tabela As opes especificam o que voc deseja que o myisamchk faa. Elas so descritas abaixo. (Voc tambm pode obter a lista das opes com myisamchk --help.) Sem opes, o myisamchk simplesmente checa sua tabela. Para obter maiores informaes ou dizer ao myisamchk para tomar aes corretivas, especifique as opes descritas abaixo e nas sees seguintes. nome_tabela o nome da tabela do banco de dados que voc deseja verificar/reparar. Se voc executar o myisamchk em algum lugar diferente do diretrio do banco de dados, voc deve especificar o caminho para o arquivo, porque myisamchk no faz idia de onde seu banco de dados se encontra. Na verdade, myisamchk no se importa se os arquivos esto localizados em um diretrio de banco de dado; voc pode copiar os arquivos que correspondem a uma tabela de banco de dados em outra localizao e realizar neste outro lugar as operaes corretivas. 257

Administrao do Bancos de Dados MySQL

Voc pode nomear vrias tabelas na linha de comando do myisamchk se voc desejar. Voc tambm pode especificar um nome como um arquivo de ndice (com o sufixo .MYI), que lhe permite especificar todas tabelas em um diretrio utilizando o padro *.MYI. Por exemplo, se voc est em um diretrio de banco de dados, voc pode checar todas as tabelas no diretrio desta forma: shell> myisamchk *.MYI Se voc no estiver no diretrio do banco de dados, voc pode verificar todas as tabelas existentes especificando o caminho para o diretrio: shell> myisamchk /caminho/para/banco_de_dados/*.MYI Voc pode verificar todas as tabelas em todos os bancos de dados especificando um meta caracter com o caminho para o diretrio de banco de dados do MySQL: shell> myisamchk /caminho/para/diretrio_dados/*/*.MYI A maneira recomendada para conferir todas as tabelas rapidamente : myisamchk --silent --fast /caminho/para/diretrio_dados/*/*.MYI isamchk --silent /caminho/para/diretrio_dados/*/*.ISM Se voc quiser conferir todas as tabelas e reparar todas que estiverem corrompidas, pode utilizar linha a seguir:

myisamchk --silent --force --fast --update-state -O key_buffer=64M \ -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M \ /caminho/para/diretrio_dados/*/*.MYI isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M \ -O read_buffer=1M -O write_buffer=1M /caminho/para/diretrio_dados/*/*.I A linha acima assume que voc tem mais de 64 MB de memria livre. Perceba que se voc obter um erro do tipo: myisamchk: warning: 1 clients is using or hasn't closed the table properly Isto significa que voc est tentando verificar uma tabela que est sendo atualizada por outro programa (como o servidor mysqld) que ainda no fechou o arquivo ou que finalizou sem fechar o arquivo corretamente. Se o mysqld est em execuo, voc deve forar o sincronimo e fechamento de todas tabelas com FLUSH TABLES e assegurar que ningum mais esteja utilizando as tabelas quando for executar o myisamchk. No MySQL verso 3.23 a forma mais simples de evitar este problema utilizar CHECK TABLE no lugar de myisamchk para verificar as tabelas.

4.5.6.2. Opes Gerais do myisamchk


myisamchk suporta as seguintes opes. -# ou --debug=debug_options Sada do log de depurao. 'd:t:o,nomearquivo'. -? ou --help Exibe uma mensagem de ajuda e sai. 258 A string debug_options geralmente

Administrao do Bancos de Dados MySQL

-O nome=opo, --set-variable=nome=opo Configura o valor de uma varivel. Por favor note que as sintaxes -set-variable=nome=valor e -O name=value esto obsoletas desde o MySQL 4.0. Use --nome=valor. As variveis possveis e seus valores padres para o myisamchk podem ser examinados com myisamchk --help

Varivel key_buffer_size read_buffer_size write_buffer_size sort_buffer_size sort_key_blocks decode_bits

Valor 523264 262136 262136 2097144 16 9

sort_buffer_size utilizado quando as chaves so reparadas pela ordenao das chaves, que o caso normal quando voc utiliza --recover. key_buffer_size utilizando quando voc estiver conferindo a tabela com -extended-check ou quando as chaves so reparadas inserindo-as registro a registro na tabela (como com inserts normais). O reparo atravs de buffer de chaves (key buffer) utilizado nos seguintes casos: Se voc utilizar --safe-recover. Se os arquivos temporrios necessrios para ordenar as chaves forem maior que o dobro do tamanho de quando se criasse o arquivo de chaves diretamente. Isto o caso quando se tem chaves CHAR, VARCHAR ou TEXT tao grandes quanto necessrio pela ordenao para armazenar todas as chaves durante o processo. Se voc tiver muito espao temporrio e puder forar o myisamchk a reparar por ordenao voc pode utilizar a opo --sort-recover.

Reparao atravs do buffer de chaves (key buffer) economiza muito mais espao em disco do que utilizando ordenao, mas muito mais lenta. Se voc deseja uma reparao mais rpida, configure as variveis acima para cerca de 1/4 da sua memria disponvel. Voc pode configurar as variveis para valores altos, pois somente um dos buffers acima ser utilizado a cada vez. -s ou --silent Modo discreto ou silencioso. Escreve a sada somente quando um erro ocorre. Voc pode utilizar -s duas vezes (-ss) para deixar o mysisamchk mais silencioso. -v ou --verbose Modo prolixo. Gera mais informao de sada. Ele pode ser utilizado com -d e -e. Utilize -v mltiplas vezes -vv, -vvv) para gerar mais sada! -V ou --version Exibe a verso do myisamchk e sai. -w ou, --wait No lugar de gerar um erro se a tabela estiver bloqueada, espere at que a tabela fique livre antes de continuar. Perceba que se voc estiver utilizando mysqld na tabela com -skip-external-locking, a tabela s pode ser trancada por outro comadno myisamchk.

259

Administrao do Bancos de Dados MySQL

4.5.6.3. Opes de Verificao do myisamchk


-c ou --check Confere por erros na tabela. Esta a operao padro se voc no estiver utilizando opes que a anulam. -e ou --extend-check Verifica a tabela de forma completa (que bastante lento se voc tiver vrios ndices). Esta opo deve ser usada somente em casos extremos. Normalmente, myisamchk ou myisamchk --medium-check deve, na maioria dos casos, estar apto a encontrar quaisquer erros na tabela. Se voc estiver utilizando --extended-check e tiver muita memria, voc deve aumentar um pouco o valor de key_buffer_size! -F ou --fast Verifica apenas tabelas que no foram fechadas corretamente. -C ou --check-only-changed Verifica apenas tabelas que foram alteradas desde a ltima verificao. -f ou --force Reinicia o myisamchk com -r (reparos) na tabela, se myisamchk encontrar quaisquer erros na tabela. -i ou --information Exibe informaes e estatsticas sobre a tabela que estiver sendo verificada. -m ou --medium-check Mais rpido que extended-check, mas encontra somente 99.99% de todos os erros. Deve, entretando, ser bom o bastante para a maioria dos casos. -U ou --update-state Armazena no arquivo .MYI quando a tabela foi verificada e se a tabela falhou. Isto deve ser utilizado para obter o benefcio integral da opo --check-only-changed, mas voc no deve utilizar esta opo se o servidor mysqld esta usando a tabela e o mysqld esta sendo executado com --skip-external-locking. -T ou --read-only No marca as tabelas como verificadas. Isto til se voc utiliza o myisamchk para verificar uma tabela que esteja em uso por alguma outra aplicao que no utiliza bloqueios (como no mysqld --skip-external-locking).

4.5.6.4. Opes de Reparos do myisamchk


As seguintes opes so usadas se voc iniciar o myisamchk com -r ou -o: -B or --backup Faz um backup dos arquivos .MYD como filename-time.BAK

260

Administrao do Bancos de Dados MySQL

--correct-checksum Correct checksum information for table.

-D # ou --data-file-length=# Tamanho mximo do arquivo de dados (ao recriar arquivos de dados quando eles esto 'cheios').

-e ou --extend-check Tenta recuperar todos registros possveis do arquivo de dados. Normalmente isto ir encontrar tambm vrias linhas com lixo. No utiliza esta opo a menos que esteja em desespero total.

-f ou --force Sobrescreve antigos arquivos temporrios (nome_tabela,TMD) em vez de abortar.

-k # ou --keys-used=# Se voc estiver utilizando ISAM, diz ao manipulador de tabelas do ISAM para atualizar somente os primeiros # ndices. Se voc estiver utilizando MyISAM, informa quais chaves usar, onde cada bit seleciona uma chave (a primeira chave possui o bit 0). Isto pode ser utilizado para inseres mais rpidas! ndices desativados podem ser reativados utilizando myisamchk -r.

-l ou --no-symlinks No segue links simblicos. Normalmente o myisamchk repara a tabela para qual um link simblico aponta. Esta opo no existe no MySQL 4.0 pois o MySQL 4.0 no ir remover links simblicos durante os reparos.

-p or --parallel-recover Usa a mesma tcnica que -r e -n, mas cria todas as chaves em paralelo, em threads diferentes. A opo foi adicionada no MySQL 4.0.2. Este cdigo alfa. Use por sua conta e risco!

-r ou --recover Pode concertar quase tudo excetos chaves nicas que no so nicas (Que um erro extremamente indesejvel com tabelas ISAM/MyISAM). Se voc deseja recuperar uma tabela, esta primeira opo a ser tentada. Somente se o myisamchk relatar que a tabela no pode ser recuperada pelo -r voc deve tentar ento a opo -o. (Perceba que no caso indesejvel de -r falhar, o arquivo de dados continuar intacto.) Se voc possui muita memria, voc deve aumentar o tamanho de sort_buffer_size!

-o ou --safe-recover Utiliza um antigo mtodo de recuperao (le atravs de todos registros na ordem e atualiza todas as rvores de ndices baseado nos registros encontrados); esta opo muito mais lenta que -r, mas pode tratar vrios casos indesejveis que o -r no consegue tratar. Este mtodo de recuperao tambm utiliza muito menos espao em disco que -r. Normalmente sempre se deve tentar, primeiro, um reparo com -r, e somente se ele falhar, usar -o. Se voc possuir muita memria, voc deve aumentar o tamanho de sort_buffer_size!

-n ou --sort-recover Fora o uso de ordenao do myisamchk para resolver as chaves mesmo se os arquivos temporrios forem muito grandes.

--character-sets-dir=... Diretrio onde conjuntos de caracteres so armazenados.

--set-character-set=name 261

Administrao do Bancos de Dados MySQL

Altere o conjunto de caracteres usado pelo ndice .t ou --tmpdir=path Caminho para armazenar arquivos temporrios. Se isto no for configurado, myisamchk ir usar a varivel de ambiente TMPDIR para isto. A partir do MySQL 4.1, tmpdir pode ser configurado com uma lista de caminhos separados por dois pontos : (ponto e virgula ; no Windows). Eles sero usado da forma robin-round. -q ou --quick Reparo rpido sem modificar o arquivo de dados. Pode ser fornecido um segundo -q para forar o myisamchk para modificar o arquivo de dados original no caso de chaves duplicadas. -u ou --unpack Descompacta arquivo empacotado com o myisampack.

4.5.6.5. Outras Opes do myisamchk


Outras aes que o myisamchk pode fazer, alem de reparar e verificar tabelas: -a or --analyze Analiza a distribuio das chaves. Isto aumenta o desempenho de join habilitando o otimizador de joins para melhor escolher em qual ordem ele deve unir as tabelas e quais chaves ele deve usar: myisamchk --describe --verbose table_name' ou usar SHOW KEYS no MySQL. -d or --description Exibe alguma informao sobre tabela. -A or --set-auto-increment[=value] Fora que AUTO_INCREMENT com um valor maior ou igual a este. Se nenhum valor dado, ento define o prximo valor AUTO_INCREMENT com o maior valor usado para a chave automatica + 1. -S or --sort-index Ordene o bloco da rvore ndice do mais alto para o mais baixo. Isto otimizar as buscas e tornar a pesquisa em tabela atravs da chave mais rpida. -R or --sort-records=# Ordena o registro de acordo com um ndice. Isto faz com que seus dados estejam muito mais localizados e pode aumentar a velocidade das operaes SELECT e ORDER BY neste ndice. (Pode ser bem lento na primeira ordenao!) Para encontrar um nmero de ndices da tabela, use SHOW INDEX, que exibe os ndices de um tabela na mesma ordem que o myisamchk os v. ndices so nmeros que se iniciam com 1.

4.5.6.6. Uso de Memria do myisamchk


Alocao de memria importante quando voc executa o myisamchk. myisamchk no utiliza mais memria do que voc especifica com a opo -O. Se voc ir utilizar o myisamchk em grandes arquivos, voc deve decidir primeiro quanta memria deseja usar. O valor padro utilizar somente 3MB para correes. Utilizando valores maiores, o myisamchk pode operar mais rapidamente. Por exemplo, se voc tiver mais que 32M de memria RAM, voc pode utilizar opes tais 262

Administrao do Bancos de Dados MySQL

como esta (em adio s vrias outras que podem ser especificadas): shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ... Utilizando -O sort=16M provavelmente suficiente para a maioria dos casos. Certiffique-se que o myisamchk utiliza arquivos temporrios em TMPDIR. Se TMPDIR aponta para um sistema de arquivos em memria, voc pode facilmente obter erros de memria. Se isto acontecer, configure TMPDIR para apontar para algum diretrio com mais espao e reinicie o myisamchk. Quando reparando, o myisamchk tambm precisar de bastante espao em disco: Dobra-se o tamanho do arquivo de registros (o original e uma cpia). Este espao no necessrio se for feito um reparo com --quick, j que neste caso somente o arquivo de ndices ser recriado. Este espao necessrio no mesmo disco que se encontra o arquivo de registros original! Espao para o novo arquivo de ndice que substitui o antigo. O arquivo de ndices antigo truncando no incio, portanto, normalmente este espao ignorado. Este espao necessrio no mesmo disco que o arquivo de ndice original! Quando utilizando --recover ou --sort-recover (mas no quando usando -safe-recover, ser necessrio espao para um buffer de ordenao de: (maior_chave + tamanho_do_ponteiro_de_registro)*nmero_de_registros * 2. Voc pode conferir o tamanho das chaves e o tamanho_do_ponteiro_de_registro com myisamchk dv tabela. Este espao alocado no disco temporrio (especificado por TMPDIR ou -tmpdir=#).

Se voc tiver um problema com espao em disco durante o reparo, pode-se tentar usar -safe-recover em vez de --recover.

4.5.6.7. Uso do myisamchk para Recuperao em Caso de Falhas


Se voc executa o mysqld com a opo --skip-external-locking (que o padro em alguns sistemas, como o Linux), voc no pode utilizar com segurana o myisamchk para conferir uma tabela se o mysqld estiver utilizando a mesma tabela. Se voc pode ter certeza que ningum est acessando as tabelas atravs do mysqld enquanto voc executa o myisamchk, voc s tem que executar o mysqladmin flush-tables antes de iniciar a verificao das tabelas. Se voc no tem certeza, ento voc deve desligar o mysqld enquanto verifica as tabelas. Se voc executa o myisamchk enquanto o mysqld estiver atualizando as tabelas, voc pode obter um altera que a tabela est corrompida mesmo se no estiver. Se voc no estiver utilizando --skip-external-locking, pode usar o myisamchk para conferir as tabelas a qualquer hora. Enquanto voc faz isto, todos os clientes que tentarem atualizar a tabela iro esperar at que o myisamchk esteja pronto, antes de continuar. Se voc utilizar o myisamchk para reparar ou otimizar tabelas, voc DEVE sempre assegurar que o servidor mysqld no esteja utilizando a tabela (Isto tambm aplica se voc utiliza -skip-external-locking). Se voc no desligar o mysql, voc deve, pelo menos, fazer um mysqladmin flush-tables antes de executar o myisamchk. Suas tabelas podem estar corrompidos se o servidor e o myisamchk acessarem a tabela simultaneamente. Este captulo descreve como checar e lidar com dados corrompidos nos bancos de dados MySQL. Se suas tabelas corromperem com frequncia deve ser encontrada a razo para isto! See Seco A.4.1, O Que Fazer Se o MySQL Continua Falhando. A seo de tabelas MyISAM contm motivos do porque uma tabela pode estar corrompida. See Seco 7.1.3, Problemas com Tabelas MyISAM. Quando se realizar recuperao devido a falhas, importante entender que cada tabela no263

Administrao do Bancos de Dados MySQL

me_tabela em um banco de dados corresponde a tres arquivos no diretrio do banco de dados: Arquivo nome_tabela.frm nome_tabela.MYD nome_tabela.MYI Propsito Arquivo com definies da tabela (form) Arquivo de dados Arquivo de ndices

Cada um destes trs tipos de arquivos est sujeito a corrupo de vrias formas, mas problemas ocorrem mais frequentemente em arquivos de dados e ndices. O myisamchk trabalha criando uma cpia do arquivo de dados .MYD linha a linha. Ele termina o estgio de reparos removendo o antigo arquivo .MYD e renomeando o novo arquivo com nome original. Se for utilizada a opo --quick, myisamchk no cria um arquivo .MYD temporrio, mas assume que o arquivo .MYD est correto e somente gera um novo arquivo ndice sem mexer no arquivo de dados. Isto seguro, pois o myisamchk detecta automaticamente se o arquivo .MYD est corrompido e aborda o reparo neste caso. Voc pode tambm fornecer duas opes --quick para o myisamchk. Neste caso, o myisamchk no aborta em alguns erros (como chaves duplicadas) mas tenta resolv-los modificando o arquivo .MYD. Normalmente o uso de duas opes --quick til somente se voc tiver muito pouco espao em disco para realizer um reparo normal. Neste caso voc deve pelo menos fazer um backup antes de executar o myisamchk.

4.5.6.8. Como Verificar Erros em Tabelas


Para conferir uma tabela MyISAM, utilize os seguintes comandos: myisamchk nome_tabela Encontra 99.99% de todos os erros. O que ele no pode encontrar corrompimento que envolva SOMENTE o arquivo de dados (que no comum). Se voc desejar conferir uma tabela, voc deve executar normalmente o myisamchk sem opes ou com as opes -s ou --silent. myisamchk -m nome_tabela Encontra 99.999% de todos os erros. Ele verifica primeiramente erros em todas as entradas do ndice e ento le todos os registros. Ele calcula um checksum para todas as chaves nos registros e verifica se o checksum o mesmo que o checksum das chaves na rvore de ndices. myisamchk -e nome_tabela Realiza a verificao completa de todos os dados (-e significa ``conferncia extendida''). Ele faz uma conferncia lendo todas as chaves de cada registro para verificar se eles realmente apontam para o registro correto. Isto pode demorar MUITO tempo em uma tabela grande com vrias chaves. myisamchk normalmente ir parar depois do primeiro erro que encontrar. Se voc deseja obter mais informaes, pode adicionar a opo --verbose (-v). Isto faz o myisamchk continuar a percorrer a tabela at um mximo de 20 erros. Em utilizao normal, um simples myisamchk (sem argumentos alm do nome da tabela) suficiente. myisamchk -e -i nome_tabela Como o comando anterior, mas a opo -i diz ao myisamchk para exibir algumas informaes estatsticas tambm.

4.5.6.9. Como Reparar Tabelas


Na seo seguinte ns s falaremos do uso do myiasmchk em tabelas MyISAM (extenses .MYI e .MYD). Se voc estiver usando tabelas ISAM (extenses .ISM e .ISD), voc deve usar a ferramenta isamchk. A partir do MySQL verso 3.23.14, voc pode reparar tabelas MyISAM com o comando REPAIR 264

Administrao do Bancos de Dados MySQL

TABLE. See Seco 4.5.5, Sintaxe do REPAIR TABLE. Os sintomas de uma tabela corrompida incluem pesquisas que abortam inesperadamente e erros como estes: nome_tabela.frm is locked against change Can't find file nome_tabela.MYI (Errcode: ###) Unexpected end of file Record file is crashed Got error ### from table handler Para obter mais informaes sobre o erro voc pode executar perror ###. Aqui esto os erros mais comuns que indicam um problema com a tabela: shell> perror 126 127 132 134 135 136 141 144 145 126 = Index file is crashed / Wrong file format 127 = Record-file is crashed 132 = Old database file 134 = Record was already deleted (or record file crashed) 135 = No more room in record file 136 = No more room in index file 141 = Duplicate unique key or constraint on write or update 144 = Table is crashed and last repair failed 145 = Table was marked as crashed and should be repaired Note que o erro 135 (no mais no arquivo de registro), no um erro que pode ser corrigido por um simples reparo. Neste caso voc deve fazer: ALTER TABLE tabela MAX_ROWS=xxx AVG_ROW_LENGTH=yyy; Voc tambm pode usar esta tcnica para o erro 136 (no mais no arquivo de ndice). Em outros casos, voc deve reparar suas tabelas. myisamchk pode normalmente detectar a maioria dos problemas que ocorrem. O processo de reparo involve at quatro estgios, descritos abaixo. Antes de comear, voc deve mudar para o diretrio do banco de dados e conferir as permisses dos arquivos de tabelas. Tenha certeza que eles possam ser lidos pelo usurio do Unix com o qual mysqld executado (e para voc, porque voc precisa acessar os arquivos que est conferindo). Se no estiverem, voc precisa alterar os arquivos, eles tambm devem ter a permisso de escrita para voc. Se voc estiver utilizando o MySQL verso 3.23.16 e superior, voc pode (e deve) usar os comandos CHECK e REPAIR para conferir e corrigir tabelas MyISAM. See Seco 4.5.4, Sintaxe de CHECK TABLE. See Seco 4.5.5, Sintaxe do REPAIR TABLE. A seo do manual sobre manuteno de tabelas inclui as opes para isamchk/myisamchk. See Seco 4.5.6, Utilizando myisamchk para Manuteno de Tabelas e Recuperao em Caso de Falhas. A seguinte seo so para os casos onde o comando acima falhar ou se voc desejar usar os recursos extendidos que o isamchk e myisamchk fornecem. Se voc for reparar uma tabela da linha de comandos, deve primeiro desligar o servidor mysqld. Perceba que quando voc executa mysqladmin shutdown em um servidor remoto, o servidor mysqld ir continuar funcionando por um tempo depois do mysqladmin retornar, at que todas as queries parem e todas as chaves sejam descarregadas no disco. Estgio 1: Verificando suas tabelas 265

Administrao do Bancos de Dados MySQL

Execute myisamchk *.MYI ou myisamchk -e *.MYI se voc tiver tempo disponvel. Utilize a opo -s (silencioso) para suprimir informaes desnecessrias. Se o servidor mysqld parar, deve ser utilizada a opo --update para dizer ao myisamchk marcar a tabela como 'checada'. Voc deve reparar somente as tabelas em que o myisamchk indicar um erro. Para tais tabelas, v para o estgio 2. Se voc obter erros estranhos na verficao (como nos erros out of memory), ou se o myisamchk quebrar, v para o estgio 3. Estgio 2: Reparo simples e seguro NOTA: Se voc deseja que os reparos sejam mais rpidos, devem ser usadas as opes: -O sorf_buffer=# -O key_buffer=# (onde # seria 1/4 da memria disponvel) para todos comandos isamchk/myisamchk. Primeiro, tente usar myisamchk -r -q nome_tabela (-r -q significa ``modo de recuperao rpida''). Ele tentar reparar o arquivo de ndice sem mexer no arquivo de dados. Se o arquivo de dados estiver normal e os links apagados apontam nas localizaes corretas dentro do arquivo de dados, isto deve funcionar e a tabela ser corrigida. Inicie o reparo da prxima tabela. Outra maneira seria utilizar os seguintes procedimentos: 1. 2. 3. Faa um backup do arquivo de dados antes de continuar. Utilize myisamchk -r nome_tabela (-r significa modo de ``recuperao''). Isto remover registros incorretos e deletados do arquivo de dados e reconstroi o arquivo de ndices. Se o passo anterior falhar, utilize myisamchk --safe-recover nome_tabela. O modo de recuperao segura utiliza um metdo de recuperao antiga que trata de alguns casos que o modo de recuperao comum no consegue (porm mais lento).

Se voc obter erros estranhos no reparo (como em erros out of memory), ou se o myisamchk falhar, v para o estgio 3. Estgio 3: Reparo difcil Voc s deve atingir este estgio se o primeiro bloco de 16K do arquivo de ndice estiver destrudo ou conter informaes incorretas, ou se o arquivo de ndice no existir. Neste caso, necessrio criar um novo arquivo de ndice. Faa como a seguir: 1. 2. Mova o arquivo de dados para algum lugar seguro. Use o arquivo de descrio de tabelas para criar novos arquivos (vazios) de dados e ndices: shell> mysql> mysql> mysql> mysql nome_bd SET AUTOCOMMIT=1; TRUNCATE TABLE nome_tabela; quit

Se sua verso do MySQL no possuir TRUNCATE TABLE, utilize DELETE FROM nome_tabela. 3. Copie o antigo arquivo de dados de volta para o novo arquivo de dados criado. (No s mova o antigo arquivo de volta para o novo arquivo; voc deve uma cpia no caso de algo der errado.)

Volte ao estgio 2. myisamchk -r -q deve funcionar agora. (Isto no deve ser um loop eterno.) No MySQL 4.0.2 voc tambm pode utilizar REPAIR ... USE_FRM o qual realiza todo o proce266

Administrao do Bancos de Dados MySQL

dimento automaticamente. Estgio 4: Reparo muito difcil Voc deve atingir este estgio somente se o arquivo de descrio tambm falhar. Isto nunca deve acontecer, porque o arquivo de descrio no alterado depois da tabela ser criada: 1. Restaure o arquivo de descrio de um backup e volte ao estgio 3. Voc pode tambm restaurar o arquivo de ndice e voltar ao estgio 2. No ltimo caso, voc deve iniciar com myisamchk -r. Se voc no tem um backup mas sabe exatamente como a tabela foi criada, crie uma cpia da tabela em outro banco de dados. Remova o novo arquivo de dados, e ento mova a descrio e arquivos de ndice do outro banco de dados para o banco de dados com problemas. Isto lhe fornece um novo arquivos ndice e descrio, mas mantm o arquivo de dados da mesma forma. Volte ao estgio 2 e tente reconstruir o arquivo de ndices.

2.

4.5.6.10. Otimizao de Tabelas


Para agrupar registros fragmentados e eliminar perda de espao resultante de remoes ou atualizaes de registros, execute myisamchk no modo de recuperao: shell> myisamchk -r nome_tabela Voc pode otimizar uma tabela da mesma forma utilizando a instruo SQL OPTIMIZE TABLE. OPTIMIZE TABLE faz o reparo de tabelas, analisa chaves e tambm ordena a rvore de ndices para fazer pesquisas por chave mais rpidas. Tambm no existem possibilidade de interao no desejvel entre o utilitrio e o servidor, porque o servidor faz todo o trabalho quando voc utiliza OPTIMIZE TABLE. See Seco 4.6.1, Sintaxe de OPTIMIZE TABLE. myisamchk tambm tem um nmero de outras opo que podem ser usadas para melhorar a performance de uma tabela: -S, --sort-index -R index_num, --sort-records=index_num -a, --analyze

Para uma descrio completa da opo. See Seco 4.5.6.1, Sintaxe do myisamchk.

4.5.7. Configurando um Regime de Manuteno das Tabelas


A partir do MySQL Verso 3.23.13, voc pode conferir tabelas MyISAM com o comando CHECK TABLE. See Seco 4.5.4, Sintaxe de CHECK TABLE. Voc pode reparar tabelas com o comando REPAIR TABLE. See Seco 4.5.5, Sintaxe do REPAIR TABLE. uma boa idia verificar as tabelas regularmente em vez de esperar que ocorram problemas. Para propsitos de manuteno voc pode utilizar o myisamchk -s para verificar as tabelas. A opo -s (abreviao de --silent) faz com que o myisamchk execute em modo silencioso, exibindo mensagens somente quando ocorrem erros. tambm uma boa idia verificar as tabelas quando o servidor inicia. Por exemplo, sempre que a mquina reinicia no meio de uma atualizao, voc normalmente precisar conferir todas as tabelas que podem ter sido afetadas. (Isto uma``tabela com falhas esperadas''.) Voc pode adicionar um teste ao mysqld_safe que executa myisamchk para conferir todas tabelas que foram modificadas durante as ltimas 24 horas se existir um arquivo .pid (process ID) antigo depois do ltimo re267

Administrao do Bancos de Dados MySQL

boot. (O arquivo .pid criado pelo mysqld quando ele inicia e removido quando ele termina normalmente. A presena de um arquivo .pid durante a inicializao do sistema indica que o mysqld terminou de forma anormal.) Um teste ainda melhor seria verificar qualquer tabela cuja a data da ltima modificao mais recente que a do arquivo .pid. Voc tambm deve verificar suas tabelas regularmente durante a operao normal do sistema. Na MySQL AB, ns executamos uma tarefa agendada cron para conferir todas nossas tabelas importantes uma vez por semana utilizando uma linha com esta no arquivo crontab: 35 0 * * 0 /diretrio/do/myisamchk --fast --silent /diretrio/de/dados/*/*.MYI Isto exibe informaes sobre tabelas com falhas para que possamos examin-las e repar-las quando necessrio. Como ns no estamos tendo tabelas com falhas inesperadas (tabelas corrompidas por razes diferentes de problemas de hardware) por vrios anos (isto realmente verdade), uma vez por semana mais que suficiente para ns. Ns recomendamos que para iniciar, voc execute myisamchk -s a cada noite em todas as tabelas que foram atualizadas durantes as ltimas 24 horas, at que voc confie no MySQL como ns confiamos. Normalmente voc no precisar de tanta manuteno em suas tabelas MySQL. Se voc estiver alterando tabelas com registros de tamanho dinmico (tabelas com colunas VARCHAR, BLOB ou TEXT) ou tem tabelas com vrios registros apagados voc pode desejar de tempos em tempos (uma vez ao ms?) desfragmentar/recuperar espao das tabelas. Voc pode fazer isto utilizando OPTIMIZE TABLE nas tabelas em questo ou se voc puder desligar o servidor mysqld por um tempo faa: isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM myisamchk -r --silent --sort-index -O sort_buffer_size=16M */*.MYI

4.5.8. Obtendo Informaes sobre as Tabelas


Para obter uma descrio de uma tabela ou estatsticas sobre ela, utilize os comandos mostrados abaixo, ns explicaremos algumas das informaes em mais detalhes posteriormente: myisamchk -d nome_tabela Executa o myisamchk no ``modo descritivo'' para produzir uma descrio de sua tabela. Se voc iniciar o servidor MySQL utilizando a opo -skip-locking, myisamchk pode relatar um erro para uma tabela que est sendo atualizada enquanto executado. Entretanto, como o myisamchk no altera a tabela no modo de descrio, no existem riscos de destruio de dados. myisamchk -d -v nome_tabela Para produzir mais informaes sobre o que myisamchk est fazendo, adicione -v para solicitar a execuo em modo verbose. myisamchk -eis nome_tabela Exibe somente as informaes mais importantes de uma tabela. Ele lento porque necessrio ler a tabela inteira. myisamchk -eiv nome_tabela Isto se parece com -eis, mas lhe diz o que est sendo feito.

Exemplo da sada de myisamchk -d MyISAM file: Record format: Data records: Recordlength: company.MYI Fixed length 1403698 Deleted blocks: 226

268

Administrao do Bancos de Dados MySQL

table description: Key Start Len Index 1 2 8 unique 2 15 10 multip. 3 219 8 multip. 4 63 10 multip. 5 167 2 multip. 6 177 4 multip. 7 155 4 multip. 8 138 4 multip. 9 177 4 multip. 193 1

Type double text packed stripped double text packed stripped unsigned short unsigned long text unsigned long unsigned long text

Exemplo da sada de myisamchk -d -v : MyISAM file: company Record format: Fixed length File-version: 1 Creation time: 1999-10-30 12:12:51 Recover time: 1999-10-31 19:13:01 Status: checked Data records: 1403698 Deleted blocks: 0 Datafile parts: 1403698 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 3 Max datafile length: 3791650815 Max keyfile length: 4294967294 Recordlength: 226 table description: Key Start Len Index 1 2 8 unique 2 15 10 multip. 3 219 8 multip. 4 63 10 multip. 5 167 2 multip. 6 177 4 multip. 7 155 4 multip. 8 138 4 multip. 9 177 4 multip. 193 1 Type double text packed stripped double text packed stripped unsigned short unsigned long text unsigned long unsigned long text Rec/key 1 2 73 5 4840 1346 4995 87 178 Root Blocksize 15845376 1024 25062400 1024 40907776 1024 48097280 1024 55200768 1024 65145856 1024 75090944 1024 85036032 1024 96481280 1024

Exemplo da sada de myisamchk -eis: Checking MyISAM file: company Key: 1: Keyblocks used: 97% Key: 2: Keyblocks used: 98% Key: 3: Keyblocks used: 97% Key: 4: Keyblocks used: 99% Key: 5: Keyblocks used: 99% Key: 6: Keyblocks used: 99% Key: 7: Keyblocks used: 99% Key: 8: Keyblocks used: 99% Key: 9: Keyblocks used: 98% Total: Keyblocks used: 98% Records: 1403698 Packed: 0% Recordspace used: 100% Blocks/Record: 1.00 Record blocks: 1403698 Recorddata: 317235748 Lost space: 0 Packed: Packed: Packed: Packed: Packed: Packed: Packed: Packed: Packed: Packed: 0% 50% 0% 60% 0% 0% 0% 0% 0% 17% Max Max Max Max Max Max Max Max Max levels: levels: levels: levels: levels: levels: levels: levels: levels: 4 4 4 3 3 3 3 3 4

M.recordlength: Empty space: Delete blocks: Deleted data: Linkdata:

226 0% 0 0 0

User time 1626.51, System time 232.36 Maximum resident set size 0, Integral resident set size 0 Non physical pagefaults 0, Physical pagefaults 627, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 639, Involuntary context switches 28966 269

Administrao do Bancos de Dados MySQL

Exemplo da sada de myisamchk -eiv: Checking MyISAM file: company Data records: 1403698 Deleted blocks: - check file-size - check delete-chain block_size 1024: index 1: index 2: index 3: index 4: index 5: index 6: index 7: index 8: index 9: No recordlinks - check index reference - check data record references index: 1 Key: 1: Keyblocks used: 97% Packed: - check data record references index: 2 Key: 2: Keyblocks used: 98% Packed: - check data record references index: 3 Key: 3: Keyblocks used: 97% Packed: - check data record references index: 4 Key: 4: Keyblocks used: 99% Packed: - check data record references index: 5 Key: 5: Keyblocks used: 99% Packed: - check data record references index: 6 Key: 6: Keyblocks used: 99% Packed: - check data record references index: 7 Key: 7: Keyblocks used: 99% Packed: - check data record references index: 8 Key: 8: Keyblocks used: 99% Packed: - check data record references index: 9 Key: 9: Keyblocks used: 98% Packed: Total: Keyblocks used: 9% Packed: - check records and index references [LOTS OF ROW NUMBERS DELETED] Records: 1403698 Recordspace used: 100% Record blocks: 1403698 Recorddata: 317235748 Lost space: 0 M.recordlength: Empty space: Delete blocks: Deleted data: Linkdata: 226 0% 0 0 0 Packed: Blocks/Record: 0% 1.00 0

0% 50% 0% 60% 0% 0% 0% 0% 0% 17%

Max levels: Max levels: Max levels: Max levels: Max levels: Max levels: Max levels: Max levels: Max levels:

4 4 4 3 3 3 3 3 4

User time 1639.63, System time 251.61 Maximum resident set size 0, Integral resident set size 0 Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0 Blocks in 4 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 10604, Involuntary context switches 122798 Aqui esto os tamanhos dos arquivos de dados e ndices para a tabela utilizada nos exemplos anteriores: -rw-rw-r--rw-rw-r-1 monty 1 davida tcx tcx 317235748 Jan 12 17:30 company.MYD 96482304 Jan 12 18:35 company.MYM

Explicaes para os tipos de informaes que o myisamchk produz so fornecidas abaixo. O ``keyfile'' o arquivo de ndices. ``Registro'' e ``linha'' so sinnimos: ISAM file Nome do arquivo (ndice) ISAM. 270

Administrao do Bancos de Dados MySQL

Isam-version Verso do formato ISAM. Atualmente sempre 2. Creation time Quando o arquivo de dados foi criado. Recover time Quando foi a ltima vez que o arquivo de ndices/dados foi reconstrudo. Data records Quantos registros existem na tabela. Deleted blocks Quantos blocos apagados continuam alocando espao. Voc pode otimizar sua tabela para minimizar este espao. See Seco 4.5.6.10, Otimizao de Tabelas. Datafile: Parts Para formato de registros dinmicos, isto indica quantos blocos de dados existem. Para uma tabela otimizada sem registros fragmentados, isto o mesmo que Data records. Deleted data Quantos bytes de dados deletados no recuperados existem. Voc pode otimizar sua tabela para minimizar este espao. See Seco 4.5.6.10, Otimizao de Tabelas. Data file pointer O tamanho do ponteiro do arquivo de dados, em bytes. Ele normalmente possui 2, 3, 4 ou 5 bytes. A maioria das tabelas trabalham com 2 bytes, mas isto ainda no pode ser controlado pelo MySQL ainda. Para tabelas fixas, isto um endereo de registro. Para tabelas dinmicas, isto um endereo de byte. Keyfile pointer O tamanho de um ponteiro de arquivo de ndices, em bytes. Ele normalmente possui 1, 2 ou 3 bytes. A maioria das tabelas trabalham com 2 bytes, mas isto calculado automaticamente pelo MySQL. Ele sempre um endereo de bloco. Max datafile length Qual tamanho o arquivo de dados (arquivos .MYD) pode atingir, em bytes. Max keyfile length Qual tamanho o arquivo de ndices (.MYI pode atingir, em bytes. Recordlength Quanto espao cada registro ocupa, em bytes. Record format O formato utilizado para armazenar as linhas da tabelas. Os exemplos anteriores abaixo utilizam Fixed length (tamanho fixo). Outros valores possveis so Compressed(compactado) e Packed(empacotado). table description Uma lista de todas as chaves na tabela. Para cada chave, alguma informao de baixo nvel apresentada: Key O Nmero desta chave. Start Onde, no registro, esta parte do ndice inicia. Len Qual o tamanho desta parte do ndice. Para nmeros empacotados, isto deve sempre ser o tamanho total da coluna. Para strings, deve ser mais curto que o tamanho total da coluna indexada, porque voc pode indexar um prefixo de uma coluna string. Index unique ou multip. (multiplos). Indica se um valor pode ou no exisitir vrias vezes neste ndice. Type Que tipo de dados esta parte do ndice tem. Isto um tipo de dados ISAM com as opes packed, stripped ou empty. Root 271

Administrao do Bancos de Dados MySQL

Endereo do bloco de ndice raiz. Blocksize O tamanho de cada bloco de ndice. O tamanho padro 1024, mas o valor pode ser alterado na compilao. Rec/key Este um valor estatstico utilizado pelo otimizador. Ele diz quantos registros existem por valor para esta chave. Uma chave nica sempre tem um valor de 1. Ele pode ser atualizado depois que uma tabela carregada (ou muito alterada) com myisamchk -a. Se isto no for completamente atualizado, um valor padro de 30 fornecido. No primeiro exemplo acima, a nona chave uma chave multi partes com duas partes. Keyblocks used Qual o percentual de bloco de chaves so usados. Como a tabela usada nos exemplos foi reorganizada com myisamchk, os valores so muito altos (muito prximos do mximo terico). Packed O MySQL tenta empacotar chaves com um sufixo comum. Isto pode ser usado somente para chaves CHAR/VARCHAR/DECIMAL. Para strings grandes como nomes, isto pode reduzir significativamente o espao utilizado. No terceiro exemplo acima, a quarta chave possui 10 caracteres e uma reduo de 60% no espao obtida. Max levels Qual a profundidade da rvore-B para esta chave. Grandes tabelas com chaves longas resultam em valores altos. Records Quantos registros existem na tabela. M.recordlength A mdia de tamanho do registro. Para tabelas com registros de tamanho fixo, isto o tamanho exato do registro. Packed O MySQL corta espaos do final de strings. O valor Packed indica o percentual de economia alcanado fazendo isto. Recordspace used Qual percentual do arquivo de dados usado. Empty space Qual percetual do arquivo de dados no usado. Blocks/Record Nmero mdio de blocos por registro (isto , de quantos links um registro fragmentado composto). Sempre ser 1 para tabelas de formato fixo. Este valor deve permanecer o mais prximo possvel de 1.0. Se ele aumentar, voc pode reorganizar a tabela com myisamchk. See Seco 4.5.6.10, Otimizao de Tabelas. Recordblocks Quantos blocos (links) so utilizados. Para formatos fixos, este o mesmo que o nmero de registros. Deleteblocks Quantos blocos (links) foram excludos. Recorddata Quantos bytes no arquivo de dados so usados. Deleted data Quantos bytes no arquivo de dados foram apagados (sem uso). Lost space Se um registro atualizado para um tamanho menor, algum espao perdido. Isto a soma de todas estas perdas, em bytes. Linkdata Quando o formato de tabela dinmica utilizado, fragmentos de registros so ligados com ponteiros (4 a 7 bytes cada). Linkdata a soma do montante de armazenamento utilizado por todos estes ponteiros.

272

Administrao do Bancos de Dados MySQL

Se uma tabela foi compactada com myisampack, mysiamchk -d exibe informaes adicionais sobre cada coluna da tabela. Veja Seco 4.8.4, myisampack, O Gerador de Tabelas Compactadas de Somente Leitura do MySQL, para um exemplo desta informao e uma descrio do que ela significa.

4.6. Adiministrao do Banco de Dados e Referncia de Linguagem


4.6.1. Sintaxe de OPTIMIZE TABLE
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name[,tbl_name]... OPTIMIZE TABLE deve ser usado se voc apagou uma grande parte de uma tabela ou se voc fez vrias alteraes uma tabela com registros de tamanho varivel (tabelas que tenham campos do tipo VARCHAR, BLOB ou TEXT). Registros apagados so mantidos em uma lista de ligaes e operaes INSERT subsequentes reutilizam posies de registros antigos. Voc pode utilizar OPTIMIZE TABLE para reclamar o espao inutilizado e para desfragmentar o arquivo de dados. Na maioria da configuraes voc no tem que executar OPTIMIZE TABLE. Mesmo se voc fizer diversas atualizaes para registros de tamanhos variveis no desejvel que voc precise fazer isto mais que uma vez por ms/semana e apenas em determinadas tabelas. No momento OPTIMIZE TABLE s funciona em tabelas MyISAM e BDB. Para tabelas BDB, OPTIMIZE TABLE atualmente mapeado para ANALIZE TABLE. See Seco 4.6.2, Sintaxe de ANALYZE TABLE. Voc pode ter a otimizao de tabelas trabalhando em outros tipos de tabelas iniciando o mysqld com --skip-new ou --safe-mode, mas neste caso, OPTIMIZE TABLE mapeado apenas para ALTER TABLE. OPTIMIZE TABLE funciona da seguinte forma: Se a tabela tem registros excludos ou dividos, repara a tabela. Se as pginas de ndice no esto ordenas, ordene-as. Se as estatsticas no esto atualizadas (e o reparo no pode ser feito ordenando o ndice), atualize-as.

Perceba que a tabela estar bloqueada durante o tempo em que OPTIMIZE TABLE estiver executando. Antes do MySQL 4.1.1, o OPTIMIZE comnado no gravava no log binrio. Desde o MySQL 4.1.1 eles so escritos no log binrio a menos que a palavra chave opcional NO_WRITE_TO_BINLOG (ou se alias LOCAL) seja usada.

4.6.2. Sintaxe de ANALYZE TABLE


ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name[,tbl_name...] Analisa e armazena a distribuio de chaves para a tabela. Durante a anlise a tabela bloqueada com uma trava de leitura. Isto funciona em tabelas MyISAM e BDB. Isto seria equivalente a executar myisamchk -a na tabela. O MySQL utiliza a distribuio de chaves armazenadas para decidir em que ordem tabelas devem 273

Administrao do Bancos de Dados MySQL

ser unidas quando algum faz um join em alguma coisa diferente de uma constante. O comando retorna uma tabela com as seguintes colunas: Coluna Table Op Msg_type Msg_text Valor Nome da Tabela Sempre analyze Um dos seguintes: status, error, info ou warning A mensagem

Voc pode verificar a distribuio de chaves armazenadas com o comando SHOW INDEX. See Seco 4.6.8.1, Recuperando Informaes sobre Bancos de Dados, Tabelas, Colunas e ndices. Se a tabela no foi alterada deste o ltimo comando ANALYZE TABLE, a tabela no ser analisada novamente. Antes do MySQL 4.1.1, o ANALYZE comnado no gravava no log binrio. Desde o MySQL 4.1.1 eles so escritos no log binrio a menos que a palavra chave opcional NO_WRITE_TO_BINLOG (ou se alias LOCAL) seja usada.

4.6.3. Sintaxe de CHECKSUM TABLE


CHECKSUM TABLE tbl_name[,tbl_name ...] [ QUICK | EXTENDED ] Reports a table checksum. If QUICK is specified, live table checksum is reported, or NULL if the table does not support live checksum. This is very fast. In EXTENDED mode the whole table is read row by row and the checksum is calculated. This can be very slow for large tables. By default - with neither QUICK nor EXTENDED - MySQL returns live checksum if the table support it and scans the table otherwise. Este comando est implementado no MySQL 4.1.1.

4.6.4. Sintaxe de FLUSH


FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [,flush_option] ... Voc deve utilizar o comando FLUSH se desejar limpar algum dos caches internos que o MySQL usa. Para executar FLUSH, voc deve ter o privilgio RELOAD. opes podem ser qualquer uma das seguintes: Option HOSTS Description Esvazia as tabelas de cache de nomes de mquinas. Voc deve descarregar as tabelas de nomes de mquinas se alguma de suas mquinas receber um nmero IP diferente ou se voc obter a mensagem de erro Host ... is blocked. Quando mais de max_connect_erros erros occorrer em um registro para uma determinada mquina enquanto se conecta ao servidor MySQL, o MySQL assume que algo est errado e bloqueia futuras requisies desta mquina. A descarga na tabela de nomes de mquinas permite mquina se conectar novamente. See Seco A.2.5, Erro: Host '...' is blocked.) Voc pode iniciar o mysqld com -O max_connection_errors=999999999 para evitar esta mensagem de erro. Recarrega a chave DES do arquivo que foi especificado com a opo -des-key-file durante inicializao do servidor. Fecha e reabre todos os arquivos de log. Se voc tiver especificado o ar274

DES_KEY_FILE LOGS

Administrao do Bancos de Dados MySQL

quivo de logs de atualizaes ou um arquivo de log binrio sem uma extenso, o nmero de extenso do arquivo log ser sempre incrementado de um em relao ao arquivo anterior. Se voc usou uma extenso no nome do arquivo, o MySQL ir fechar e reabrir o arquivo de log de atualizaes. See Seco 4.10.3, O Log de Atualizaes. Isto a mesma coisa que enviar o sinal SIGHUP para o servidor mysqld. PRIVILEGES QUERY CACHE Recarrega os privilgios das tabelas de permisses no banco de dados mysql. Defragmenta a cache de consulta par utilizar melhor a sua memria. Este comando no remove qualquer consulta da cache, ao contrrio de RESET QUERY CACHE. Fecha todas as tabelas abertas e fora o fechamento de todas as tabelas em uso

TABLES

[TABLE | TABLES] Descarga somente das tabelas fornecidas. nome_tabela [,nome_tabela... ] TABLES WITH READ Fecha todas tabelas abertas e bloqueia todas tabelas para todos os bancos LOCK de dados com leitura at que algum execute UNLOCK TABLES. Isto uma maneira muito conveniente para fazer backups se voc possui um sistema de arquivos, como Veritas, que pode fazer uma imagem instantnea (snapshot) de um certo momento. STATUS USER_RESOURCES Reinicia a maioria das variveis de status para zero. Isto algo que deve ser usado somente para depurar uma consulta. Zera todos os recirsos dos usurios. Isto permitir que usurios bloqueados faam login novamente. See Seco 4.4.7, Limitando os Recursos dos Usurios.

Antes do MySQL 4.1.1, o FLUSH comnado no gravava no log binrio. Desde o MySQL 4.1.1 eles so escritos no log binrio a menos que a palavra chave opcional NO_WRITE_TO_BINLOG (ou se alias LOCAL) seja usada, ou que o comando contenha um dos argumentos: LOGS, MASTER, SLAVE, TABLES WITH READ LOCK, pois qualquer um desses argumwentos podem causar problemas se replicados para um slave. Voc pode tambm acessar cada um dos comandos vistos acima com o utilitrio mysqladmin, utilizando os comandos flush-hosts, flush-logs, reload ou flush-tables. Tambm de uma olhada no comando RESET usado com a replicao. See Seco 4.6.5, Sintaxe de RESET.

4.6.5. Sintaxe de RESET


RESET reset_option [,reset_option] ... O comando RESET usado para limpar coisas. Ele tambm atua como uma verso mais forte do comando FLUSH. See Seco 4.6.4, Sintaxe de FLUSH. Para executar RESET, voc deve ter o privilgio RELOAD. Opo MASTER Descrio Deleta todos os logs binrios listados no arquivo ndice, esvaziando o arquivo de ndice do log binrio. Anteriormente chamado FLUSH MASTER. See Seco 4.11.7, Instrues SQL para Controle do Servidor Master. Faz o slave ``esquecer'' a sua posio de replicao no log binrio do master. Anteriormente chamado FLUSH SLAVE. See Seco 4.11.8, 275

SLAVE

Administrao do Bancos de Dados MySQL

Instrues SQL para Controle do Servidor Slave. QUERY CACHE Remove todos os resulatdos de consultas da cache de consultas.

4.6.6. Sintaxe de PURGE MASTER LOGS


PURGE {MASTER|BINARY} LOGS TO nome_binlog PURGE {MASTER|BINARY} LOGS BEFORE data Este comando usado para deletar todos os logs binrios estritamente anteriores ao binlog ou data especificada. See Seco 4.11.7, Instrues SQL para Controle do Servidor Master. PURGE BINARY LOGS est disponvel como um sinnimo para PURGE MASTER LOGS a partir do MySQL 4.1.1.

4.6.7. Sintaxe de KILL


KILL thread_id Cada conexo ao mysqld executa em uma thread separada. Voc pode ver quais threas esto em execuo com o comando SHOW PROCESSLIST e matar uma thread com o comando KILL thread_id. Se voc tiver o privilgio PROCESS, voc pode ver todas as threads. Se voc tiver o privilgio SUPER, voc pode matar todas as threads. Caso contrrio, voc pode ver e matar somente suas prprias threads. Voc tambm pode usar os comandos mysqladmin processlist e mysqladmin kill para examinar e matar threads. Nota: Atualmente voc no pode utilizar KILL com a biblioteca do servidor MySQL embutido, porque o servidor embutido apenas roda dentro das threads da aplicao, ela no cria threads de conexes por si prpria. Quando voc utiliza um KILL, um sinal (flag) kill especifico configurado para a thread. Na maioria dos casos pode levar algum tempo para a thread morrer pois o sinal kill s checado em intervalos especficos. Nos loops SELECT, ORDER BY e GROUP BY, o sinal checado depois de ler um bloco de registros. Se o sinal kill est habilitado a instruo abortada. Na execuo de um ALTER TABLE o sinal kill conferido antes de cada bloco de registros ser lido da tabela original. Se o sinal kill foi habilitado, o comando abortado e a tabela temporria apagada. Ao fazer um UPDATE TABLE and DELETE TABLE, o sinal de kill conferido depois de que cada bloco lido e depois de cada atualizao ou remoo de registro. Se o sinal kill est habilitado, a instruo abortada. Note que se voc no estiver utilizando transaes, as alteraes no iro ser desfeitas! GET_LOCK() ir aborar com NULL. Uma thread INSERT DELAYED ir rapidamente descarregar todos registros que estiverem em memria e morrer. Se a thread estiver no manipulador de bloqueio de tabelas (status: Locked), o bloqueio de tabela ser abortado rapidamente.

276

Administrao do Bancos de Dados MySQL

Se a thread estiver esperando por espao livre em disco numa chamada write, a escrita abortada com uma mensagem de espao em disco insuficiente.

4.6.8. Sintaxe de SHOW


ou ou ou ou ou ou ou ou ou ou ou ou ou ou ou ou SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW DATABASES [LIKE wild] [OPEN] TABLES [FROM nome_bd] [LIKE wild] [FULL] COLUMNS FROM nome_tbl [FROM nome_bd] [LIKE wild] INDEX FROM nome_tbl [FROM nome_bd] TABLE STATUS [FROM nome_bd] [LIKE wild] STATUS [LIKE wild] VARIABLES [LIKE wild] [BDB] LOGS [FULL] PROCESSLIST GRANTS FOR user CREATE TABLE nome_tbl MASTER STATUS MASTER LOGS SLAVE STATUS WARNINGS [LIMIT row_count] ERRORS [LIMIT row_count] TABLE TYPES

SHOW fornece informaes sobre bancos de dados, tabelas, colunas ou informaes do estado do servidor. Se a parte LIKE wild usada, a string wild pode ser uma string que usa os meta caracteres % e _ do SQL.

4.6.8.1. Recuperando Informaes sobre Bancos de Dados, Tabelas, Colunas e ndices


Voc pode usar nome_bd.nome_tabela como uma alternativa para a sintaxe nome_tabela FROM nome_bd. Estas duas declaraes so equivalentes: mysql> SHOW INDEX FROM minhatabela FROM meudb; mysql> SHOW INDEX FROM meubd.minhatabela; SHOW DATABASES lista os bancos de dados no servidor MySQL. Voc tambm pode obter esta lista utilizando o comando mysqlshow. Na verso 4.0.2 voc ver apenas aqeules banco de dados para os quais voc tem algum tipo de privilgio, se voc no tiver o privilgio global SHOW DATABASES. SHOW TABLES lista as tabelas em um banco de dados especfico. Esta lista tambm pode ser obtida utilizando o comando mysqlshow nome_db. NOTA: Se um usurio no possui nenhum privilgio para uma tabela, a tabela no ser mostrada na sada de SHOW TABLES ou mysqlshow nome_db SHOW OPEN TABLES lista as tabelas que esto abertas no cache de tabelas. See Seco 5.4.7, Como o MySQL Abre e Fecha as Tabelas. O campo Comment diz quantas vezes a tabela est em cached e in_use. SHOW COLUMNS lista as colunas em uma determinada tabela. Se voc especificar a opo FULL, tambm ir obter os privilgios que voc possui para cada coluna. Se os tipos de colunas forem diferentes do que voc esperava baseando na declarao CREATE TABLE, perceba que o MySQL algumas vezes altera os tipos das colunas. See Seco 6.5.3.1, Alterao de Especificaes de Colunas. A partir do MySQL 4.1, a palavra chave FULL tambm faz com que qualquer comentrio por coluna seja mostrado. A instruo DESCRIBE fornece informao similar SHOW COLUMNS. See Seco 6.6.2, Sintaxe DESCRIBE (Obtem Informaes Sobre Colunas).

277

Administrao do Bancos de Dados MySQL

SHOW FIELDS um sinnimo para SHOW COLUMNS e SHOW KEYS um sinnimo para SHOW INDEX. Voc tambm pode listar as colunas ou ndices de uma tabela com mysqlshow nome_db nome_tabela ou mysqlshow -k nome_bd nome_tabela. SHOW INDEX retorna a informao de ndice em um formato que lembra bem a chamada SQLStatistics do ODBC. As seguintes colunas so retornadas: Coluna Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Null Index_type Comment Significado Nome da tabela. 0 se o ndice no puder conter duplicidades, 1 se puder Nome do ndice. Nmero da sequncia da coluna no ndice, partir de 1. Nome da coluna. Como a coluna ordenada no ndice. No MySQL, pode ter valores A (Ascendente) ou NULL (Not sorted). Nmero de valores nicos no ndice. Isto atualizado executando isamchk -a. Nmero de caracteres indexados se a coluna s a indexada parcialmente. NULL se a chave inteira for indexada. Contm 'YES' se a coluna puder conter NULL. Mtodo de ndice utilizado. Vrios comentrios. No momento, ele diz no MySQL < 4.0.2 se o ndice FULLTEXT ou no.

Perceba que como o Cardinality contado baseado nas estatsticas armazenadas como inteiros, ele pode no ser exato para tabelas pequenas. As colunas Null e Index_type foram adicionadas no MySQL 4.0.2.

4.6.8.2. SHOW TABLE STATUS


SHOW TABLE STATUS [FROM nome_bd] [LIKE wild] SHOW TABLE STATUS (introduzido na verso 3.23) funciona como o SHOW STATUS, mas fornece muitas informaes sobre cada tabela. Voc tambm pode obter esta lista utilizando o comando mysqlshow --status nome_bd. As seguintes colunas so retornadas: Coluna Name Type Row_format Rows Data_length Significado Nome da tabela. Tipo da tabela. See Captulo 7, Tipos de Tabela do MySQL. O formato de armazenamento do registro (Fixed (Fixo), Dynamic(dinmico), ou Compressed (Compactado)). Nmero de registros. Tamanho do arquivo de dados.

Avg_row_length Tamanho mdio do registro. Max_data_lengt Tamanho mximo do arquivo de dados. Para formatos de registro fixo, este h o nmero maimo de registros na tabela. Para formatos de registro dinmicos, este o nmero total de bytes de dados que pode ser armazenados na tabela, dado o tamanho do ponteiro de dados utilizado. Index_length Data_free Tamanho do arquivo de ndice. Nmero de bytes alocados mas no utilizados.

Auto_increment Prximo valor do auto incremento. 278

Administrao do Bancos de Dados MySQL

Create_time Update_time Collation Checksum Check_time Comment

Quando a tabela foi criada. A ltima vez que arquivo de dados foi atualizado. Conjunto de caracter e collation da tabela. (novo no 4.1.1) Valor do checksum (se existir). (novo no 4.1.1) A ltima vez que a tabela foi verificada. O Comentrio utilizado quando a tabela criada (ou alguma informao do porqu do MySQL no poder acessar a informao da tabela).

Create_options Opes extras usadas com CREATE TABLE.

Tabelas InnoDB iro relatar o espao livre no tablespace no comentrio da tabela.

4.6.8.3. SHOW STATUS


SHOW STATUS fornece informaes de status do servidor (como mysqladmin extended-status). A sada parecida com o que est exibido abaixo, apesar dos nmeros e formatos provavelmente serem diferentes: +--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | Aborted_clients | 0 | | Aborted_connects | 0 | | Bytes_received | 155372598 | | Bytes_sent | 1176560426 | | Connections | 30023 | | Created_tmp_disk_tables | 0 | | Created_tmp_tables | 8340 | | Created_tmp_files | 60 | | Delayed_insert_threads | 0 | | Delayed_writes | 0 | | Delayed_errors | 0 | | Flush_commands | 1 | | Handler_delete | 462604 | | Handler_read_first | 105881 | | Handler_read_key | 27820558 | | Handler_read_next | 390681754 | | Handler_read_prev | 6022500 | | Handler_read_rnd | 30546748 | | Handler_read_rnd_next | 246216530 | | Handler_update | 16945404 | | Handler_write | 60356676 | | Key_blocks_used | 14955 | | Key_read_requests | 96854827 | | Key_reads | 162040 | | Key_write_requests | 7589728 | | Key_writes | 3813196 | | Max_used_connections | 0 | | Not_flushed_key_blocks | 0 | | Not_flushed_delayed_rows | 0 | | Open_tables | 1 | | Open_files | 2 | | Open_streams | 0 | | Opened_tables | 44600 | | Questions | 2026873 | | Select_full_join | 0 | | Select_full_range_join | 0 | | Select_range | 99646 | | Select_range_check | 0 | | Select_scan | 30802 | | Slave_running | OFF | | Slave_open_temp_tables | 0 | | Slow_launch_threads | 0 | | Slow_queries | 0 | 279

Administrao do Bancos de Dados MySQL

| Sort_merge_passes | 30 | | Sort_range | 500 | | Sort_rows | 30296250 | | Sort_scan | 4650 | | Table_locks_immediate | 1920382 | | Table_locks_waited | 0 | | Threads_cached | 0 | | Threads_created | 30022 | | Threads_connected | 1 | | Threads_running | 1 | | Uptime | 80380 | +--------------------------+------------+ As variveis de estado listadas acima tem o seguinte significado: Varivel Aborted_clients Signficado Nmero de conexes abortadas porque o cliente morreu sem fechar a conexo corretamente. See Seco A.2.10, Erros de Comunicao / Comunicao Abortada. Nmero de tentativas que falharam ao tentar a conexo ao servidor MySQL. See Seco A.2.10, Erros de Comunicao / Comunicao Abortada. Nmero de bytes recebidos por todos os clientes. Nmero de bytes enviados para todos os clientes.. Nmero de vezes que os comandos xxx foram executados. Nmero de tentativas de conexo ao servidor MySQL.

Aborted_connects

Bytes_received Bytes_sent Com_xxxx Connections

CreaNmero de tabelas temporrias implicitas em disco criadas durante a ted_tmp_disk_tables execuo de instrues. Created_tmp_tables Created_tmp_files Delayed_insert_threads Delayed_writes Delayed_errors Flush_commands Handler_delete Handler_read_first Nmero de tabelas temporrias implicitas na memria criadas durante execues de instrues. Quantos arquivos temporrios o mysqld criou. Nmero de threads para tratamento de insertdelayed que esto em uso. Nmero de registros escritos com INSERT DELAYED. Nmero de registros escritos com INSERT DELAYED onde algum erro ocorreu (provavelmente duplicate key). Nmero de comandos FLUSH executados. Nmero de vezes que um registro foi apagado da tabela. Nmero de vezes que a primeira entrada foi lida de um ndice. Se este valor for alto, sugere que o servidor est fazendo vrias leituras de ndices, por exemplo, SELECT col1 FROM foo, assumindo que col1 indexado. Nmero de requisies para ler um registro baseado em uma chave. Se este valor for alto, uma boa indicao que suas pesquisas e tabelas esto indexadas corretamente. Nmero de requisies para ler o prximo registro na ordem da chave. Este valor ser aumentado se voc consultar uma coluna de ndice com uma faixa restrita. Ele tambm aumentar se forem feitas busca nos ndices. Nmro de requisies ao registros anterior na ordem da chave. Ele principalmente usado para otimizar ORDER BY ... DESC. Nmero de requisies para ler um registro baseado em uma posio fixa. O valor ser alto se voc estiver executando vrias pesquisas que exigem ordenao do resultado. Nmero de requises para ler o prximo registro no arquivo de da280

Handler_read_key

Handler_read_next

Handler_read_prev Handler_read_rnd

Hand-

Administrao do Bancos de Dados MySQL

ler_read_rnd_next

dos. Ser alto se voc estiver fazendo vrias buscas na tabela. Geralmente sugere que suas tabelas no esto corretamente indexadas ou que suas pesquisas no foram escritas para tirar vantagem dos ndices existentes. Nmeros de comandos ROLLBACK internos. Nmero de requisies para atualizar um registro em uma tabela. Nmero de requisies para inserir um registro em uma tabela. O nmero de blocos utilizados no cache das chaves. O nmero de requisies para ler um bloco de chaves do cache. O nmero de leituras fsicas de blocos de chaves do disco. O nmero de requisies para gravar um bloco de chaves no cache. O nmero de escritas fsicas de um bloco de chaves para o disco.

Handler_rollback Handler_update Handler_write Key_blocks_used Key_read_requests Key_reads Key_write_requests Key_writes

Max_used_connection O nmero mximo de conexes simultneas que foram usadas. s Not_flushed_key_blo Blocos de chaves no cache de chaves que foi alterado mas ainda no cks foi descarregado para o disco. Not_flushed_delayed Nmero de registros esperando para serem escritos em filas INSERT _rows DELAY. Open_tables Open_files Open_streams Opened_tables Rpl_status Select_full_join Nmero de tabelas abertas. Nmero de arquivos abertos. Nmero de fluxos abertos (usado principalmente para logs). Nmero de tabelas que foram abertas. Status de replicao segura. (Ainda no est em uso). Nmero de joins sem chaves (Se for 0, voc deve conferir com cuidado o ndice de suas tabelas).

SeNmero de joins onde foram usadas pesquisas segmentadas na tabela lect_full_range_joi de referencia. n Select_range Select_scan Select_range_check Nmero de joins onde foram usadas faixas da primeira tabela. (Normalmente no crtica mesmo se o valor estiver alto.) Nmero de joins onde fizemos uma busca completa na primeira tabela. Nmero de joins sem chaves onde o uso de chave foi conferido aps cada registro (Se for 0, o ndice de suas tabelas deve ser conferido com cuidado) Nmero de consultas enviadas para o servidor.

Questions

SlaNmero de tabelas temporrias atualmente abertas pela thread slave. ve_open_temp_tables Slave_running ON se este slave est conectado a um master. tempo do que Slow_launch_threads Nmero de threads que levaram mais slow_lauch_time para serem criadas. Slow_queries

Nmero de consultas que levaram mais tempo que long_query_time segundos. See Seco 4.10.5, O Log para Consultas Lentas. Nmero de ifuses feitas pelo algortmo de ordenao. Se este valor for alto voc deve considerar o aumento de sort_buffer. Nmero de ordenaes que foram feitas com limites. Nmero de registros ordenados. Nmero de ordenaes que foram feitas lendo a tabela. Variveis usadas por SSL; Ainda no implementado. 281

Sort_merge_passes Sort_range Sort_rows Sort_scan ssl_xxx

Administrao do Bancos de Dados MySQL

TaNmero de vezes que um travamento de tabela foi obtido de maneira ble_locks_immediate automtica. Table_locks_waited Nmero de vezes que um bloqueio de tabela no pde ser obtido imediatamente e foi preciso esperar. Se o valor for alto, e voc tiver problemas de performance, suas consultas devem ser otimizadas e depois dividir sua tabela ou tabelas ou usar replicao. Disponvel partir da verso 3.23.33 Nmero de threads no cache de threads. Nmero de conexes atuais abertas. Nmero de threads criadas para lidar com conexes. Nmero de threads que no esto dormindo. Quantos segundos o servidor est funcionando.

Threads_cached Threads_connected Threads_created Threads_running Uptime

Alguns comentrios sobre a tabela acima: Se Opened_tables for grande, provavelmente sua varivel table_cache est muito pequena. Se key_reads for grande, provavelmente sua varivel key_buffer_size provavelmente est muito pequena. O ndice de acertos do cache pode ser calculaldo com key_reads/key_read_requests. Se Handler_read_rnd for grande, provavelmente voc possui vrias consultas que exigem do MySQL fazer busca em tabelas inteiras ou voc tem joins que no utilizam chaves corretamente. Se Threads_created for grande voc pode desejar aumentar a varivel thread_cache_size. A taxa de acerto da cache pode ser calculada com Threads_created/Connections. Se Created_tmp_disk_tables for grande, voc pode querer aumentar a varivel tmp_table_size par obter tabelas temporrias em memrias em vez de tabelas em disco.

4.6.8.4. SHOW VARIABLES


SHOW [GLOBAL | SESSION] VARIABLES [LIKE wild] SHOW VARIABLES exibe os valores de algumas variveis de sistema do MySQL. As opes GLOBAL e SESSION so novas no MySQL 4.0.3. Com GLOBAL voc obter as variveis que sero utilizadas para novas conexes ao MySQL. Com SESSION voc obter os valores que esto em efeito para a conexo atual. Se voc no estiver usando nenhuma opo, SESSION ser usada. Se os valores padres no lhe servirem, voc pode configurar a maioria destas variveis usando as opes de linha de comando na inicializao do mysqld. See Seco 4.1.1, Opes de Linha de Comando do mysqld. Voc pode alterar a maioria das variveis com o comando SET. See Seco 5.5.6, Sintaxe de SET. A sada de SHOW VARIABLES se parece com o exibido abaixo, embora o formato e os nmeros possam divergir. Voc tambm pode conseguir esta informao usando o comando mysqladmin variables. +---------------------------------+------------------------------+ | Variable_name | Value | +---------------------------------+------------------------------| | back_log | 50 | 282

Administrao do Bancos de Dados MySQL

| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |

basedir bdb_cache_size bdb_log_buffer_size bdb_home bdb_max_lock bdb_logdir bdb_shared_data bdb_tmpdir bdb_version binlog_cache_size bulk_insert_buffer_size character_set character_sets concurrent_insert connect_timeout convert_character_set datadir delay_key_write delayed_insert_limit delayed_insert_timeout delayed_queue_size flush flush_time ft_boolean_syntax ft_min_word_len ft_max_word_len ft_query_expansion_limit ft_stopword_file have_bdb have_innodb have_isam have_raid have_symlink have_openssl have_query_cache init_file innodb_additional_mem_pool_size innodb_buffer_pool_size innodb_data_file_path innodb_data_home_dir innodb_file_io_threads innodb_force_recovery innodb_thread_concurrency innodb_flush_log_at_trx_commit innodb_fast_shutdown innodb_flush_method innodb_lock_wait_timeout innodb_log_arch_dir innodb_log_archive innodb_log_buffer_size innodb_log_file_size innodb_log_files_in_group innodb_log_group_home_dir innodb_mirrored_log_groups interactive_timeout join_buffer_size key_buffer_size language large_files_support local_infile locked_in_memory log log_update log_bin log_slave_updates log_slow_queries log_warnings long_query_time low_priority_updates 283

| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |

/usr/local/mysql 8388572 32768 /usr/local/mysql 10000

OFF /tmp/ Sleepycat Software: ... | 32768 | 8388608 | latin1 | latin1 big5 czech euc_kr | ON | 5 | | /usr/local/mysql/data/ | ON | 100 | 300 | 1000 | OFF | 0 | + -><()~*:""&| | 4 | 84 | 20 | (built-in) | YES | YES | YES | NO | DISABLED | YES | YES | | 1048576 | 8388608 | ibdata1:10M:autoextend | | 4 | 0 | 8 | 1 | ON | | 50 | | OFF | 1048576 | 5242880 | 2 | ./ | 1 | 28800 | 131072 | 16773120 | /usr/local/mysql/share/... | ON | ON | OFF | OFF | OFF | OFF | OFF | OFF | OFF | 10 | OFF |

| | | | | | | |

Administrao do Bancos de Dados MySQL

| lower_case_table_names | OFF | | max_allowed_packet | 1047552 | | max_binlog_cache_size | 4294967295 | | max_binlog_size | 1073741824 | | max_connections | 100 | | max_connect_errors | 10 | | max_delayed_threads | 20 | | max_heap_table_size | 16777216 | | max_join_size | 4294967295 | | max_relay_log_size | 0 | | max_sort_length | 1024 | | max_user_connections | 0 | | max_tmp_tables | 32 | | max_write_lock_count | 4294967295 | | myisam_max_extra_sort_file_size | 268435456 | | myisam_repair_threads | 1 | | myisam_max_sort_file_size | 2147483647 | | myisam_recover_options | force | | myisam_sort_buffer_size | 8388608 | | net_buffer_length | 16384 | | net_read_timeout | 30 | | net_retry_count | 10 | | net_write_timeout | 60 | | open_files_limit | 1024 | | pid_file | /usr/local/mysql/name.pid | | port | 3306 | | protocol_version | 10 | | query_cache_limit | 1048576 | | query_cache_size | 0 | | query_cache_type | ON | | read_buffer_size | 131072 | | read_rnd_buffer_size | 262144 | | rpl_recovery_rank | 0 | | safe_show_database | OFF | | server_id | 0 | | slave_net_timeout | 3600 | | skip_external_locking | ON | | skip_networking | OFF | | skip_show_database | OFF | | slow_launch_time | 2 | | socket | /tmp/mysql.sock | | sort_buffer_size | 2097116 | | sql_mode | | | table_cache | 64 | | table_type | MYISAM | | thread_cache_size | 3 | | thread_stack | 131072 | | tx_isolation | READ-COMMITTED | | timezone | EEST | | tmp_table_size | 33554432 | | tmpdir | /tmp/:/mnt/hd2/tmp/ | | version | 4.0.4-beta | | wait_timeout | 28800 | +---------------------------------+------------------------------+ Cada opo descrita abaixo. Valores para tamanhos de buffer, comprimento e tamanho de pilha so fornecidos em bytes. Voc pode especificar valores com sufixos K ou M para indicar o valor em kilobytes ou megabytes. Por exemplo, 16M indica 16 Megabytes. No importa se os sufixos esto em letras maisuculas ou minsculas; 16M e 16m so equivalentes: ansi_mode. Est ligado (ON) se o mysqld foi iniciado com --ansi. See Seco 1.8.2, Executando o MySQL no modo ANSI. back_log O nmero de requisies de conexes que o MySQL pode suportar. Isto entra em cena quando a thread principal do MySQL recebe MUITAS solicitaes de conexes em um espao curto de tempo. Eles tomam algum tempo (porm muito pouco) da a thread principal para 284

Administrao do Bancos de Dados MySQL

conferir a conexo e iniciar uma nova thread. O valor back_log indica quantas requisies podem ser empilhadas durante este breve tempo antes do MySQL parar de responder a novas requisies. Voc is precisa aument-lo se espera um nmero alto de conexes em um curto perodo de tempo Em outras palavras, este valor o tamanho da fila de escuta para novas conexes TCP/IP. Seu sistema operacional tem o prprio limite para o tamanho desta fila. A pgina do manual Unix da chamada de sistema listen(2) deve fornecer maiores detalhes. Confira a documentao do seus SO para saber o valor mximo para esta varivel. Tentativas de configurar back_log maior do que o limite de seu sistema operacional sero ineficazes. basedir O valor da opo --basedir. bdb_cache_size O buffer que alocado para o cache de ndice e registros de tabelas BDB. Se voc no utiliza tabelas BDB, deve iniciar o mysqld com a opo --skip-bdb para evitar desperdcio de memria para este cache. bdb_log_buffer_size O buffer que alocado para o cache de ndice e registros de tabelas BDB. Se voc no utiliza tabelas BDB, deve configur-la com 0 ou iniciar o mysqld com a opo --skip-bdb para evitar desperdcio de memria para este cache. bdb_home O valor para a opo --bdb-home. bdb_max_lock O nmero mximo de bloqueios (1000 por padro) que podem ser feitas em uma tabela BDB. Voc deve ser aument-la se obter erros do tipo: bdb: Lock table is out of available locks ou Got error 12 from ... quando so necessrias longas transaes ou quando o mysqld precisar examinar vrios registros para calcular a pesquisa. bdb_logdir O valor da opo --bdb-logdir. bdb_shared_data Est ligada (ON) se voc estiver utilizando --bdb-shared-data. bdb_tmpdir O valor da opo --bdb-tmpdir. binlog_cache_size. O tamanho do cache para armazenar instrues SQL para o log binrio durante uma transao. Se voc geralmente utiliza transaes grandes, multi-instrues, voc pode aumentar este valor para obter mais performance. See Seco 6.7.1, Sintaxe de START TRANSACTION, COMMIT e ROLLBACK. bulk_insert_buffer_size (era myisam_bulk_insert_tree_size) MyISAM usa uma cache especial em rvore para fazer inseres em bloco (isto , INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., e LOAD DATA INFILE) mais rpidos. Esta varivel limita o tamanho da rvore cache em bytes por thread. Defin-la com 0 desabilitar esta otimizao Nota: esta cache s usada quando adicionado dados a uma tabela no vazia. O valor padro 8 MB. character_set O conjunto de caracteres padro. character_sets Os conjuntos de caracteres suportados. concurrent_inserts Se ON (ligado, por padro), o MySQL permitir o uso de INSERT em tabelas MyISAM ao mesmo tempo em que so executadas consultas SELECT. Voc pode desligar esta opo iniciando mysqld com --safe ou --skip-new. connect_timeout O nmero de segundos que o servidor mysqld espera para um pacote de conexo antes de responder com Bad handshake. datadir O valor da opo --datadir. delay_key_write Option for MyISAM tables. Can have one of the following values: OFF All CREATE TABLE ... DELAYED_KEY_WRITE so ignora285

Administrao do Bancos de Dados MySQL

dos. ON ALL (padro) MySQL seguir a opo DELAY_KEY_WRITE para CREATE TABLE. Todas as novas tabelas abertas so tratadas como se fossem criadas com a opo DELAY_KEY_WRITE.

Se DELAY_KEY_WRITE estiver habilitado, isto siginifica que o buffer de chaves das tabelas com esta opo no sero descarregadas a cada atualizao do ndice, mas somente quando a tabela fechada. Isto ir aumentar bem a velocidade de escrita em chaves, mas voc deve adicionar verificao automtica de todas as tabelas com myisamchk --fast --force se voc us-lo. delayed_insert_limit Depois de inserir delayed_insert_limit registros, o agente que cuida de INSERT DELAYED ira conferir se exitem instrues SELECT pendentes. Se sim, ele permite a execuo destas antes de continuar. delayed_insert_timeout Quanto tempo uma thread INSERT DELAYED deve esperar por instrues INSERT antes de terminar. delayed_queue_size Qual tamanho deve ser alocado para a fila (em linhas) para lidar com INSERT DELAYED. Se a fila encher, algum cliente que executar INSERT DELAYED ir esperar at existir espao na fila novamente. flush habilitado (ON) se voc iniciar o MySQL com a opo --flush. flush_time Se esta varivel for configurada com um valor diferente de zero, ento a cada flush_time segundos todas tabelas sero fechadas (para economizar recursos e sincronizar dados com o disco). Recomendamos esta opo somente em sistemas com Win95, Win98 ou outros sistemas com poucos recursos. ft_boolean_syntax Lista de operadores suportados por MATCH ... AGAINST(... IN BOOLEAN MODE). See Seco 6.8, Pesquisa Full-text no MySQL. ft_min_word_len O tamanho mnimo da palavra a ser includa em um ndice FULLTEXT. Nota: ndices FULLTEXT devem ser reconstrudos depois de alterar esta varivel. (Esta opo nova para o MySQL 4.0.) ft_max_word_len O tamanho mximo da palavra a ser includa em um ndice FULLTEXT. Nota: ndices FULLTEXT devem ser reconstrudos depois de alterar esta varivel. (Esta opo nova para o MySQL 4.0.) ft_query_expansion_limit Nnero de correspondncias a usar para consulta de expanso (em MATCH ... AGAINST (... WITH QUERY EXPANSION). (Esta opo nova no MySQL 4.1.1) ft_max_word_len_for_sort O tamanho mximo da palavra a ser includa em um ndice FULLTEXT a ser usado no mtodo rpido de recriao do ndice em REPAIR, CREATE INDEX, ou ALTER TABLE. Palavras mais longas so inseridas de modo lento. A regra do dedo a seguinte: com ft_max_word_len_for_sort aumentando, MySQL criar arquivos temporrios maiores (tornando o processo lente, devido a E/S de disco), e colocar poucas chaves em um bloco ordenado (diminuindo a eficincia novamente). Quando ft_max_word_len_for_sort muito pequeno, MySQL ir inserir vrias palavras no ndice de modo lento, mas pequenas palavras sero inseridas muito rapidamente. ft_stopword_file O arquivo do qual se l a lista de palavras de parada para pesquisa fulltext. Todas as palavras do arquivo sero usadas; comentrios no so seguidos. Por padro, a lista j includa de palavras de parada a usada (como definido em myisam/ft_static.c). Definir este parmetro com uma string vazia ("") disabilitaa o filtro de palavras de parada. Nota: ndices FULLTEXT devem ser reconstrudos depois de alterar esta varivel. (Esta opo nova para o MySQL 4.0.) 286

Administrao do Bancos de Dados MySQL

have_innodb YES if mysqld suporta tabelas InnoDB. DISABLED se --skip-innodb usado. have_bdb YES se o mysqld suportar tabelas Berkeley DB. DISABLED se a opo -skip-bdb for usada. have_raid YES se o mysqld suportar a opo RAID. have_openssl YES se o mysqld suportar SSL (criptografia) no protocolo cliente/ servidor. init_file O nome do arquivo especificado com a opo --init-file quando voc iniciar o servidor. Este um arquivo das instrues SQL que voc deseja que o servidor execute quando iniciado. interactive_timeout O nmero de segundos que o servidor espera por atividade em uma conexo antes de fech-la. Um cliente interativo definido como um cliente que utiliza a opo CLIENT_INTERACTIVE para mysql_real_connect(). Veja tambm wait_timeout. join_buffer_size O tamanho do buffer que utilizado para full joins (joins que no utilizam ndices). O buffer alocado uma vez para cada full join entre duas tabelas. Aumente este valor para obter um full join mais rpido quando a adio de ndices no for possvel. (Normalmente a melhor forma de obter joins rpidas adicionar ndices.) key_buffer_size Blocos de ndices so buferizados e compartilhados por todas as threads. key_buffer_size o tamanho do buffer utilizado para indexar blocos. Aumente-o para lidar melhor com os ndices (para todas as leituras e escritas mltiplas) para o mximo possvel 64M em uma mquina com 256M que executa, principalmente, o MySQL bastante comum. Entretanto, se voc deixar este valor muito grande (mais que 50% da sua memria total?) seu sistema pode iniciar a paginar e se tornar MUITO lento. Lembre-se que como o MySQL no utiliza cache de leitura de dados, ser necessrio deixar algum espao para o cache do sistema de arquivos para o Sistema Operacional. Voc pode verificar a performance do buffer de chaves executando SHOW STATUS e examinar as variveis Key_read_requests, Key_reads, Key_write_requests e Key_writes. A razo de Key_reads/Key_read_request deve normalmente ser < 0.01. O Key_write/Key_write_requests normalmnte prximo de 1 se voc estiver utilizando na maioria updates/deletes mas deve ser bem menor se voc tender a fazer atualizaes que afetam vrias outras ao mesmo tempo ou se voc estiver utilizando DELAY_KEY_WRITE. See Seco 4.6.8, Sintaxe de SHOW. Para obter ainda mais velocidade quando estiver gravando vrios registros ao mesmo tempo, utilize LOCK TABLES. See Seco 6.7.5, Sintaxe LOCK TABLES e UNLOCK TABLES.

language A linguagem utilizada para mensagens de erro. large_file_support Se o mysqld foi compilado com opes para suporte a grandes arquivos. locked_in_memory Se o mysqld foi travado na memria com --memlock log Se o log de todas as consultas est habilitado. log_update Se o log de atualizaes est habilitado. log_bin Se o log binrios est habilitado. log_slave_updates Se as atualizaes do slave devem ser logadas. long_query_time Se uma consulta demorar mais que isto (em segundos), o contador Slow_queries ser incrementado. Se voc estiver utilizando --log-slow-queries, a consulta ser logada ao arquivo de consultas lentas. See Seco 4.10.5, O Log para Consultas Lentas. Este valor medido em tempo real, no em tempo de CPU, assim uma consulta que pode estar pode estar abaixo do limiar de um sistema de carga leve pode estar acima do limiar de 287

Administrao do Bancos de Dados MySQL

um sistema de carga pesada. See Seco 4.10.5, O Log para Consultas Lentas. lower_case_nome_tabelas Se estiver configurado para 1, nomes de tabelas so armazenados em letras minsculas no disco e nomes de tabelas sero caso-insensitivo. Na verso .0.2, esta opo tambm se aplica aos nomes de banco de dados. Na verso 4.1.1 esta opo tambm se aplcia a alias de tabelas. See Seco 6.1.3, Caso Sensitivo nos Nomes. max_allowed_packet O valor mximo de um pacote. O buffer de mensagens iniciado por net_buffer_length bytes, mas pode crescer at max_allowed_packet bytes quando for necessrio. Este valor por padro pequeno, para obter pacotes maiores (possivelmente errados). Voc deve incrementar este valor se voc estiver usando colunas BLOB grandes. Ele deve to grande quanto o maior BLOB que voc deseja utilizar. O protocol atual limita o max_allowed_packet 16M no MySQL 3.23 e 1G no MySQL 4.0. max_binlog_cache_size Se uma transao multi-instrues necessitar de mais que este montante de memria, ser obtido o erro "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage" ("Transao multi-instrues necessita mais que 'max_binlog_cache_size' bytes de armazenamento"). max_binlog_size Disponvel a partir da 3.23.33. Se uma escrita ao log binrio (replicao) exceder o valor fornecido, rotacione os logs. Voc no pode configur-lo para menos de 4096 bytes (1024 na verso do MySQL anteriores a 4.0.14), ou mais que 1 GB. O valor padro 1 GB. Nota se voc estiver usando transaes: uma transao escrita em um bloco no arquivo de log binrio, j que ele nunca separado entre diversos logs binrios. Desta forma, se voc tiver grandes transaes, voc pode ter logs binrios maioores que max_binlog_size. Se max_relay_log_size (disponvel a partir do MySQL 4.0.14) 0, ento max_binlog_size se aplicar bem aos relay logs. max_connections O Nmero de clientes simultneos permitidos. Aumentar este valor aumenta o nmero de descritores de arquivos que o mysqld necessita. Veja abaixo os comentrios sobre os limites de descritores de arquivos. See Seco A.2.6, Erro: Too many connections. max_connect_errors Se houver mais que este nmero de conexes interrompidas a partir de uma mquina est mquina ter as prximas conexes bloqueadas. Voc pode desbloquar uma mquina com o comadno FLUSH HOSTS. max_delayed_threads No inicie mais do que este nmero de threads para lidar com instrues INSERT DELAYED. Se voc tentar inserir dados em uma nova tabela depois que todas as threads INSERT DELAYED estiverem em uso, o registro ser inserido como se o atributo DELAYED no fosse especificado. Se voc configur-lo com 0, o MySQL nunca criar uma thread max_delayed. max_heap_table_size Esta varivel define o tamanho mximo que uma tabela HEAP criada pode ter. O valor da varivel usado para calcular um valor MAX_ROWS da tabela HEAP. A definio desta varivel no tem nenhum efeito sobre qualquet tabela HEAP existente, a memos que a tabela seja recriada com uma instruo como CREATE TABLE ou TRUNCATE TABLE, ou alterada com ALTER TABLE. max_join_size Joins que provavelmente forem ler mais que max_join_size registros retornam um erro. Configure este valor se os seus usurios tendem a realizar joins que no possuem uma clusula WHERE, que tomam muito tempo, e retornam milhes de registros. max_relay_log_size Disponvel a partir da verso 4.0.14. Se uma escrita ao relay log (um tipo de log usado por slaves de replicao, see Seco 4.11.3, Detalhes de Implementao da Replicao) exceder o valor dado, rotacione o relay log. Esta varivel lhe permite colocar diferentes restries de tamanho no relay logs e logs binrios. No entanto, configurar a varivel com 0 far o MySQL usar max_binlog_size tanto para o log binrio quanto para o relay logs. Voc tem que configurar max_relay_log_size com 0 ou mais de 4096, e menos que 1 GB. O padro 0. max_seeks_for_key Limite do nmero mximo de buscas ao procurar linhas com base em uma chave. O otimizador MySQL assumir que quando pesquisar por linhas correspondentes em 288

Administrao do Bancos de Dados MySQL

uma tabela atravs da varredura da chave, no faremos mais que este nmero de busca de chave independente da cardinalidade da chave. Configurando este parmetro com um valor baixo (100 ?) voc pode forar o MySQL a preferir chaves em vez de varrer a tabela. max_sort_length O nmero de bytes utilizados para ordenar valores BLOB ou TEXT (somente os primeiros max_sort_lenght bytes de cada valor so usados; o resto ignorado). max_user_connections O valor mximo de conexes ativas para um nico usurio (0 = sem limite). max_tmp_tables (Esta opo ainda no faz nada.) Nmero mximo de tabelas temporrias que um cliente pode manter abertas ao mesmo tempo. max_write_lock_count Depois desta quantidade de bloqueios de escrita, permite que alguns bloqueios de leitura sejam executados. myisam_recover_options O valor da opo --myisam-recover. myisam_sort_buffer_size O buffer que alocado ao ordenar o ndice quando estiver fazendo um REPAIR ou estiver criando ndices com CREATE INDEX ou ALTER TABLE. myisam_max_extra_sort_file_size. Se a criao do arquivo temporrio para criao rpida de ndices fosse este valor maior que quando for usado o cache de chaves, de preferncia ao mtodo de cache de chaves. Isto usado principalmente para forar que longas chaves de caracteres em tabelas grandes usem o mtodo de cache de chaves mais lenta para criar o ndice. NOTE que este parmetro fornecido em megabytes! myisam_repair_threads. Se este valor maior que um, durante o processo reparo por ordenao os ndices de tabels MyISAM sero criados em paralelo - cada ndice em sua prpria thread. Nota reparos com multi-threads est ainda sob cdigo de qualidade alpha. myisam_max_sort_file_size O tamanho mximo do arquivo temporrio que permitido ao MySQL usar enquanto recria os ndices (durante REPAIR, ALTER TABLE ou LOAD DATA INFILE). Se o tamanho do arquivo for maior que isto, o ndice ser criado atravs do cache de chaves (que mais lento). NOTE que este parmetro fornecido em megabytes antes da verso 4.0.3 e em bytes a partir desta verso. net_buffer_length O buffer de comunicaes configurado para este tamanho entre queries. Isto no deve ser alterado normalmente, mas se voc tem muito pouca memria, pode configur-lo para o tamanho esperado de uma consulta. (Isto , o tamanho experado das instrues SQL enviadas pelos clientes. Se as instrues excederem este valor, o buffer aumentado automaticamente, at max_allowed_packet bytes.) net_read_timeout Nmero de segundos para esperar por mais dados de uma conexo antes de abortar a leitura. Perceba que quando ns no esperamos dados de uma conexo, o tempo mximo de espera definido pelo write_timeout. Veja tambm slave_read_timeout. net_retry_count Se uma leitura na porta de comunicaes for interrompida, tente novamente net_retry_count vezes antes de parar. Este valor deve ser bem alto no FreeBSD j que interrupes internas so enviadas para todas as threads. net_write_timeout Nmero de segundos para esperar pela escrita de um bloco em uma conexo antes de abortar a escrita. open_files_limit Nmero de arquivos que o sistema permite que o mysqld abra. Este o valor real dado para o sistema e pode ser diferente do valor que voc passa ao mysqld como parmetro de inicializao. Ele 0 em sistemas onde o MySQL no pode alterar o nmero de arquivos abertos. pid_file O valor da opo --pid-file. port O valor da opcao --port. 289

Administrao do Bancos de Dados MySQL

protocol_version A verso do protocolo usada pelo servidor MySQL. range_alloc_block_size Tamanho dos blocos que so alocados ao se fazer uma otimizao da faixa. read_buffer_size (era record_buffer) Cada thread que faz uma leitura sequencial aloca um buffer deste tamanho para cada tabela lida. Se voc fizer vrias leituras sequenciais, voc pode desejar aumentar este valor. read_rnd_buffer_ae (era record_rnd_buffer) Ao ler registros na ordem depois de uma ordenao, os registros so lidos atravs deste buffer para evitar pesquisas em disco. Pode melhorar bastante o ORDER BY se configurado com um valor alto. Como esta uma varivel especfica da thread, no se pode defin-la globalmente, mas apenas alter-la ao executar alguma consulta especfica grande. query_alloc_block_size Tamanho dos blocos de alocao de memria que so alocados para objetos criados durante a anlise e execuo da consulta. Se voc tiver problemas com fragmentao de memria ele pode ajudar a aumentar isto um pouco. query_cache_limit No armazena resultados que so maiores que esta varivel. (Padro 1M). query_cache_size A memria alocada para armazenar resultados de consultas antigas. Se 0, a cache de consulta desabilitada (padrot). query_cache_type Pode ser configurado com (somente numrico) Alias OFF ON DEMAND Comentrio No armazena ou recupera resultados Armazena todos os SQL_NO_CACHE .... resultados exceto consultas SELECT

Valor 0 1 2

Armazena apenas consultas SELECT SQL_CACHE ....

query_prealloc_size Buffer persistente para anlise e execuo da consulta. No liberado entre consultas. Em teoria, tornando-o ``grande o suficiente'' voc pode fazer o MySQL executar consultas sem ter que fazer uma nica chamada malloc. safe_show_database No exibe bancos de dados nos quais o usurio no tem nenhum privilgios. Isto pode melhorar a segurana se voc se preocupa com o fato das pessoas estarem aptas a ver quais bancos de dados outros usurios possuem. Veja tambm skip_show_databases. server_id O valor da opo --server-id. skip_locking Est desligado (OFF) se o mysqld usar bloqueio externo. skip_networking Est ligado (ON) se somente permitimos conexes locais (socket). skip_show_databases Isto previne usurios de fazerem SHOW DATABASES se eles no possuirem o privilgio PROCESS_PRIV. Isto pode aumentar a segurana se voc se preocupa com o fato das pessoas poderem ver quais bancos de dados outros usurios possuem. Veja tambm safe_show_databases. slave_net_timeout Nmero de segundos para esperar por mais dados de uma conexo de master/slave antes de abortar a leitura. slow_launch_time Se a criao de threads demorar mais que este valor (em segundos), o contador Slow_launch_threads ser incrementado. socket O socket Unix utilizado pelo servidor.

290

Administrao do Bancos de Dados MySQL

sort_buffer Cada thread que precisar fazer uma ordenao aloca um buffer deste tamanho. Aumente este valor para operaes ORDER BY ou GROUP BY mais rpidas. See Seco A.4.4, Onde o MySQL Armazena Arquivos Temporrios. table_cache O nmero de tabelas abertas para todas as threads. Aumentar este valor aumenta o nmero de descritores de arquivos que o mysql necessita. O MySQL precisa de dois descritores de arquivos para cada tabela nica aberta. Veja abaixo os comentarios sobre os limites do descritor de arquivos. Voc pode conferir se necessita aumentar o cache de tabela conferindo a varivel Opened_tables. See Seco 4.6.8.3, SHOW STATUS. Se esta varivel for grande e voc no faz muitos FLUSH TABLES (que apenas fora todas as tabelas a serem fechadas e reabertas), ento voc deve aumentar o valor desta varivel. Para informaes sobre como o cache de tabelas funciona, veja Seco 5.4.7, Como o MySQL Abre e Fecha as Tabelas.

table_type O tipo padro de tabelas. thread_cache_size Quantas threads devem ser mantidas em cache para reutilizao. Quando um cliente desconecta, as threads dos clientes so colocadas no cache se no existir mais de thread_cache_size threads que antes. Todas novas threads sero obtidas primeiramente do cache, e s quando o cache estiver vazio uma nova thread criada. Esta varivel pode ser aumentada para melhorar a performance se voc tiver vrias conexes novas. (Normalmente isto no d uma melhora de performance notvel se voc possuir uma boa implementao de threads.) Examinando as diferenas entre Connections e Threads_create (see Seco 4.6.8.3, SHOW STATUS para maiores detalhes) pode ser visto o quo eficente o cache de threads atual. thread_concurrency No Solaris, mysqld ir chamar thr_setconcurrency() com este valor. thdr_setconcurrency() permite que a aplicao fornea ao sistema de threads uma dica com o nmero desejado de threads que devem ser executados ao mesmo tempo. thread_stack O tamanho da pilha para cada thread. Vrios dos limites detectados pelo teste crash-me so dependentes deste valor. O padro grande o suficiente para operaes normais. See Seco 5.1.4, O Pacote de Benchmark do MySQL. timezone O fuzo horrio para este servidor. tmp_table_size Se uma tabela temporria em memria exceder este tamanho, o MySQL ir a convert-la automaticamente para uma tabela MyISAM em disco. Aumente o valor de tmp_table_size se voc fizer vrias consultas GROUP BY avanadas e voc tiver muita memria. tmpdir O diretrio utilizado para arquivos temporrios e tabelas temporrias. A partir do MySQL 4.1, ele pode ser definido com uma lista de caminhos separados por dois pontos (:) (ponto e vrgula (; no Windows). Eles sero usados de modo robin-round. Este recurso pode ser usado para dividir a craga entre diversos discos fsicos. transaction_alloc_block_size Tamanho dos blocos de alocao de memria que so alocados para consultas de armazenamento que so parte de uma transao que est para ser armazenada no log binrio ao se fazer um commit. transaction_prealloc_block_size Buffer persistente para transaction_alloc_blocks que no liberado entre as consultas. Tornando-o ``grande o suficiente'' para caber todas as consulta em uma transao comum voc pode evitar muitas chamadas malloc. version O nmero da verso do servidor. wait_timeout O nmero de segundos que o servidor espera pela atividade em uma conexo antes de fech-la. Veja tambm interactive_timeout. Na inicializao da thread, SESSION.WAIT_TIMEOUT inicializado por GLOBAL.WAIT_TIMEOUT ou GLOBAL.INTERACTIVE_TIMEOUT dependendo do tipo do clien291

Administrao do Bancos de Dados MySQL

te (como definido pela opo de conexo CLIENT_INTERACTIVE). Veja tambm interactive_timeout. A seo do manual que descreve o ajuste do MySQL contm algumas informaes de como sintonizar as variveis acima. See Seco 5.5.2, Parmetros de Sintonia do Servidor.

4.6.8.5. SHOW [BDB] LOGS


SHOW LOGS exibe estatsticas sobre os arquivos log existentes. Atualmente ele s exibe informaes sobre arquivos de log Berkeley DB, assim um alias para ele (disponvel a partir do MySQL 4.1.1) SHOW BDB LOGS. File exibe o caminho completo para o arquivo de log Type exibe o tipo do arquivo log (BDB para arquivos de log Berkeley DB). Status exibe o status do arquivo log (FREE se o arquivo pode ser removido, ou IN USE se o arquivo necessrio para o subsistema de transaes)

4.6.8.6. SHOW PROCESSLIST


SHOW [FULL] PROCESSLIST exibe quais threads esto em execuo. Esta informao tambm pode ser obtida com o comando mysqladmin processlist. Se voc possuir o privilgio SUPER, poder ver todas as threads. Seno s possvel ver as prprias threads. See Seco 4.6.7, Sintaxe de KILL. Se voc no utiliza a opo FULL, ento somente os primeiros 100 caracteres de cada query serio exibidos. A partir da verso 4.0.12, o MySQL informa o nome de maquina para conexes TCP/IP no formato nome_maquina:client_port para tornar mais fcil de se encontrar qual cliente est fazendo o que. Este comando muito til caso voc obtenha a mensagem de erro 'too many connections' e deseja saber o que est ocorrendo. O MySQL reserva uma conexo extra por cliente com o privilgio SUPER para garantir que voc sempre consiga logar e conferir o sistema (assumindo que este privilgio no foi concedido para todos os usurios). Alguns estados normalmente vistos em mysqladmin processlist Checking table A thread est realizando verificao [automtica] da tabela. Closing tables Signiifica que a thread est descarregando os dados alterados na tabela para o disco e fechando as tabelas usadas. Isto deve ser uma operao rpida. Se no, voc deve verificar se o seu disco no est cheio ou que o disco no est com sobrecarga. Connect Out Slave est conectando ao master. Copying to tmp table on disk O resultado temporrio foi maior que tmp_table_size e a thread agora est alterando a tabela temporria na memria para o disco para economizar memria. Creating tmp table A thread est criando uma tabela temporria para guardar uma parte do resultado para a consulta. deleting from main table Ao executar a primeira parte de um delete multi-tabela e estamos deletando apenas da primeira tabela. deleting from reference tables Ao executar a segunda parte de um delete multitabela e estamos deletando o registros correspondentes em outras tabelas.

292

Administrao do Bancos de Dados MySQL

Flushing tables A thread est executando FLUSH TABLES e est esperando que todas as threads fechem as suas tabelas. Killed Algum enviou um sinal para matar a thread e ela deve abortar a prxima vez que ele verificar o parmetro kill. O parmetro verificado em cada loop maior no MySQL, mas em alguns casos ainda pode levar um tempo curto para a thread morrer. Se a thread est bloqueada par outra thread, a finalizao ter efeito assim que as outras threads liberarem o bloqueio. Sending data A thread est processando registros para uma instruo SELECT e tambm est enviando dados ao cliente. Sorting for group A thread est fazendo uma ordenao para satisfazer a um GROUP BY. Sorting for order A thread est fazendo uma ordenao para satisfazer a um ORDER BY. Opening tables Isto simplesmente significa que a thread est tentando abrir uma tabela. Este deve ser um procedimento muito rpido, a menos que algo previna da abertura. Por exemplo um ALTER TABLE ou um LOCK TABLE pode prvenir a abertura de uma tabela at que o comando esteja finalizado. Removing duplicates A consulta estava usando SELECT DISTINCT de tal modo que o MySQL no podia otimizar o distinct em um estagio anterior. Por isto o MySQL fez um estgio extra para remover todos os registros duplicados antes de enviar o resultado ao cliente. Reopen table A thread obteve um lock para a tabela, mas notificou aps o lock que a estrutura da tabela alterou. Ela liberou o lock, fechou a tabela e agora est tentando reabr-la. Repair by sorting O cdigo de reparao est utilizando ordenamento para recriar os ndices. Repair with keycache O cdigo de reparao est usando a criao de chaves uma a uma atravs da cache de chaves. Isto muito mais lento que Repair by sorting. Searching rows for update A thread esta fazendo uma primeira fase pra encontrar todos os registros coincidentes antes de atualiz-los. Isto deve ser feito se o UPDATE est alterando o ndice usado para encontrar os registros envolvidos. Sleeping A thread est esperando que o cliente envie um novo comando a ela. System lock A thread est esperando um lock de sistema externo para a tabela. Se voc no est usando mltiplos servidores mysqld que esto acessando a mesma tabela, voc pode desabilitar o lock de sistema com a opo --skip-external-locking. Upgrading lock O manipulador de INSERT DELAYED est tentando obter um lock para inserir registros na tabela. Updating A thread est procurando por registros para atualiz-los. User Lock A thread est esperando um GET_LOCK(). Waiting for tables A thread recebeu uma notificao que a estrutura de uma tabela foi alterada e ela precisa reabrir a tabela para receber a nova estrutura. Para poder reabrir a tabela ela deve esperar at que todas a outras threads tenham fechado a tabela em questo. A notificao acontece se outra thread usou FLUSH TABLES ou um dos seguintes comando na tabela em questo: FLUSH TABLES nome_tabela, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE ou OPTIMIZE TABLE.

waiting for handler insert O manipulador do INSERT DELAYED processou todas as inseres e est esperado por outras.

293

Administrao do Bancos de Dados MySQL

A maioria dos estados so operaes muito rpidas. Se a thread permanecer em qualquer destes estados por muitos segundos, pode haver um problema que precisa ser investigado. Existem outros estados que no so mencionados anteriormente, mas a maioia deles s so teis para encontrar erros no mysqld.

4.6.8.7. SHOW GRANTS


SHOW GRANTS FOR usurio lista os comandos concedidos que devem ser usados para duplicar os direitos de um usurio. mysql> SHOW GRANTS FOR root@localhost; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+ Para listar as permisses da sesso atual pode-se usar a funo CURRENT_USER() (nova na verso 4.0.6) para descobrir com qual usurio a sesso foi autenticada. See Seco 6.3.6.2, Funes Diversas.

4.6.8.8. SHOW CREATE TABLE


Exibe uma instruo CREATE TABLE que ir criar a seguinte tabela: mysql> SHOW CREATE TABLE t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE t ( id INT(11) default NULL auto_increment, s char(60) default NULL, PRIMARY KEY (id) ) TYPE=MyISAM

SHOW CREATE TABLE cita os nomes de colunas e tabelas de acordo com o valor da opo SQL_QUOTE_SHOW_CREATE. Seco 5.5.6, Sintaxe de SET.

4.6.8.9. SHOW WARNINGS | ERRORS


SHOW WARNINGS [LIMIT row_count] SHOW ERRORS [LIMIT row_count] Este comando implementado no MySQL 4.1.0. Ele mostra os erros,a visos e notas recebidos para o ltimo comando. Os erros/avisos so reiniciados para cada comando que utiliza uma tabela. O servidor MySQL envia de volta o nmero total de avisos e erros que voc recebe para o ltimo comando; Isto pode ser retornado chamando mysql_warning_count(). At as mensagens max_error_count so armazenadas (variveis global e especficas da thread). Voc pode recuperar o nmero de erros de @error_count e avisos de @warning_count. SHOW WARNINGS mostra todos os erros, avisos e notas que voc recebeu para o ltimo comando enquanto SHOW ERRORS lhe mostra apenas o erro. mysql> DROP TABLE IF EXISTS no_such_table; mysql> SHOW WARNINGS; 294

Administrao do Bancos de Dados MySQL

+-------+------+-------------------------------+ | Level | Code | Message | +-------+------+-------------------------------+ | Note | 1051 | Unknown table 'no_such_table' | +-------+------+-------------------------------+ Note que no MySQL 4.1.0 apenas adicionamos a estrutura para avisos e poucos comandos MySQL ainda geraram avisos. A verso 4.1.1 suporta todos os tipos de avisos para LOAD DATA INFILE e instrues DML tais como os comandos INSERT, UPDATE e ALTER. Por exemplo, aqui est um caso simple que produz avisos de converso para instrues de insero. mysql> create table t1(a tinyint NOT NULL, b char(4)); Query OK, 0 rows affected (0.00 sec) mysql> insert into t1 values(10,'mysql'),(NULL,'test'),(300,'open source'); Query OK, 3 rows affected, 4 warnings (0.15 sec) Records: 3 Duplicates: 0 Warnings: 4

mysql> show warnings; +---------+------+-------------------------------------------------------------| Level | Code | Message +---------+------+-------------------------------------------------------------| Warning | 1263 | Data truncated for column 'b' at row 1 | Warning | 1261 | Data truncated, NULL supplied to NOT NULL column 'a' at row 2 | Warning | 1262 | Data truncated, out of range for column 'a' at row 3 | Warning | 1263 | Data truncated for column 'b' at row 3 +---------+------+-------------------------------------------------------------4 rows in set (0.00 sec) O nmero mximo de avisos pode ser especficado usando a varivel do servidor 'max_error_count', SET max_error_count=[count]; Por padro 64. No caso de avisos desabilitados, simplesmente zere esta varivel. No caso de max_error_count ser 0, ento o contador de avisos ainda representa quantos avisos ocorreram, mas nenhuma das mensagens so armazenadas. Por exemplo, considere o seguinte instruo de tabela ALTER para o exemplo acima, o qual retorna apenas um mensagem de aviso embora o total de avisos seja 3, ao definir max_error_count=1. mysql> show variables like 'max_error_count'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_error_count | 64 | +-----------------+-------+ 1 row in set (0.00 sec) mysql> set max_error_count=1; Query OK, 0 rows affected (0.00 sec) mysql> alter table t1 modify b char; Query OK, 3 rows affected, 3 warnings (0.00 sec) Records: 3 Duplicates: 0 Warnings: 3 mysql> show warnings; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1263 | Data truncated for column 'b' at row 1 | +---------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql>

295

Administrao do Bancos de Dados MySQL

4.6.8.10. SHOW TABLE TYPES


SHOW TABLE TYPES Este comando implementado no MySQL 4.1.0. SHOW TABLE TYPES lhe mostra a informao de status sobre o tipo de tabela. Isto particulamente til para verificar se um tipo de tabela suportado; ou para ver qual o tipo de tabela padro. mysql> SHOW TABLE TYPES;

+--------+---------+-----------------------------------------------------------+ | Type | Support | Comment | +--------+---------+-----------------------------------------------------------+ | MyISAM | DEFAULT | Default type from 3.23 with great performance | | HEAP | YES | Hash based, stored in memory, useful for temporary tables | | MERGE | YES | Collection of identical MyISAM tables | | ISAM | YES | Obsolete table type; Is replaced by MyISAM | | InnoDB | YES | Supports transactions, row-level locking and foreign keys | | BDB | NO | Supports transactions and page-level locking | +--------+---------+-----------------------------------------------------------+ 6 rows in set (0.00 sec) A opo 'Support' DEFAULT indica se um tipo de tabela particular suportado, e qual o tipo padro. Se o servidor iniciado com --default-table-type=InnoDB, ento o campo 'Support' do InnoDB ter o valor DEFAULT.

4.6.8.11. SHOW PRIVILEGES


SHOW PRIVILEGES Este comando implementado no MySQL 4.1.0. SHOW PRIVILEGES mostra a lista de privilgios de sistema o servidor MySQL suporta.

mysql> show privileges; +------------+--------------------------+--------------------------------------| Privilege | Context | Comment +------------+--------------------------+--------------------------------------| Select | Tables | To retrieve rows from table | Insert | Tables | To insert data into tables | Update | Tables | To update existing rows | Delete | Tables | To delete existing rows | Index | Tables | To create or drop indexes | Alter | Tables | To alter the table | Create | Databases,Tables,Indexes | To create new databases and tables | Drop | Databases,Tables | To drop databases and tables | Grant | Databases,Tables | To give to other users those privilege | References | Databases,Tables | To have references on tables | Reload | Server Admin | To reload or refresh tables, logs and | Shutdown | Server Admin | To shutdown the server | Process | Server Admin | To view the plain text of currently ex | File | File access on server | To read and write files on the server +------------+--------------------------+--------------------------------------14 rows in set (0.00 sec)

4.7. Localizao do MySQL e Utilizao Internacional


296

Administrao do Bancos de Dados MySQL

4.7.1. O Conjunto de Caracteres Utilizado para Dados e Ordenao


Por padro, o MySQL utiliza o conjunto de caracteres ISO-8859-1 (Latin1) com ordenao de acordo com o sueco/finlands. Este tambm o conjunto de caracteres aplicvel nos EUA e oeste da Europa. Todos os binrios padres do MySQL so compilados com -with-extra-charsets=complex. Isto adicionar cdigo a todos os programas padres para estarem aptos a lidar com o conjuntos de caracteres latin1 e todos os multi-byte no binrio. Outros conjuntos de caracteres sero carregados de um arquivo de definies de conjuntos de caracteres quando necessrios. O conjunto de caracteres determina quais so os caracteres permitidos em nomes e qual a forma de ordenao por clusulas ORDER BY e GROUP BY da instruo SELECT. Voc pode alterar o conjunto de caracteres com a opo --default-character-set na inicializao do servidor. Os conjuntos de caracteres disponveis dependem dos parmetros -with-charset=charset e --with-extra-charset= list-of-charset | complex | all | none e os arquivos de configuraes de conjuntos de caracteres listados em SHAREDIR/charsets/ Index. See Seco 2.3.3, Opes tpicas do configure. Se o conjunto de caracteres for alterado durante a execuo do MySQL (que tambm pode alterar a ordenao), deve-se executar o 0myisamchk -r -q --set-character-set=charset em todas as tabelas. De outra forma seus ndices podem no ser ordenados corretamente. Quando um cliente conecta a um servidor MySQL, o servidor envia o conjunto de caracteres padro em uso ao cliente. O cliente ir alternar para o uso deste conjunto de caracteres nesta conexo. Deve ser utilizado mysql_real_escape_string() quando desejar ignorar seguncias de caracteres em uma consulta SQL. mysql_real_escape_string() identico antiga funo mysql_espace_string(), exceto pelo fato de usar a manipulador de conexo MySQL como o primeiro parmetro. Se o cliente for compilado com o caminho diferente daquele onde o servidor est instalado e o usurio que configurou o MySQL no incluiu todos os conjuntos de caracteres no binrios do MySQL, deve ser especificado para o cliente onde ele pode encontrar os conjuntos de caracteres adcicionais que sero necessrios se o servidor executar com um conjunto de caracteres diferente do cliente. Isto pode ser especificado colocando em um arquivo de opes do MySQL: [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets onde o caminho aponta para onde os conjuntos de caracteres dinmicos do MySQL so armazenados. Pode-se forar o cliente a usar conjuntos de caracteres especficos especificando: [client] default-character-set=nome-conjunto-caracteres mas normalmente isto nunca ser necessrio.

4.7.1.1. German character set


Para se fazer ordenao em Alemo, voc deve iniciar o mysqld com -default-character-set=latin1_de. Isto lhe dar as seguintes caracteristicas. -

Ao ordenar e comparar strings, o seguinte mapeamento feito na string antes de fazer a comparao: 297

Administrao do Bancos de Dados MySQL

-> ae -> oe -> ue -> ss Todos os caracteres acentuados, so convertidos para suas contra partes sem acentos e em letras maisculas. Todas as letras so convertidas para maisculas. Ao compara strings com LIKE o mapeamento de caracteres de um -> dois no feito. Todas as letras so convertidas para maisculas. Acentos so removidos para todas as letras exceto: , , , , e .

4.7.2. Mensagens de Erros em Outras Lnguas


mysqld pode exibir mensagens de erros nas seguintes lnguas: Tcheco, Dinamarqus, Holands, Ingls (padro), Estonian, Francs, Alemo, Grego, Hngaro, Italiano, Japons, Koreano, Noruegus, Noruegus-ny, Polons, Portugus, Romeno, Russo, Eslovaco, Espanhol e Sueco. Para iniciar o mysqld com uma lngua particular, use uma das opes: --language=lngua ou -L lngua . Por exemplo: shell> mysqld --language=swedish ou: shell> mysqld --language=/usr/local/share/swedish Perceba que todos as lnguas so especificados em minsculas. Os arquivos de linguagens esto localizados (por padro) em mysql_base_dir/share/LANGUAGE/. Para atualizar o arquivo com mensagens de erros, deve-se editar o arquivo errmsg.txt e executar o seguinte comando para gerar o arquivo errmsg.sys: shell> comp_err errmsg.txt errmsg.sys Se voc atualizar o MySQL para uma verso mais nova, lembre-se de repetir as alteraes no novo arquivo errmsg.txt.

4.7.3. Adicionando um Novo Conjunto de Caracteres


Para adicionar outro conjunto de caracteres ao MySQL, utilize o seguinte procedimento. Decida se o conjunto simples ou complexo. Se o conjunto de caracteres no necessitar do uso de rotinas especiais de classificao de strings para ordenao e tambm no necessitar de suporte caracteres multi-byte, ser simples. Se ele necessitar de alguns destes recursos, ser complexo. Por exemplo, latin1 e danish so conjuntos simples de caracteres enquanto big5 ou czech so conjuntos de caracteres complexos. Na seguinte seo, assumimos que voc nomeou seu conjunto de caracteres como MYSET. Para um conjunto de caracteres simples use o seguinte: 1. Adicione MYSET para o final do arquivo sql/share/charsets/Index Associe um nmero nico ao mesmo.

298

Administrao do Bancos de Dados MySQL

2.

Crie o arquivo sql/share/charsets/MYSET.conf. (O arquivo re/charsets/latin1.conf pode ser utilizado como base para isto). A sintaxe para o arquivo muito simples: Comentrios iniciam com um caractere '#' e continuam at o fim da linha. Palavras so separadas por quantidades arbitrrias de espaos em brancos.

sql/sha-

Ao definir o conjunto de caracteres, cada palavra deve ser um nmero no formato hexadecimal O vetor ctype obtm as primeiras 257 palavras. Os vetores to_lower, to_upper e sort_order obtm, cada um, as 256 palavras seguintes.

See Seco 4.7.4, Os Vetores de Definies de Caracteres. 3. 4. Adicione o nome do conjunto de caracteres s listas CHARSETS_AVAILABLE e COMPILED_CHARSETS no configure.in. Reconfigure, recompile e teste.

Para um conjunto de caracteres complexo faa o seguinte: 1. 2. 3. Crie o arquivo strings/ctype-MYSET.c na distribuio fonte do MYSQL. Adicione MYSET ao final do arquivo sql/share/charsets/Index. Associe um nmero nico a ele. Procure por um dos arquivos ctype-*.c existentes para ver o que precisa ser definido, por exemplo strings/ctype-big5.c. Perceba que os vetores no seu arquivo deve ter nomes como ctype_MYSET, to_lower_MYSET e etc. Isto corresponde aos arrays no conjunto simples de caracteres - Seco 4.7.4, Os Vetores de Definies de Caracteres - para um conjunto de caracteres complexo. Prximo ao topo do arquivo, coloque um comentrio especial como este: /* * This comment is parsed by configure to create ctype.c, * so don't change it unless you know what you are doing. * * .configure. number_MYSET=MYNUMBER * .configure. strxfrm_multiply_MYSET=N * .configure. mbmaxlen_MYSET=N */ O programa configure utiliza este comentrio para incluir o conjunto de caracteres na biblioteca MySQL automaticamente. As linhas strxfrm_multiply e mbmaxlen sero explicadas nas prximas sees. S as inclua se voc precisar de funes de ordenao de strings ou das funes de conjuntos de caracteres multi-byte, respectivamente. 5. Voc deve ento criar algumas das seguintes funes: my_strncoll_MYSET() my_strcoll_MYSET() my_strxfrm_MYSET() my_like_range_MYSET() 299

4.

Administrao do Bancos de Dados MySQL

See Seco 4.7.5, Suporte Ordenao de Strings. 6. 7. Adicione o nome do conjunto de caracteres s listas CHARSETS_AVAILABLE e COMPILED_CHARSETS no configure.in. Reconfigure, recompile e teste.

O arquivo sql/share/charsets/README fornece algumas instrues a mais. Se voc desejar ter o seu conjunto de caracteres includo na distribuio MySQL, envie um email com um patch para a lista de email ``internals'' do MySQL. See Seco 1.7.1.1, As Listas de Discusso do MySQL.

4.7.4. Os Vetores de Definies de Caracteres


to_lower[] e to_upper[] so vetores simples que definemm os caracteres minsculos e masculos correspondentes a cada membro do conjunto de caracteres. Por exemplo: to_lower['A'] deve conter 'a' to_upper['a'] deve conter 'A' sort_order[] um mapa indicando como os caracteres devem ser ordenados para propsitos de comparao e ordenao. Para vrios conjuntos de caracteres, isto o mesmo que to_upper[] (que significa ordenar em caso insensitivo). O MySQL ordenar caracteres baseado no valor de sort_order[caractere]. Para regras mais complicadas de ordenao, veja a discusso sobre ordenao de string abaixo. See Seco 4.7.5, Suporte Ordenao de Strings. ctype[] um vetor com valores binrios, com um elemento para cada caracter. (Note que to_lower[], to_upper[] e sort_order[] so indexados pelo valor do caracter, mas o ctype[] indexado pelo valor do caracter + 1. Este um antigo legado para tratamento de EOF.) Pode-se encontrar as seguintes mscaras binrias de definies em m_ctype.h: #define #define #define #define #define #define #define #define _U _L _N _S _P _C _B _X 01 02 04 010 020 040 0100 0200 /* /* /* /* /* /* /* /* Masculo */ Minsculo */ Numeral (digito) */ Caractere de espao */ Pontuao */ Caractere de controle */ Branco */ Digito heXadecimal */

A entrada ctype[] para cada caracter deve ser a unio dos valores da mscara binria que descrevem o caracter. Por exemplo, 'A' um caracter maisculo (_U) bem como um dgito hexadecimal (_X), portanto ctype['A'+1] deve conter o valor: _U + _X = 01 + 0200 = 0201

4.7.5. Suporte Ordenao de Strings


Se as regras de ordenao para a sua linguagem forem muito complexas para serem tratadas com uma simples tabela sort_order[], ser necessrio o uso das funes de ordenao de strings. No momento, a melhor documentao sobre isto so os conjuntos de caracteres que j esto implementados. Confira os conjuntos de caracteres big5, czech, gbk, sjis e tis160 para exemplos. Voc deve especificar o valor strxfrm_multiply_MYSET=N no comentrio especial no topo do arquivo. N deve ser configurado para a razo mxima que as strings podem crescer durante my_strxfrm_MYSET (ele deve ser um inteiro positivo). 300

Administrao do Bancos de Dados MySQL

4.7.6. Suporte Caracteres Multi-byte


Se voc deseja adicionar suporte para novos conjuntos de caracteres que incluem caracteres multi-byte, voc precisa usar as funes para caracteres multi-byte. No momento, a melhor documentao sobre isto so os conjuntos de caracteres que j esto implementados. Confira os conjuntos de caracteres euc_kr, gb2312, gbk, sjis e ujis para exemplos. Eles so implementados no arquivo ctype-'conj_caracter'.c no diretrio strings Voc deve especificar o valor mbmaxlen_MYSET=N no comentrio especial no topo do arquivo. N deve ser configurado como o tamanho em bytes do maior caracter no conjunto.

4.7.7. Problemas com Conjuntos de Caracteres


Se voc tentar usar um conjunto de caractere que no foi compilado dentro do se binrio, voc pode encontrar aluguns problemas: Seu programa tem um caminho errado para onde o conjunto de caracter est armazenado (Padro /usr/local/mysql/share/mysql/charsets). Isto pode ser corrigido usando a opo --character-sets-dir para o programa em questo. O conjunto sde caracteres multi-byte e no pode ser carregado dinamicamente. Neste caso voc tem que recompilar o programa com o suporte para o conjunto de caracteres. O conjunto de caracteres dinmica, mas voc no tem um arquivo de configurao para ele. Neste caso voc deve instalar o arquivo configure para o conjunto de caracteres de uma nova distriibuio do MySQL. Seu arquivo Index no contm o nome do conjunto de caracteres. ERROR 1105: File '/usr/local/share/mysql/charsets/?.conf' not found (Errcode: 2) Neste caso voc deve obter um novo arquivo Index ou adicionar o nome do conjunto de caracters que falta manualmente. Para tabelas MyISAM, voc pode vericifcar o nome e nmero do conjunto de caracteres para uma tabela com myisamchk -dvv nome_tabela.

4.8. Utilitrios e Scripts do Lado do Servidor MySQL


4.8.1. Viso Geral dos Scripts e Utilitrios do Lado Servidor
Todos os programas MySQL possuem vrias opes diferentes, entretanto, todo programa MySQL fornece uma opo --help que pode ser usada para obter uma descrio completa das diferentes opes do programa. Por exemplo, experimente mysql --help. Voc pode sobrepor ignorar as opes padres para todos os programas clientes com um arquivo de opes. Seco 4.1.2, Arquivo de Opes my.cnf. A lista abaixo descreve brevemente os programas MySQL. myisamchk 301

Administrao do Bancos de Dados MySQL

Utilitrio para descrever, conferir, otimizar e reparar tabelas MySQL. Como o myisamchk tem muitas funes, eles so descritos em seu prprio captulo. See Captulo 4, Administrao do Bancos de Dados MySQL. make_binary_distribution Cria uma edio binria de um MySQL compilado. Isto pode ser enviado por FTP para / pub/mysql/Incoming em support.mysql.com para a convenincia de outros usurios MySQL. mysqlbug O script para relatar erros no MySQL. Este script deve sempre ser utilizado quando for necessrio preencher um relatrio de erros para a lista do MySQL. mysqld O servidor (daemon) SQL. Deve sempre estar em execuo. mysql_install_db Cria as tabelas de permisses do MySQL com os privilgios padres. Este comando normalmente executado somente na primeira vez quando o MySQL instalado em um sistema.

4.8.2. mysqld-safe, o wrapper do mysqld


mysqld_safe a maneira recomendada para iniciar um daemon mysqld no Unix. mysqld_safe adiciona alguns recursos de segurana tais como reiniciar o servidor quando um erro ocorrer e log de informaes de tempo de execuo a um arquivo log. Note: Antes do MySQL 4.0, mysqld_safe chamado safe_mysqld. Para preservar a compatibilidade com verses anteriores, a distribuio binria do MySQL para algumas vezes incluir safe_mysqld como um link simblico para mysqld_safe. Se voc no utilizar --mysqld=# ou --mysql-version=# o mysqld_safe ir utilizar um executvel chamado mysqld-max se ele existir. Se no, mysqld_safe ir iniciar o mysqld. Isto torna muito fcil utilizar o mysql-max no lugar do mysqld; basta copiar mysqld-max no mesmo diretrio do mysqld e ele ser utillizado. Normalmente o script mysqld_safe nunca deve ser editado, em vez disto, coloque as opes para o mysqld_safe na seo [mysqld_safe] no arquivo my.cnf. O mysqld_safe ir ler todas as opes das sees [mysqld], [server] e [mysqld_safe] dos arquivos de opes. (Para compatibilidade com verses anteriores, ele tambm l as sees [safe_mysqld].) See Seco 4.1.2, Arquivo de Opes my.cnf. Note que todas as opes na linha de comando para o mysqld_safe so passadas para o mysqld. Se voc deseja usar algumas opes no mysqld_safe que o mysqld no suporte, voc deve especific-las no arquivo de opes. A maioria das opes para mysqld_safe so as mesmas que as do mysqld. See Seco 4.1.1, Opes de Linha de Comando do mysqld. mysqld_safe suporta as seguintes opes: --basedir=caminho, --core-file-size=#

302

Administrao do Bancos de Dados MySQL

Tamanho do arquivo core que o mysqld poder criar. Passado para ulimit -c. --datadir=caminho, --defaults-extra-file=caminho, -defaults-file=caminho, --err-log=caminho, --log-error=caminho Gava o log de erro no caminho acima. See Seco 4.10.1, O Log de Erros. --ledir=caminho Caminho para mysqld --log=caminho, --mysqld=verso_do_mysqld Nome da verso do mysqld no diretrio ledir que voc deseja iniciar. --mysqld-version=verso Similar ao --mysqld= mas aqui voc s fornece o sufixo para o mysqld. Por exemplo, se voc utiliza --mysqld-version=max, o mysqld_safe ir iniciar a verso ledir/ mysqld-max. Se o argumento para --mysqld-version estiver vazio