Escolar Documentos
Profissional Documentos
Cultura Documentos
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 ...............................................................22
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 76
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
xvi
Preface
Este o Manual de Referncia para o Sistema de Banco de Dados MySQL. Este verso se
refere a verso 5.0.3-alpha 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
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 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 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>.
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
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.
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.
Portabilidade e
Escrito em C e C++.
Informaes Gerais
Funciona em diversas plataformas. See Seco 2.2.3, Sistemas Operacionais suportados pelo MySQL.
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.
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/).
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.
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.
DELETE, INSERT, REPLACE, e UPDATE retornam o nmero de linhas que foram alteradas
6
Informaes Gerais
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.
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.
Informaes Gerais
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.
Linux-Intel 32 bit
Linux-Alpha
8T (?)
Solaris 2.5.1
Solaris 2.6
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
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.
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 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),
10
Informaes Gerais
11
Informaes Gerais
Fcil de usar.
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
Widenius, principal autor do MySQL Server. See Seco 1.4.1, Suporte Oferecido pela MySQL
AB.
12
Informaes Gerais
veja
Economizar tempo.
Melhorar a segurana.
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.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.
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
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>.
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.
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.
2.
A biblioteca GNU getopt coberta pela GNU Lesser General Public License.
Veja http://www.fsf.org/licenses/.
3.
Algumas partes da fonte (a biblioteca regexp) coberta por um copyright no estilo Berkeley.
4.
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.
5.
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.
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.
16
Informaes Gerais
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>.
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.
17
Informaes Gerais
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 verdade 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.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.
18
Informaes Gerais
Se voc utilizar as maracas em um site da web, faa com que ele contenha um link para
http://www.mysql.com/.
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.
Quando exibir qualquer logomarca da MySQL AB em qualquer lugar diferente so seu site.
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.
MySQL version
Unions
4.0
19
Informaes Gerais
Subqueries
4.1
R-trees
Stored procedures
5.0
Views
5.0 ou 5.1
Cursors
5.0
Foreign keys
Triggers
5.1
5.1
Constraints
5.1
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).
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.
Novas fncionalidades
20
Informaes Gerais
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
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 palavras 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.
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.
A seo de novidades deste manual inclui uma lista mais aprofundada dos recursos. See Seco D.3,
Alteraes na distribuio 4.0.x (Production).
21
Informaes Gerais
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.
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.
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.
22
Informaes Gerais
Aprimoramento da usabilidade
Em resposta a demanda popular, adicionamos um comando HELP com base no servidor que
pode ser usado para conseguir ajuda para comandos MySQL. A vantagem de se ter esta informao no lado do servidor 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).
Informaes Gerais
Suporte OpenSSL estvel (o MySQL 4.0 tem suporte rudimentar ao OpenSSL, no testado
100%).
Stored Procedures
Nova funcionalidade
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.
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.
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.
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.
Novas funcionalidades
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:
Informaes Gerais
Para cada tabelas, renomeie-a para outro banco de dados, o qual fazemos com o comando
RENAME.
Nova alterao da interface de arquivo interno. Isto far todos os manipuladores de arquivos
mais gerais e tornar mais fcil adicionar extenses tipo RAID.
Novas funcionalidade
Comando como do Oracle CONNECT BY PRIOR ... para estruturas de busca tipo rvore
(hierrquica)
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.
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.
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).
Possibilitar o uso da nova biblioteca regexp GNU em vez da atual (a biblioteca GNU deve
ser muito mais rpida que a antiga).
No adicionar valores DEFAULT automticos as colunas. Enviar um erro ao usar um INSERT que no contenha uma coluna que no tenha um DEFAULT.
Aumento de velocidade
Adicionar uma opo para descarregar paginas de chaves para tabelas com delayed keys se
elas no forem usados por um tempo.
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.
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.
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.
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.
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=#;
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).
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.
MINUS, INTERSECT e FULL OUTER JOIN. (Atualmente UNION [na 4.0] e LEFT OUTER
JOIN so suportados).
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.
Adicionar uso de zlib() a LOAD DATA INFILE, para permitir que as instrues leiam arquivos compactados com gzip.
Alterar para o uso de semforos quando contar threads. Devemos primeiro implementar uma biblioteca de semforos para a MIT-pthreads.
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
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
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.
Informaes Gerais
Procure no banco de dados de bugs em http://bugs.mysql.com/ para ver se o erro j foi relatado/
resolvido.
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.
de
segurana
no
MySQL,
envie
um
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 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!
#mysql A princpio so questes sobre o MySQL, mas dvidas sobre outros bancos de dados e SQL so bemvindas.
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
'"' 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 banco
38
Informaes Gerais
de dados mysql e a coluna User nesta tabela se torna reservada, assim voc deve coloc-la entre aspas:
SELECT "User" FROM mysql."user";
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:
39
Informaes Gerais
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.
O uso de INTO OUTFILE e STRAIGHT_JOIN em uma instruo SELECT. See Seco 6.4.1,
Sintaxe SELECT .
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.
Utilizao de mltiplas clusulas ADD, ALTER, DROP, ou CHANGE em uma instruo ALTER
TABLE.
Voc pode remover mltiplas tabelas com uma instruo nica DROP TABLE.
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.
Strings podem ser fechadas pelo '"' ou ''', no apenas pelo '''.
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.
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.
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:
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.
Uso de REPLACE no lugar de DELETE + INSERT. See Seco 6.4.7, Sintaxe REPLACE.
41
Informaes Gerais
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.
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.
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.
3.
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
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.
Use LOCK TABLES ... para fazer um lock todas as tabelas que voc quer acessar.
2.
Condies de teste.
3.
4.
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:
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;
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.
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
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.
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.
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.
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:
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.
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).
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
Quando estiver usando SET CHARACTER SET, no permitido usar caracteres especias no
nome do banco de dados, tabelas ou campos.
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.
Informaes Gerais
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).
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.
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.
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:
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
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.
Instale a distribuio.
2.
3.
4.
Inicie o servidor.
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.
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.
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.
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.
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.
2.
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.
Instalao do MySQL
4.
5.
6.
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.
7.
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:
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
56
Instalao do MySQL
Notepad. Por exemplo, se o MySQL est instalado em D:\mysql e o diretrio de dados est localizado 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:
Descrio
mysqld
mysqld-opt
Binrio otimizado. A partir da verso 4.0 o InnoDB est habilitado. Antes desta verso, este servidor no tem suporte a tabelas transacionais.
mysqld-nt
mysqld-max
Binrio otimizado com suporte para links simblicos, tabelas BDB e InnoDB.
mysqldmax-nt
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.
57
Instalao do MySQL
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.
Instalao do MySQL
Instalao do MySQL
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.
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.
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.
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
Descrio
mysql
mysqlc
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.
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
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.
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:
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
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
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
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.
Se voc estiver atualizando de um instaao anterior, para o servidor MySQL. Isto feito a partir do console do servidor, usando:
SERVER:
2.
Conecte-se no servidor alvo a partir de uma mquina cliente com acesso ao local onde voc
instalar o MySQL.
3.
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.
5.
6.
7.
8.
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
6.0,
voc
deve
adicionar
parmetro
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.
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 as69
Instalao do MySQL
<package>.asc
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>"
AIX 4.x com threads nativas. See Seco 2.6.6.4, Notas IBM-AIX.
Amiga.
70
Instalao do MySQL
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 .
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).
NetBSD 1.3/1.4 Intel e NetBSD 1.3 Alpha (Necessita GNU make). See Seco 2.6.4.2, Notas
NetBSD.
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 multiprocessados. 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
71
Instalao do MySQL
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.
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 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.
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.3-alpha). 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
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.
72
Instalao do MySQL
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-libwrap
--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:
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.
Instalao do MySQL
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.
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:
O teste crash-me
74
Instalao do MySQL
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.
Contedo do diretrio
bin
data
docs
include
lib
Bibliotecas
scripts
mysql_install_db
share/mysql
sql-bench
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
Contedo do diretrio
bin
include/mysql
info
lib/mysql
Bibliotecas
libexec
O servidor mysqld
share/mysql
sql-bench
var
The mysqld server is installed in the libexec directory rather than in the bin directory.
The header file and library directories are include/mysql and lib/mysql rather than include and lib.
75
Instalao do MySQL
You can create your own binary installation from a compiled source distribution by executing the
script scripts/make_binary_distribution.
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.
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.
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
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.
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).
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.
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.
77
Instalao do MySQL
-mc-
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
Instalao do MySQL
IBM AIX 4.3.3 ppc com xlC_r (IBM Visual Age C/C++ 6.0)
CC=xlc_r CFLAGS="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192"
CXX=xlC_r CXXFLAGS ="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192"
./configure
--prefix=/usr/local/mysql
-localstatedir=/usr/local/mysql/data
-libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex -enable-thread-safe-client
--enable-local-infile
-with-named-z-libs=no --disable-shared --with-innodb
79
Instalao do MySQL
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
Instalao do MySQL
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
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.
Instalao do MySQL
-with-mysqld-ldflags=-all-static
-with-extra-charsets=complex
--disable-shared
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
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.
Instalao do MySQL
MySQL:
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.)
2.
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,
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.
4.
83
Instalao do MySQL
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.
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';
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 mysqlaccess.
9.
Instalao do MySQL
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.
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.
85
Instalao do MySQL
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.
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:
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.
86
Instalao do MySQL
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.
Escolha o diretrio sobre o qual voc deseja descompactar a distribuio e v para ele.
2.
Obtenha um arquivo de distribuio de algum dos sites listados em Seco 2.2.1, Como obter
o MySQL.
3.
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.3-alpha.
4.
5.
6.
7.
8.
Instalar tudo:
shell> make install
87
Instalao do MySQL
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.
Instalao do MySQL
gens. 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.
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
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:
89
Instalao do MySQL
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
Recommended options
gcc 2.7.2.1
egcs 1.0.3a
gcc 2.95.2
CFLAGS="-O3
-mpentiumpro"
CXX=gcc
CXXFLAGS="-O3
mpentiumpro \ -felide-constructors -fno-exceptions -fno-rtti"
pgcc 2.90.29
or newer
CFLAGS="-O3 -mpentiumpro -mstack-align-double" CXX=gcc \ CXXFLAGS="-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:
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
90
Instalao do MySQL
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
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.
Instalao do MySQL
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.
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.
2.
3.
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
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:
92
Instalao do MySQL
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.
6.
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.
7.
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
que sua varivel PATH esteja corretamente configurada para que sua shell possa encontr-la.
8.
Depois da operao inicial bk clone para obter a rvore fonte, voc deve executar bk
pull periodicamente para obter as atualizaes.
9.
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.
93
Instalao do MySQL
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
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.
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:
94
Instalao do MySQL
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.
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)'
95
Instalao do MySQL
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);
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.)
96
Instalao do MySQL
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:
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"
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
97
Instalao do MySQL
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.
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.
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
No colocamos readline para funcionar com MIT-pthreads. (Isto no necessrio, mas pode
ser interessante para alguns.)
Instalao do MySQL
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:
necessrio
para
a
macro
assembler.
Mais
detalhes
em:
http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/faq.aspx.
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/.
2.
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:
neste
sistema.
Voc
pode
obter
BitKeeper
em
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.
Descompacte a distribuio fonte no diretrio mencionado acima usando Winzip ou outra ferramenta que possa ler arquivos .zip.
3.
Instalao do MySQL
4.
5.
6.
7.
8.
Pressione F7 para iniciar a construo da depurao do servidor, bibliotecas e alguns aplicativos clientes.
9.
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:
mkdir
mkdir
mkdir
mkdir
\mysql\include
\mysql\lib
\mysql\lib\debug
\mysql\lib\opt
100
Instalao do MySQL
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.
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.
2.
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:
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
Instalao do MySQL
--dirname
--silent
--tar
--help
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++.
Instalao do 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.
Para maiores informaes sobre estas alternativas, veja Seco 4.4.4, Configurando os Privilgios Iniciais do MySQL.
2.
103
Instalao do MySQL
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
3.23.32-debug
Protocol version
10
Connection
Localhost via Unix socket
TCP port
3306
UNIX socket
/tmp/mysql.sock
Uptime:
16 sec
Threads: 1 Questions: 9 Slow queries: 0
Opens: 7 Flush tables: 2 Open tables: 0
Queries per second avg: 0.000
Memory in use: 132K Max memory used: 16773K
Para ter uma idia do que voc pode fazer com BINDIR/mysqladmin, invoque-o com a opo --help.
4.
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:
shell> BINDIR/mysqlshow
+-----------+
| Databases |
+-----------+
| mysql
|
+-----------+
shell> BINDIR/mysqlshow mysql
Database: mysql
+--------------+
|
Tables
|
+--------------+
104
Instalao do MySQL
| 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.
Instalao do MySQL
alguns
problemas
que
podem
ser
encontrados
ao
executar
Instalao do MySQL
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.
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
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:
107
Instalao do MySQL
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:
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 da108
Instalao do MySQL
dos 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.
Instalao do MySQL
Grupos de opes
mysqld
Instalao do MySQL
Instalao do MySQL
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).
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
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.
112
Instalao do MySQL
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.
Aps o upgrade, atualize a tabela de permisses para adicionar novos privilgios e recursos. O
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
113
Instalao do MySQL
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..
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
114
Instalao do MySQL
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).
Novo Nome.
myisam_bulk_insert_tree_size
bulk_insert_buffer_size
query_cache_startup_type
query_cache_type
record_buffer
read_buffer_size
record_rnd_buffer
read_rnd_buffer_size
sort_buffer
sort_buffer_size
warnings
log-warnings
--err-log
As opes de inicializao record_buffer, sort_buffer e warnings ainda funcionaro no MySQL 4.0 mas estp obsoletas.
Novo Nome.
SQL_BIG_TABLES
BIG_TABLES
SQL_LOW_PRIORITY_UPDATES
LOW_PRIORITY_UPDATES
SQL_MAX_JOIN_SIZE
MAX_JOIN_SIZE
SQL_QUERY_CACHE_TYPE
QUERY_CACHE_TYPE
SHOW MASTER STATUS agora retorna um conjunto vazio se o log binrio no estiver habilitado.
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).
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.
115
Instalao do MySQL
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.
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.
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.
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.
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.
116
Instalao do MySQL
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.
Todas tabelas que usam o conjunto de caracteres tis620 devem ser corrigidos com myisamchk -r ou REPAIR TABLE.
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 primeiro 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.
117
Instalao do MySQL
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.
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_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.
118
Instalao 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.
Todo o cdigo cliente deve ser recompilado. Se voc usa o ODBC, deve obter o novo driver
MyODBC 2.x.
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.
As seguintes alteraes podem afetar consultas em antigas aplicaes:
Agora existem algumas palavras reservadasi novas. As mais notveis so DATE TIME e TIMESTAMP.
Instalao do MySQL
Instalao do MySQL
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
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.
121
Instalao do MySQL
2.
Escolha uma hora do dia com pouco uso, onde a parada para manuteno aceitvel.
3.
Alerte os usurios que ainda esto ativos para sua parada de manuteno.
4.
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).
5.
6.
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.
7.
8.
Reinicie o servio MySQL Server (por exemplo, com NET START mysql se voc executar o
MySQL como um servio, ou chamado o mysqld diretamente).
9.
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/.
2.
Inicie
seu
cliente
SSH
Windows.
122
Configure
Host_Name
Instalao do MySQL
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.
3.
4.
Salve tudo, seno voc ter que refazer tudo da prxima vez.
5.
Logue ao seu servidor com a sesso SSH que acabou de ser criada.
6.
7.
Crie um novo arquivo no Windows e ligue ao MySQL usando o driver ODBC da mesma forma
que voc normalmente faz, EXCETO pelo fato de digitar localhost para a mquina servidora MySQL --- no nomeservidormysql.
Voc agora deve ter uma conexo ODBC ao MySQL, criptografada com SSH.
Win95 e threads
O Win95 perde aproximadamente 200 bytes de memria principal para cada thread criada. Cada
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
123
Instalao do MySQL
O MySQL usa uma leitura de blocos para cada conexo, que tem as seguintes implicaes:
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.
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.
124
Instalao do MySQL
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.
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.
Aqui esto alguns assuntos em aberto para qualquer um que queira melhorar o MySQL no Win125
Instalao do MySQL
dows:
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.
126
Instalao do MySQL
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.
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
127
Instalao do MySQL
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.
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.
128
Instalao do MySQL
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:
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
Instalao do MySQL
obter
seguinte
mensagem
de
erro
quando
executar
Obtenha uma distribuio fonte do MySQL (uma distribuio RPM ou tar.gz) e a instale.
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.
130
Instalao do MySQL
Instalao do MySQL
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.
132
Instalao do 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:
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
133
Instalao do MySQL
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:
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.
134
Instalao do MySQL
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.
(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.
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.
135
Instalao do MySQL
Configure
com
./configure.
CFLAGS=-DHAVE_CURSES_H
CXXFLAGS=-DHAVE_CURSES_H
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:
Se voc estiver usando o Solaris 8, voc pode instalar a zlib opcional do CD de distribuio do
Solaris 8.
Instalao do MySQL
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.
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:
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
137
Instalao do MySQL
./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.
Instalao do MySQL
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.
139
Instalao do MySQL
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).
140
Instalao do MySQL
Para instalar a distribuio, utilze um dos comandos abaixo, onde /path/to/depot o caminho
completo do arquivo depot:
Instalao do MySQL
Instalao do MySQL
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.
Instalao do MySQL
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:
Instalao do MySQL
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 \
--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
145
Instalao do MySQL
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 ...
146
Instalao do MySQL
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.
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:
"/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 \
147
Instalao do MySQL
--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
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.
2.
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.
3.
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.
4.
FSU Pthreads pode ser compilado com SCO Unix 4.2 com tcpip, ou OpenServer 3.0 ou OpenDesktop 3.0 (OS 3.0 ODT 3.0), com o Sistema de Desenvolvimento da SCO instalado usando
uma boa verso do GCC 2.5.x ODT ou OS 3.0, no qual voc 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.
5.
Execute ./configure no diretrio threads/src e selecione a opo SCO OpenServer. Este comando copia Makefile.SCO5 para Makefile.
b.
Execute make.
c.
Para instalar no diretrio padro /usr/include, use o usurio root, depois mude para o
diretrio thread/src e execute make install
6.
7.
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.
8.
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:
148
Instalao do MySQL
Com SCO 3.2V4.2, voc deve usar FSU Pthreads verso 3.5c ou mais nova. O seguinte comando configure deve funcionar:
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.
A
SCO
fornece
correes
de
segurana
e
libsocket.so.2
em
ftp://ftp.sco.com/pub/security/OpenServer e ftp://ftp.sco.com/pub/security/sse para OpenServer
5.0.x
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
149
NEW:
CC = gcc
CCCDLFLAGS = -fpic
CCDLFLAGS =
Instalao do MySQL
LD = ld
LD = gcc -G -fpic
LDDLFLAGS = -G -L/usr/local/lib
LDDLFLAGS = -L/usr/local/lib
LDFLAGS = -belf -L/usr/local/lib
LDFLAGS = -L/usr/local/lib
LD = ld
LD = gcc -G -fpic
OPTIMISE = -Od
OPTIMISE = -O1
OLD:
CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include
NEW:
CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include
Isto porque o carregador dinmico Perl no ir carregar os mdulos DBI se elas foram compiladas
com icc ou cc.
Perl trabalha melhor quando compilado com cc.
1.
2.
Instalao do MySQL
Instalao do MySQL
1.
2.
3.
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.
Instalao do MySQL
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";
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.
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'
/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";
153
Instalao do MySQL
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:
shell>
shell>
shell>
shell>
Finalmente voc deve instalar este novo Perl. Novamente, a sada de make perl indica o comando a usar.
154
155
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>.
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:
mysql> SELECT VERSION(), CURRENT_DATE;
156
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
158
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.
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 DATABASES. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE.
Se o banco de dados test existir, tente acess-lo:
159
atribuido
voc
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:
mysql> DESCRIBE pet;
161
+---------+-------------+------+-----+---------+-------+
| 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.
owner
species
sex
birth
Fluffy
Harold
cat
1993-02-04
Claws
Gwen
cat
1994-03-17
Buffy
Harold
dog
1989-05-13
Fang
Benny
dog
1990-08-27
Bowser
Diane
dog
1979-08-31
Chirpy
Gwen
bird
1998-09-11
Whistler
Gwen
bird
Slim
Benny
snake
death
1995-07-29
1997-12-09
m
1996-04-29
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
Whistler Gwen
species
sex
birth
death
bird
\N
1997-12-09
\N
Para carregar o arquivo texto pet.txt na tabela pet, use este comando:
mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
Voc pode especificar o valor do separador de colunas e o marcador de final de linha explicitamente
na instruo LOAD DATA se voc desejar. Mas os valores omitidos so suficientes para a instruo
ler o arquivo pet.txt corretamente.
Se a instruo falhar, desejvel que a sua instalao do MySQL no tenha a capacidade do arquivo
162
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.
Edite o arquivo pet.txt para corrigir o erro, depois limpe a tabela e recarregue-o usando DE163
| 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 |
+-------+--------+---------+------+------------+-------+
+--------+
| 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 |
+--------+---------+------------+
| 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.
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
para obter uma sada mais significativa.
167
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
MySQL fornece diversas funes para extrair partes da data, como em YEAR(), MONTH() e DA168
YOFMONTH(). 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).
+----------+-----------+----------+----------+
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.
| 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:
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
171
172
| bird
| f
|
1 |
| cat
| f
|
1 |
| cat
| m
|
1 |
| dog
| f
|
1 |
| dog
| m
|
2 |
| hamster | f
|
1 |
| snake
| m
|
1 |
+---------+------+----------+
No necessrio selecionar uma tabela inteira quando estiver usando COUNT(). Por exemplo, a
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 |
+---------+------+----------+
Conter o nome do animal para que voc saiba a qual animal pertence o evento.
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));
174
Como na tabela pet, mais fcil carregar os registros iniciais criando um arquivo texto delimitado
por tabulaes contendo a informao:
name
date
type
remark
Fluffy
1995-05-15
litter
Buffy
1993-06-23
litter
Buffy
1994-06-19
litter
3 puppies, 3 female
Chirpy
1999-03-21
vet
Slim
1997-08-03
vet
broken rib
Bowser
1991-10-12
kennel
Fang
1991-10-12
kennel
Fang
1998-08-28
birthday
Claws
1998-03-17
birthday
Whistler
1998-12-09
birthday
First birthday
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
175
est se referindo. Isto feito usando o nome da tabela antes do nome da coluna separados por
um ponto (.).
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.
| name
| varchar(20) | YES |
| NULL
|
|
| owner
| varchar(20) | YES |
| NULL
|
|
| species | varchar(20) | YES |
| NULL
|
|
| sex
| char(1)
| YES |
| NULL
|
|
| birth
| date
| YES |
| NULL
|
|
| death
| date
| YES |
| NULL
|
|
+---------+-------------+------+-----+---------+-------+
A coluna Field (campo) indica o nome da coluna, Type o tipo de dados para a coluna, 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.
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
177
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;
->
->
->
mysql>
->
->
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),
(3,'D',1.25),(4,'D',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:
179
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 !
2.
Para cada tem, obtenha os registros correspondentes que tenham o maior preo.
180
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,
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.
181
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.
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:
183
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 |
+--------+----+---------+
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.)
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.
coluna id
Esta identifica um par de gmeos. Ela uma chave em todas as tabelas.
column tvab
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.
186
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
Registros
person_data
71074
lentus
5291
twin_project
5286
twin_data
2012
informant_data
663
harmony
381
postal_groups
100
Para carregar uma arquivo de log naquele formato dentro do MySQL, voc pode usar uma instruo
deste tipo:
187
188
--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
189
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.
--des-key-file=filename
Read the default keys used by DES_ENCRYPT() and DES_DECRYPT() from this file.
--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
190
--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
191
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.
Descrio
DEFAULT
BACKUP
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:
--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
193
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-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
194
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
--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
195
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:
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
196
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.
-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.
Propsito
Windows-directory\my.ini
Opes globais
C:\my.cnf
Opes globais
197
Nome do arquivo
Propsito
/etc/my.cnf
Opes globais
DATADIR/my.cnf
defaults-extra-file
O
arquivo
especificado
-defaults-extra-file=#
~/.my.cnf
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 co198
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.
Todos os programas MySQL que suportam arquivos de opes aceitam opes:
Opo
Descrio
--no-defaults
--print-defaults
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
--port=port_num
--socket=path
200
--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.
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.
201
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.
202
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.
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.
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
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
203
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.
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.
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.
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 sis206
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.
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:
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
207
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:
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.
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.
208
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!
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:
Usurios do MySQL:
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.
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.
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 conexes 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
210
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.
--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.
--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 pa211
--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.
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
cas 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 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
user
db
host
Campos de Escopo
Host
Host
Host
User
Db
Db
Password
User
Select_priv
Select_priv
Insert_priv
Insert_priv
Insert_priv
Update_priv
Update_priv
Update_priv
Delete_priv
Delete_priv
Delete_priv
Index_priv
Index_priv
Index_priv
Alter_priv
Alter_priv
Alter_priv
Create_priv
Create_priv
Create_priv
Drop_priv
Drop_priv
Drop_priv
Grant_priv
Grant_priv
Grant_priv
References_priv
References_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
Execute_priv
Repl_slave_priv
Repl_client_priv
213
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
tables_priv
columns_priv
Campos de escopop
Host
Host
Db
Db
User
User
Table_name
Table_name
Column_name
Campos de privilgio
Table_priv
Column_priv
Column_priv
Outros campos
Timestamp
Timestamp
Grantor
CHAR(60)
User
CHAR(16)
Password
CHAR(16)
Db
CHAR(64)
(CHAR(60) para
lumns_priv)
214
as
tabelas
tables_priv
co-
Table_name
CHAR(60)
Column_name
CHAR(60)
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.
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.
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.
Coluna
Contexto
ALTER
Alter_priv
tabelas
DELETE
Delete_priv
tabelas
INDEX
Index_priv
tabelas
INSERT
Insert_priv
tabelas
SELECT
Select_priv
tabelas
UPDATE
Update_priv
tabelas
CREATE
Create_priv
DROP
Drop_priv
GRANT
Grant_priv
REFERENCES
References_priv
Execute_priv
administrao do servidor
FILE
File_priv
LOCK TABLES
Lock_tabelas_priv
administrao do servidor
PROCESS
Process_priv
administrao do servidor
RELOAD
Reload_priv
administrao do servidor
REPLICATION
CLIENT
Repl_client_priv
administrao do servidor
REPLICATION
SLAVE
Repl_slave_priv
administrao do servidor
SHOW
SES
administrao do servidor
DATABA- Show_db_priv
SHUTDOWN
Shutdown_priv
administrao do servidor
SUPER
Super_priv
administrao do servidor
Comandos permitidos
RELOAD
SHUTDOWN
shutdown
PROCESS
processlist
SUPER
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.
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!
217
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.
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.
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.
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:
219
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.
Valor
user
'thomas.loc.gov'
''
Qualquer usurio,
mas.loc.gov
'%'
'fred'
'%'
''
'%.loc.gov'
'fred'
'x.y.%'
'fred'
fred,
conectando
de
x.y.net,
x.y.com,x.y.edu, etc. (Isto provavelmente
no til)
'144.155.166.177'
'fred'
'144.155.166.%'
'fred'
'144.155.166.0/255.255 'fred'
.255.0'
220
conectando
de
tho-
Como voc pode usar valores coringas de IP no campo Host (por exemplo, '144.155.166.%'
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 |
| ...
221
| %
| jeffrey | ...
+----------------+----------+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.
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 '%' 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
222
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
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''
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.
2.
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.
3.
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.)
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.
223
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.
224
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
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:
225
A segunda diferena que os hashes de senha no novo formato sempre comeam com um caracter '*', que as senhas no formato antigo nunca faziam.
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.
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 :
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:
226
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
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.
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
227
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
conta at que ele seja atualizado para a verso 4.1.
Cenrio 3) Coluna Password longa; servidor iniciado com a opo --old-passwords
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.
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:
A funo PASSWORD() no repetitvel. Isto , com um dado argumento X, successivas chamadas a PASSWORD(X) geram diferentes resultados.
228
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 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.
229
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.
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 no230
me 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)
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.
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 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.
231
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.
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.
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.
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
Permite o uso de LOCK TABLES em tabelas nas quais se tem o privilgio SELECT.
PROCESS
REFERENCES
Para o futuro
RELOAD
REPLICATION CLIENT
REPLICATION SLAVE
Necessrio para a replicao dos slaves (para ler logs binrio do master).
SELECT
SHOW DATABASES
SHUTDOWN
SUPER
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
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 ....
234
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 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,
235
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.
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.
Se no MySQL voc possuir o privilgio INSERT em somente parte das colunas em uma tabela,
236
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.
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.
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
237
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.
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.
238
239
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
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)
240
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
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>
->
->
->
Como no exemplo anterior que usaram as instrues INSERT, voc pode precisar de usar um nme241
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;
Verifique quais privilgios o usurio tem com SHOW PRIVILEGES. See Seco 4.6.8.11,
SHOW PRIVILEGES.
2.
Delete todos os privilgios do usurio com REVOKE. See Seco 4.4.1, A Sintaxe de GRANT e
REVOKE.
3.
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;
Nmero de todas as consultas por hora: Todos os comandos que podiam ser executados por um
usurio.
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.
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 )
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.
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 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: ********
244
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.
ves 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 tempo 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.
Insatale o biblioteca
http://www.openssl.org/.
OpenSSL.
Testamos
MySQL
com
OpenSSL
0.9.6.
2.
3.
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.
4.
#
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
#
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 " " '
248
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>
->
->
'>
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.
mysql>
->
->
'>
'>
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
249
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.
--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
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
250
--ssl-key=file_name
O nome do arquivo de chave SSL a ser usado para estabelecer uma conexo segura.
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
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 251
2.
2.
3.
4.
5.
Desmontar snapshot
no grupo.
O comando retorna uma tabela com as seguintes colunas:
Coluna
Valor
Table
Nome da Tabela
Op
Sempre backup
Msg_type
Msg_text
A mensagem
Note que o comando BACKUP TABLE est disponvel somente no MySQL verso 3.23.25 e posterior.
Valor
Table
Nome da Tabela
Op
Sempre restore
Msg_type
Msg_text
A mensagem
Valor
Table
Nome da Tabela.
Op
Sempre check
Msg_type
Msg_text
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
253
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
Significado
QUICK
FAST
CHANGED
S verifica as tabelas que foram alteradas desde a ltima conferncia ou que no foram fechadas corretamente.
MEDIUM
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.
EXTENDED
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!
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).
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:
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.
Valor
Table
Nome da Tabela
Op
Sempre repair
Msg_type
Msg_text
A mensagem
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 voc 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.
255
-# ou --debug=debug_options
Sada do log de depurao.
'd:t:o,nomearquivo'.
string
debug_options
geralmente
-? ou --help
Exibe uma mensagem de ajuda e sai.
-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
Valor
key_buffer_size
523264
read_buffer_size
262136
write_buffer_size
262136
sort_buffer_size
2097144
sort_key_blocks
16
257
decode_bits
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.
-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 tabe258
la.
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).
-B or --backup
Faz um backup dos arquivos .MYD como filename-time.BAK
--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
259
-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
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.
260
-u ou --unpack
Descompacta arquivo empacotado com o myisampack.
-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.
261
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.
Propsito
nome_tabela.frm
nome_tabela.MYD
Arquivo de dados
nome_tabela.MYI
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
262
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.
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.
263
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
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.
264
2.
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.
3.
Se o passo anterior falhar, utilize myisamchk --safe-recover nome_tabela. O modo de recuperao segura utiliza um metdo de recuperao antiga que trata de alguns 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.
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 procedimento 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.
265
2.
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.
-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.
266
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.
index 7:
index 8:
index 9:
No recordlinks
- check index reference
- check data record references index: 1
Key: 1: Keyblocks used: 97% Packed:
0% Max levels: 4
- check data record references index: 2
Key: 2: Keyblocks used: 98% Packed:
50% Max levels: 4
- check data record references index: 3
Key: 3: Keyblocks used: 97% Packed:
0% Max levels: 4
- check data record references index: 4
Key: 4: Keyblocks used: 99% Packed:
60% Max levels: 3
- check data record references index: 5
Key: 5: Keyblocks used: 99% Packed:
0% Max levels: 3
- check data record references index: 6
Key: 6: Keyblocks used: 99% Packed:
0% Max levels: 3
- check data record references index: 7
Key: 7: Keyblocks used: 99% Packed:
0% Max levels: 3
- check data record references index: 8
Key: 8: Keyblocks used: 99% Packed:
0% Max levels: 3
- check data record references index: 9
Key: 9: Keyblocks used: 98% Packed:
0% Max levels: 4
Total:
Keyblocks used:
9% Packed:
17%
- check records and index references
[LOTS OF ROW NUMBERS DELETED]
Records:
1403698
M.recordlength:
226
Packed:
Recordspace used:
100%
Empty space:
0% Blocks/Record:
Record blocks:
1403698
Delete blocks:
0
Recorddata:
317235748
Deleted data:
0
Lost space:
0
Linkdata:
0
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
Recover time Quando foi a ltima vez que o arquivo de ndices/dados foi reconstrudo.
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.
269
0%
1.00
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.
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.
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
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.
270
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.
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.
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.
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.
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.
po 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 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.
Valor
Table
Nome da Tabela
Op
Sempre analyze
Msg_type
Msg_text
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.
272
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.
Description
HOSTS
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.
DES_KEY_FILE
Recarrega a chave DES do arquivo que foi especificado com a opo -des-key-file durante inicializao do servidor.
LOGS
Fecha e reabre todos os arquivos de log. Se voc tiver especificado o arquivo 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
TABLES
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
Reinicia a maioria das variveis de status para zero. Isto algo que deve
ser usado somente para depurar uma consulta.
USER_RESOURCES
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.
Descrio
MASTER
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.
SLAVE
Faz o slave ``esquecer'' a sua posio de replicao no log binrio do master. Anteriormente chamado FLUSH SLAVE. See Seco 4.11.8,
Instrues SQL para Controle do Servidor Slave.
QUERY CACHE
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!
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.
Se a thread estiver esperando por espao livre em disco numa chamada write, a escrita abortada com uma mensagem de espao em disco insuficiente.
SHOW
SHOW
SHOW
SHOW
SHOW
SHOW
SHOW
SHOW
SHOW
SHOW
SHOW
SHOW
SHOW
SHOW
Significado
Table
Nome da tabela.
Non_unique
Key_name
Nome do ndice.
Seq_in_index
Column_name
Nome da coluna.
Collation
Cardinality
-a.
Sub_part
Null
Index_type
Comment
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.
Significado
Name
Nome da tabela.
Type
Row_format
Rows
Nmero de registros.
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
Update_time
Collation
Checksum
Check_time
tus). 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
|
| 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
Signficado
Aborted_clients
Aborted_connects
Bytes_received
Bytes_sent
Com_xxxx
Connections
Created_tmp_files
Delayed_insert_threads
Delayed_writes
Delayed_errors
Flush_commands
Handler_delete
Handler_read_first
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.
Handler_read_key
Handler_read_next
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.
Handler_read_prev
Handler_read_rnd
Handler_read_rnd_next
Nmero de requises para ler o prximo registro no arquivo de dados. 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.
Handler_rollback
Handler_update
Handler_write
Key_blocks_used
Key_read_requests
Key_reads
Key_write_requests
Key_writes
cks
Open_files
Open_streams
Opened_tables
Rpl_status
Select_full_join
Nmero de joins sem chaves (Se for 0, voc deve conferir com cuidado o ndice de suas tabelas).
Select_scan
Select_range_check
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)
Questions
tempo
do
que
Slow_queries
Sort_merge_passes
Sort_range
Sort_rows
Sort_scan
ssl_xxx
Threads_cached
Threads_connected
Threads_created
Threads_running
Uptime
280
Se Opened_tables for grande, provavelmente sua varivel table_cache est muito pequena.
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
lower_case_table_names
max_allowed_packet
max_binlog_cache_size
max_binlog_size
max_connections
max_connect_errors
max_delayed_threads
max_heap_table_size
max_join_size
max_relay_log_size
max_sort_length
max_user_connections
max_tmp_tables
max_write_lock_count
myisam_max_extra_sort_file_size
myisam_repair_threads
myisam_max_sort_file_size
myisam_recover_options
myisam_sort_buffer_size
net_buffer_length
net_read_timeout
282
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
OFF
1047552
4294967295
1073741824
100
10
20
16777216
4294967295
0
1024
0
32
4294967295
268435456
1
2147483647
force
8388608
16384
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
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.
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_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.
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.
delay_key_write
Option for MyISAM tables. Can have one of the following values:
OFF
ON
ALL
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.
284
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_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_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_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.)
have_bdb YES se o mysqld suportar tabelas Berkeley DB. DISABLED se a opo -skip-bdb for usada.
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.
285
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.)
large_file_support Se o mysqld foi compilado com opes para suporte a grandes arquivos.
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
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_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_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_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.
287
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_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.
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.
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.
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.
Alias
Comentrio
OFF
ON
Armazena todos os
SQL_NO_CACHE ....
DEMAND
resultados
exceto
consultas
SELECT
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.
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.
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.
289
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.
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.
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 cliente (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.
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)
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.
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.
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.
291
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.
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.
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.
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.
+---------+------+-------------------------------------------------------------| 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>
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.
Ao ordenar e comparar strings, o seguinte mapeamento feito na string antes de fazer a comparao:
-> 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 .
Adicione MYSET para o final do arquivo sql/share/charsets/Index Associe um nmero nico ao mesmo.
2.
sql/sha-
Ao definir o conjunto de caracteres, cada palavra deve ser um nmero no formato hexadecimal
4.
297
2.
3.
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.
4.
5.
my_strncoll_MYSET()
my_strcoll_MYSET()
my_strxfrm_MYSET()
my_like_range_MYSET()
7.
_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
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.
299
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.
Para tabelas MyISAM, voc pode vericifcar o nome e nmero do conjunto de caracteres para uma tabela com myisamchk -dvv nome_tabela.
myisamchk
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 normalmen300
--basedir=caminho , --core-file-size=#
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, ledir/mysqld
ser usado.
--nice=# (adicionado
-open-files-limit=#
no
MySQL
4.0.14)
--no-defaults
Nmero de arquivos que o mysqld poder abrir. Passado para ulimit -n. Perceba que ser
301
--user=#
O script mysqld_safe gravvel, portanto ele deve estar apto para iniciar um servidor que foi
instalado de uma fonte ou uma verso binria do MySQL, mesmo se o servidor estiver instalado em
localizaes um pouco diferentes. mysqld_safe espera uma destas condies ser verdadeira:
Como o mysqld_safe tentar encontrar o servidor e o banco de dados relativo a seu diretrio de
trabalho, voc pode instalar uma distribuio binria do MySQL em qualquer lugar, desde de que o
mysqld_safe seja iniciado a partir do diretrio da instalao:
shell> cd diretrio_instalao_mysql
shell> bin/mysqld_safe &
Se o mysqld_safe falhar, mesmo se invocado a partir do diretrio de instalao do MySQL, voc
pode modific-lo para usar o caminho para o mysqld e as opes de caminho que seriam corretas
para seu sistema. Perceba que se voc atualizar o MySQL no futuro, sua verso modificada de
mysqld_safe ser sobrescrita, portanto, voc deve fazer uma cpia de sua verso editada para
que voc a possa reinstalar.
vrios deles ao mesmo tempo. (Veja --example). A lista dos GNR podem ser separadas por vrgulas,
ou pelo sinal sinal de menos (-), sendo que o ultimo significa que todos os GNRS entre
GNR1-GNR2 sero afetados. Sem o argumento GNR todos os grupos encontrados sero iniciados,
parados ou listados. Perceba que voc no deve ter nenhum espao em branco na lista GNR. Qualquer coisa depois de um espao em branco ignorado.
mysqld_multi suporta as seguintes opes:
--config-file=...
Arquivo de configurao alternativo. NOTA: Isto no ir afetar as prprias opes do programa
(grupo [mysqld_multi]), mas somente grupos [mysqld#]. Sem esta opo tudo ser procurado a partir do arquivo my.cnf.
--example
Fornece um exemplo de um arquivo de configurao.
--help
Exibe esta ajuda e sai.
--log=...
Arquivo Log. Deve ser informado o caminho completo e o nome do arquivo log. NOTA: se o arquivo existir, tudo ser anexado.
--mysqladmin=...
Binrio mysqladmin a ser usado para o desligamento do servidor.
--mysqld=...
Binrio mysqld a ser usado. Lembre-se que voc tambm pode fornecer mysqld_safe a esta
opo. As opes so passadas ao mysqld. Apenas tenha certeza que o mysqld est localizado na sua varivel de ambiente PATH ou corrija o mysqld_safe.
--no-log
Imprime na sada padro em vez do arquivo log. Por padro o arquivo log sempre fica ligado.
--password=...
Senha do usurio para o mysqladmin.
--tcp-ip
Conecta ao(s) servidor(es) MySQL atravs de porta TCP/IP no lugar de socket UNIX. Isto afeta
a ao de desligar e relatar. Se um arquivo socket estiver faltando, o servidor pode ainda estar
executando, mas s pode ser acessado atravs da porta TCP/IP. Por padro a conexo feita
atravs de socket UNIX.
--user=...
Usurio MySQL para o mysqladmin.
--version
Exibe o nmero da verso e sai.
303
Tenha certeza que o usurio MySQL, que finalizar os servios mysqld (e.g. utilizando o
mysqladmin) tem a mesma senha e usurio para todos os diretrios de dados acessados (para
o banco de dados 'mysql'). E tenha certeza que o usurio tem o privilgio 'Shutdown_priv'! Se
voc possui diversos diretrios de dados e vrios bancos de dados 'mysql' com diferentes senhas
para o usurio 'root' do MySQL, voc pode desejar criar um usurio comum 'multi-admin' para
cada um que utilize a mesma senha (veja abaixo). Exemplo de como fazer isto:
shell> mysql -u root -S /tmp/mysql.sock -psenha_root -e
"GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY 'multipass'"
See Seco 4.3.6, Como o Sistema de Privilgios Funciona.
Voc deve fazer isto para cada servidor mysqld executando em cada diretrio de dados, que
voc tem (Apenas altere o socket, -S=...)
Esteja certo do perigoso de iniciar mltiplos mysqlds no mesmo diretrio de dados. Utilize diretrios de dados diferentes, a menos que voc realmente SAIBA o que est fazendo!
O arquivo de socket e a porta TCP/IP devem ser diferentes para cada mysqld.
O primeiro e quinto grupo mysqld foram intencionalmente deixados de lado no exemplo. Voc
pode ter lacunas no arquivo de configurao. Isto lhe permite mais flexibilidade. A ordem na
qual os mysqlds so iniciados ou desligados depende da ordem em que eles aparecem no arquivo de configurao.
Quando voc desejar referenciar a um grupo especfico utilizando GNR com este programa, basta utilizar o nmero no fim do nome do grupo ([mysqld# <==).
Voc pode desejar utilizar a opo '--user' para o mysqld, mas para isto voc precisa ser o usurio root quando iniciar o script mysqld_multi. No importa se a opo existe no arquivo de
configurao; voc receber apenas um alerta se voc no for o superusurio e o mysqlds for
iniciado com a SUA conta no Unix. IMPORTANTE: Tenha certeza que o pid-file e o diretrio de dados acessvel para leitura e escrita (+execuo para o diretrio) para ESTE usurio
UNIX que iniciar o processo mysqld. NO utilize a conta de root para isto, a menos que voc
SAIBA o que est fazendo!
MAIS IMPORTANTE: Tenha certeza que voc entendeu os significados das opes que so
passadas para os mysqlds e porque VOC PRECISARIA ter processos mysqld separados.
Iniciando mltiplos mysqlds em um diretrio de dados NO IR melhorar a performance em
um sistema baseado em threads.
# Este arquivo provavelmente deve estar em seu diretrio home (~/.my.cnf) ou /et
# Version 2.1 by Jani Tolonen
[mysqld_multi]
mysqld
= /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user
= multi_admin
password
= multipass
[mysqld2]
socket
= /tmp/mysql.sock2
port
= 3307
pid-file
= /usr/local/mysql/var2/hostname.pid2
datadir
= /usr/local/mysql/var2
language
= /usr/local/share/mysql/english
user
= john
[mysqld3]
socket
= /tmp/mysql.sock3
port
= 3308
pid-file
= /usr/local/mysql/var3/hostname.pid3
datadir
= /usr/local/mysql/var3
language
= /usr/local/share/mysql/swedish
user
= monty
[mysqld4]
socket
= /tmp/mysql.sock4
port
= 3309
pid-file
= /usr/local/mysql/var4/hostname.pid4
datadir
= /usr/local/mysql/var4
language
= /usr/local/share/mysql/estonia
user
= tonu
[mysqld6]
socket
= /tmp/mysql.sock6
port
= 3311
pid-file
= /usr/local/mysql/var6/hostname.pid6
datadir
= /usr/local/mysql/var6
language
= /usr/local/share/mysql/japanese
user
= jani
See Seco 4.1.2, Arquivo de Opes my.cnf.
Depois de comapctada, a tabela somente-leitura. Isto , normalmente, pretendido (como quando acessamos tabelas compactadas em um CD). Permitir que se faa gravao em uma tabela
compactada tambm est em nossa lista TODO, mas com baixa prioridade.
myisampack tambm pode compactar colunas BLOB ou TEXT. O antigo pack_isam (para
tabelas ISAM) no pode fazer isto.
305
-b, --backup
Realiza um backup da tabela como nome_tabela.OLD.
-#, --debug=debug_options
Log da sada de depurao.
'd:t:o,nome_arquivo'.
string
debug_options
geralmante
-f, --force
Fora a compactao da tabela mesmo se ela se tornar maior ou se o arquivo temporrio existir.
myisampack cria um arquivo temporrio chamado nome_tabela.TMD enquanto ele compacta a tabela. Se voc matar o myisampack o arquivo .TMD no pode ser removido. Normalmente, myisampack sai com um erro se ele descobrir que nome_tabela.TMD existe. Com
--force, myisampack compacta a tabela de qualquer maneira.
-?, --help
Exibe uma mensagem de ajuda e sai.
-j nome_tabela_grande, --join=nome_tabela_grande
Une todas as tabelas nomeadas na linha de comando em uma nica tabela nome_tabela_grande. Todas tabelas que forem combinadas DEVEM ser idnticas (mesmos
nomes de colunas e tipos, alguns ndices, etc.).
-p #, --packlength=#
Especifica o comprimento do tamanho de armazenamento, em bytes. O valor deve ser 1, 2 ou 3.
(myisampack armazena todas as linhas com ponteiros de tamanhos 1, 2 ou 3 bytes. Na maioria
dos casos normais, myisampack pode determinar o valor correto do tamanho antes de comear
a compactar o arquivo, mas ele pode notificar durante o processo de compactao que ele pode
ter usado um tamanho menor. Neste caso myisampack ir exibir uma nota dizendo que a prxima vez que voc compactar o mesmo arquivo voc pode utilizar um registro de tamanho menor.)
-s, --silent
Modo silencioso. Escreve a sada somente quando algum erro ocorrer.
-t, --test
No compacta realmente a tabela, apenas testa a sua compactao.
-T dir_name, --tmp_dir=dir_name
Utiliza o diretrio especificado como a localizao em que sero gravadas as tabelas temporrias.
-v, --verbose
306
-V, --version
Exibe informao de verso e sai.
-w, --wait
Espera e tenta novamente se a tabela estiver em uso. Se o servidor mysqld foi iniciado com a
opo --skip-locking, no uma boa idia chamar myisampack se a tabela puder ser
atualizada durante o processo de compactao.
A seqncia de comandos mostrados abaixo ilustra uma tpica seo de compactao de tabelas:
shell> ls -l station.*
-rw-rw-r-1 monty
my
994128 Apr 17 19:00 station.MYD
-rw-rw-r-1 monty
my
53248 Apr 17 19:00 station.MYI
-rw-rw-r-1 monty
my
5767 Apr 17 19:00 station.frm
shell> myisamchk -dvv station
MyISAM file:
station
Isam-version: 2
Creation time: 1996-03-13 10:08:58
Recover time: 1997-02-02 3:06:43
Data records:
1192 Deleted blocks:
0
Datafile: Parts:
1192 Deleted data:
0
Datafile pointer (bytes):
2 Keyfile pointer (bytes):
2
Max datafile length:
54657023 Max keyfile length:
33554431
Recordlength:
834
Record format: Fixed length
table description:
Key Start Len Index
Type
Root Blocksize
1
2
4
unique unsigned long
1024
1024
2
32
30 multip. text
10240
1024
Field Start Length Type
1
1
1
2
2
4
3
6
4
4
10
1
5
11
20
6
31
1
7
32
30
8
62
35
9
97
35
10
132
35
11
167
4
12
171
16
13
187
35
14
222
4
15
226
16
16
242
20
17
262
20
18
282
20
19
302
30
20
332
4
21
336
4
22
340
1
23
341
8
24
349
8
25
357
8
26
365
2
27
367
2
28
369
4
29
373
4
30
377
1
31
378
2
32
380
8
307
Rec/key
1
1
33
388
4
34
392
4
35
396
4
36
400
4
37
404
1
38
405
4
39
409
4
40
413
4
41
417
4
42
421
4
43
425
4
44
429
20
45
449
30
46
479
1
47
480
1
48
481
79
49
560
79
50
639
79
51
718
79
52
797
8
53
805
1
54
806
1
55
807
20
56
827
4
57
831
4
shell> myisampack station.MYI
Compressing station.MYI: (1192 records)
- Calculating statistics
normal:
20 empty-space:
16 empty-zero:
12 empty-fill: 11
pre-space:
0 end-space:
12 table-lookups:
5 zero:
7
Original trees: 57 After join: 17
- Compressing file
87.14%
shell> ls -l station.*
-rw-rw-r-1 monty
my
127874 Apr 17 19:00 station.MYD
-rw-rw-r-1 monty
my
55296 Apr 17 19:04 station.MYI
-rw-rw-r-1 monty
my
5767 Apr 17 19:00 station.frm
shell> myisamchk -dvv station
MyISAM file:
station
Isam-version: 2
Creation time: 1996-03-13 10:08:58
Recover time: 1997-04-17 19:04:26
Data records:
1192 Deleted blocks:
0
Datafile: Parts:
1192 Deleted data:
0
Datafilepointer (bytes):
3 Keyfile pointer (bytes):
1
Max datafile length:
16777215 Max keyfile length:
131071
Recordlength:
834
Record format: Compressed
table description:
Key Start Len Index
Type
Root Blocksize
Rec/key
1
2
4
unique unsigned long
10240
1024
1
2
32
30 multip. text
54272
1024
1
Field Start Length Type
Huff tree Bits
1
1
1
constant
1
0
2
2
4
zerofill(1)
2
9
3
6
4
no zeros, zerofill(1)
2
9
4
10
1
3
9
5
11
20
table-lookup
4
0
6
31
1
3
9
7
32
30
no endspace, not_always
5
9
8
62
35
no endspace, not_always, no empty
6
9
9
97
35
no empty
7
9
10
132
35
no endspace, not_always, no empty
6
9
11
167
4
zerofill(1)
2
9
12
171
16
no endspace, not_always, no empty
5
9
13
187
35
no endspace, not_always, no empty
6
9
14
222
4
zerofill(1)
2
9
15
226
16
no endspace, not_always, no empty
5
9
16
242
20
no endspace, not_always
8
9
308
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
262
282
302
332
336
340
341
349
357
365
367
369
373
377
378
380
388
392
396
400
404
405
409
413
417
421
425
429
449
479
480
481
560
639
718
797
805
806
807
827
831
20
20
30
4
4
1
8
8
8
2
2
4
4
1
2
8
4
4
4
4
1
4
4
4
4
4
4
20
30
1
1
79
79
79
79
8
1
1
20
4
4
no endspace, no empty
no endspace, no empty
no endspace, no empty
always zero
always zero
table-lookup
table-lookup
always zero
no zeros, zerofill(1)
no zeros, zerofill(1)
table-lookup
no zeros, zerofill(1)
no zeros
always zero
table-lookup
no zeros, zerofill(1)
no zeros, zerofill(1)
no zeros
always zero
no zeros
always zero
no zeros
always zero
no empty
no empty
no
no
no
no
no
endspace, no empty
empty
empty
endspace
empty
no empty
no zeros, zerofill(2)
no zeros, zerofill(1)
8
5
6
2
2
3
9
10
2
2
2
2
11
3
2
2
2
12
13
2
2
2
2
2
2
2
2
3
3
14
14
15
2
2
16
2
17
3
3
2
2
9
9
9
9
9
9
0
0
9
9
9
9
0
9
9
9
9
0
9
9
9
9
9
9
9
9
9
9
9
4
4
9
9
9
9
9
1
9
9
9
9
normal
O nmero de colunas para qual nenhum empacotamento extra utilizado.
empty-space
O nmero de colunas contendo valores que so somente espaos; estes ocuparo apenas 1 bit.
empty-zero
O nmero de colunas contendo valores que so somente 0's binrios; ocuparo 1 bit.
empty-fill
O nmero de colunas inteiras que no ocupam a faixa completa de bytes de seu tipo; estes so
alteradas para um tipo menor (por exemplo, uma coluna INTEGER pode ser alterada para MEDIUMINT).
pre-space
O nmero de colunas decimais que so armazenadas com espaos a esquerda. Neste caso, cada
309
end-space
O nmero de colunas que tem muitos espaos espaos extras. Neste caso, cada valor conter
uma contagem para o nmero de espaos sobrando.
table-lookup
A coluna tem somente um pequeno nmero de valores diferentes, que so convertidos para um
ENUM antes da compresso Huffman.
zero
O nmero de colunas em que todos os valores esto zerados.
Original trees
O nmero inicial de rvores Huffman.
After join
O nmero de rvores Huffman distintas que sobram depois de unir rvores para poupar espao
de cabealho.
Depois que uma tabela foi compactada, myisamchk -dvv exibe informaes adicionais sobre cada campo:
Type
O tipo de campo deve conter as seguites descries:
constant
Todas linhas tem o mesmo valor.
no endspace
No armazena espaos no fim.
no endspace, not_always
No armazena espaos no fim e no faz compactao de espaos finais para todos os valores.
no endspace, no empty
No armazena espaos no fim. No armazena valores vazios.
table-lookup
A coluna foi convertida para um ENUM.
zerofill(n)
Os n bytes mais significativos no valor so sempre 0 e no so armazenados.
no zeros
No armazena zeros.
always zero
310
Huff tree
A rvore Huffman associada com o campo.
Bits
O nmero de bits usado na rvore Huffman.
Depois de ter executado pack_isam/myisampack voc deve executar o isamchk/myisamchk para recriar o ndice. Neste momento voc pode tambm ordenar os blocos de ndices para
criar estatsticas necessrias para o otimizador do MySQL trabalhar de maneira mais eficiente.
myisamchk -rq --analyze --sort-index nome_tabela.MYI
isamchk
-rq --analyze --sort-index nome_tabela.ISM
Depois de instalar a tabela compactada no diretrio de banco de dados MySQL voc deve fazer
mysqladmin flush-tables para forar o mysqld a iniciar usando a nova tabela.
Se voc desejar descompactar uma tabela compactada, voc pode fazer isto com a opo -unpack para o isamchk ou myisamchk.
Comentrio
--with-server-suffix=-max
--with-innodb
--with-bdb
CFLAGS=-DUSE_SYMDI
R
A opo para habilitar o suporte ao InnoDB necessrio apenas no MySQL 3.23. No MySQL 4 e
acima, o InnoDB j includo por padro.
Voc
pode
encontrar
os
binrios
http://www.mysql.com/downloads/mysql-max-4.0.html.
do
MySQL-max
em
A distribuio binria Windows MySQL 3.23 inclui tanto o binrio mysqld.exe padro e o binrio mysqld-max.exe. http://www.mysql.com/downloads/mysql-4.0.html. See Seco 2.1.1,
Instalando o MySQL no Windows.
Note que como o Berkeley DB (BDB) no est disponvel para todas plataformas, alguns dos binrios Max podem no ter suporte para ela. Voc pode conferir quais tipos de tabelas so suportadas
executando a seguinte consulta:
mysql> SHOW VARIABLES LIKE "have_%";
+------------------+----------+
| Variable_name
| Value
|
+------------------+----------+
| have_bdb
| NO
|
| have_crypt
| YES
|
| have_innodb
| YES
|
| have_isam
| YES
|
311
| have_raid
| NO
|
| have_symlink
| DISABLED |
| have_openssl
| NO
|
| have_query_cache | YES
|
+------------------+----------+
O significado dos valores na segunda coluna so:
Valor
Significado.
YES
NO
DISABLED
A opo xxx est desabilitada porque o mysqld foi iniciado com --skip-xxxx
ou porque no foi iniciado com todas as opes necessrias para habilitar esta opo. Neste caso o arquivo hostname.err deve conter uma razo indicando o porque da opo estar desabilitada.
NOTA: Para conseguir criar tabelas InnoDB voc DEVE editar suas opes de inicializao para
incluir ao menos a opo innodb_data_file_path. See Seco 7.5.2, InnoDB no MySQL
Verso 3.23.
Para obter melhor performance para tabelas BDB, voc deve adicionar algumas opes de configurao para elas tambm .See Seco 7.6.3, Opes de Inicializao do BDB.
mysqld_safe tenta iniciar automaticamente qualquer binrio mysqld com o prefixo -max. Isto
faz com que seja fcil testar um outro binrio mysqld em uma instalao existente. Apenas execute
o configure com as opes deseejadas e, ento, instale o novo binrio mysqld como mysqldmax no mesmo diretrio onde seu antigo binrio mysqld est. See Seco 4.8.2, mysqld-safe,
o wrapper do mysqld.
No Linux, o RPM mysqld-max utiliza o recurso mysqld_safe j mencionado. (Ele apenas instala o executvel mysqld-max e o mysqld_safe usar automaticamente este executvel quando
o mysqld_safe for reiniciado).
A tabela a seguir mostra quais tipos de tabelas nossos binrios MySQL-Max incluem:
Sistema
BDB
InnoDB
Windows/NT
AIX 4.3
HP-UX 11.0
Linux-Alpha
Linux-Intel
Linux-IA-64
Solaris-Intel
Solaris-SPARC
SCO OSR5
UnixWare
Mac OS X
Note que a partir do MySQL 4, voc no precisa de um servidos MySQL Max para o InnoDB porque ele includo por padro.
MySQL
4.9.1. Viso Geral dos Utilitrios e Scripts do Lado do
Cliente
Todos clientes MySQL que comunicam com o servidor utilizando a biblioteca mysqlclient utilizam as seguintes variveis de ambiente:
Nome
Descrio
MYSQL_UNIX_PORT
MYSQL_TCP_PORT
MYSQL_PWD
A senha padro
MYSQL_DEBUG
TMPDIR
Defina a varivel MYSQL_HISTFILE para /dev/null. Para que esta configurao tenha
efeito a cada vez que voc logar, coloque-a em um dos arquivos de inicializao da sua shell.
Todos os programas MySQL podem receber vrias opes diferentes. Entretanto, todo programa
MySQL fornece a opo --help que voc pode utilizar para obter uma descrio completa das diferentes opes do programa. Por exemplo, experimente mysql --help
Voc pode sobrepor todas as opes padres para programas cliente padres com um arquivo de opes. Seco 4.1.2, Arquivo de Opes my.cnf
A lista abaixo descreve resumidamente os programas MySQL:
msql2mysql
Um script shell que converte programas mSQL para MySQL. Ele no lida com todos os casos,
mas ele fornece um bom inicio para a converso.
mysql
A ferramenta de linha de comando para a entrada de consultas interativamente ou a execuo de
consultas a partir de um arquivo no modo batch. See Seco 4.9.2, mysql, A Ferramenta de
Linha de Comando.
313
mysqlcc
Este programa fornece uma interface grfica para interagir com o servidor. server. See Seco 4.9.3, mysqlcc, The MySQL Control Center.
mysqlaccess
Um script que verifica os privilgios de acesso para uma combinao de nome de mquina, usurio e banco de dados.
mysqladmin
Utilitrio para realizar operaes administrativas, tais como criao ou remoo de bancos de
dados, recarga das tabelas de permisses, descarga de tabelas em disco e reabertura dos arquivos
log. mysqladmin tambm pode ser usado para exibir informaes de verso, processos e estado do servidor. See Seco 4.9.4, mysqladmin, Administrando um Servidor MySQL.
mysqlbinlog
Utilitrio para leitura das consultas de um log binrio. Pode ser usado para recuperao de falhas
com um backup antigo. See Seco 4.9.5, mysqlbinlog, Executando as Consultas a Partir de
um Log Binrio.
mysqldump
Descarrega um banco de dados MySQL em um arquivo como instrues SQL ou como arquivo
texto separado por tabulao. Verso aprimorada do freeware escrito originalmente por Igor Romanenko. See Seco 4.9.7, mysqldump, Descarregando a Estrutura de Tabelas e Dados.
mysqlimport
Importa arquivos texto em suas tabelas respectivas utilizando LOAD DATA INFILE. See Seco 4.9.9, mysqlimport, Importando Dados de Arquivos Texto.
mysqlshow
Exibe informaes sobre bancos de dados, tabelas, colunas e ndices.
replace
Um programa utilitrio que usado pelo msql2mysql, mas que tambm pode ser aplicvel
mais genericamente. replace altera conjuntos de caracteres. Utiliza uma mquina de estado finito para comparar strings maiores primeiro. Pode ser usada para trocar conjuntos de caracteres.
Por exemplo, este comando troca a e b nos arquivos dados:
shell> replace a b b a -- arquivo1 arquivo2 ...
sultado apresentado em um formato separado por tabulaes. (O formato de sada pode ser alterado utilizando opes da linha de comando.) Voc pode executar scripts desta forma:
shell> mysql database < script.sql > saida.tab
Se voc tiver problemas devido a memria insuficiente no cliente, utilize a opo --quick! Isto
fora o mysql a utilizar mysql_use_result() no lugar de mysql_store_result() para
recuperar o conjunto de resultados.
Utilizar o mysql muito fci. Inicie-o como mostrado a seguir: mysql banco_de_dados ou
mysql --user=nome_usurio --password=sua_senha banco_de_dados. Digite
uma instruo SQL, termine-a com ';', '\g', ou '\G' e pressione RETURN/ENTER.
O mysql Suporta as seguintes opes:
-?, --help
Exibe esta ajuda e sai.
-A, --no-auto-rehash
Sem reprocessamento automtico. O 'rehash' deve ser usado se o usurio desejar que o cliente
mysql complete as tabelas e campos. Esta opo usada para acelerar a inicializao do cliente.
--prompt=...
Configura o prompt do mysql com o formato especificado.
-b, --no-beep
Deliga o beep nos erros.
-B, --batch
Exibe resultados com o caractere de tabulao como o separador, cada registro em uma nova linha. No utiliza o arquivo de histrico.
--character-sets-dir=...
Diretrio onde os conjuntos de caracteres esto localizados.
-C, --compress
Utiliza compactao no protocolo cliente/servidor.
-#, --debug[=...]
Log de Depurao. O padro 'd:t:o,/tmp/mysql.trace'.
-D, --database=...
Qual banco de dados usar. Isto geralmente util em um arquivo my.cnf.
--default-character-set=...
315
-e, --execute=...
Executa o comando e sai. (Sada parecida com --batch)
-E, --vertical
Exibe a sada de uma consulta (linhas) verticalmente. Sem esta opo voc tambm pode forar
esta sada terminando suas instrues com \G.
-f, --force
Continue mesmo se for obtido um erro SQL.
-g, --no-named-commands
Comandos nomeados sero desabilitados. Utilize somente a forma \*, ou use comandos nomeados apenas no comeo da linha terminada com um ponto-e-vrgula (;). Desde a verso 10.9, o
cliente agora inicia com esta opo habilitada por padro! Com a opo -g, entretando, comandos de formato longo continuaro funcionando na primeira linha.
-G, --enable-named-commands
Comandos nomeados so habilitados. Comandos de formato longo so aceitos assim como os
comandos reduzidos \*.
-i, --ignore-space
Ignore caractere de espao depois de nomes de funes.
-h, --host=...
Conectar mquina especificada.
-H, --html
Produz sada HTML.
-X, --xml
Produz sada XML.
-L, --skip-line-numbers
No escreve o nmero da linha para os erros. til quando se deseja comparar arquivos com resultados que incluem mensagens de erro.
--no-pager
Desabilita paginao e impresso na sada padro. Veja tambm a ajuda interativa (\h).
316
--no-tee
Desabilita arquivo de sada. Veja tambm a ajuda interativa (\h).
-n, --unbuffered
Descarrega e atualiza o buffer depois de cada pesquisa.
-N, --skip-column-names
No escrever nomes de colunas nos resultados.
-o, --one-database
Atualiza somente o banco de dados padro. Isto til para evitar atualizao em outros bancos
de dados no log de atualizaes.
--pager[=...]
Tipo de sada. O padro sua varivel de ambiente PAGER. Paginadores vlidos so: less, more,
cat [>nome_arquivo], etc. Veja tambm a ajuda interativa (\h). Esta opo no funciona no modo batch. A opo pager funciona somente no UNIX.
-p[password], --password[=...]
Senha a ser usada ao conectar ao servidor. Se uma senha no fornecida na linha de comando,
lhe ser solicitado uma. Perceba que se voc utilizar o formato curto -p voc no pode ter um
espao entre a opo e a senha.
-P --port=...
Nmero da porta TCP/IP para usar na conexo.
-q, --quick
No faz cache do resultado, imprime linha a linha. Isto pode deixar o servidor mais lento se a sada for suspendida. No usa arquivo de histrico.
-r, --raw
Exibe valores de colunas sem converso de escapes. Utilizado com --batch
--reconnect
317
Se a conexo perdida, tentar reconectar ao servidor automaticamente (mas apenas uma vez).
-s, --silent
Opo para ser mais silencioso.
-S --socket=...
Arquivo socket para ser utilizado na conexo.
-t --table
Sada no formato de tabela. Isto padro no modo no-batch.
-T, --debug-info
Exibe alguma informao de depurao na sada.
--tee=...
Anexa tudo no arquivo de sada. Veja tambm a ajuda interativa (\h). No funciona no modo
batch.
-u, --user=#
Usurio para login diferente do usurio atual do sistema.
-v, --verbose
Modo verbose (-v -v -v fornece o formato de sada da tabela).
-V, --version
Gera sada com informao de verso e sai.
-w, --wait
Espera e repete em vez de sair se a conexo estiver inacessvel.
Voc tambm pode configurar as seguntes variveis com -O ou --set-variable. Por favor, note que as sintaxes --set-variable=nome=valor e -O name=value esto obsoletas desde
o MySQL 4.0, use --var=option:
Nome Varivel
Padro Descrio
connect_timeout
local-infile
DATA INFILE
max_allowed_packet
net_buffer_length
16384
select_limit
1000
Limite automtico
-safe-updtaes
max_join_size
1000000 Limite automtico para registros em uma join quando utilizar -safe-updtaes.
para
SELECT
quando
utilizar
Se o cliente mysql perder a conexo com o servidor enquanto envia uma consulta, ele tentar se reconectar imediatamente e automaticamente uma vez e enviar a consulta novamente. Note que mesmo se ele obter sucesso na reconexo, como sua primeira conexo foi finalizada, todas seus objetos
da sesso anteriores foram perdidos: tabelas temporrias, e variveis de sesso e de usurio. Desta
forma, o comportamento acima pode ser perigoso para voc, como neste exemplo onde o servidor
foi desligado e reiniciado sem voc saber:
mysql> set @a=1;
Query OK, 0 rows affected (0.05 sec)
mysql> insert into t values(@a);
ERROR 2006: MySQL server has gone away
No connection. Trying to reconnect...
Connection id:
1
Current database: test
Query OK, 1 row affected (1.30 sec)
mysql> select * from t;
+------+
| a
|
+------+
| NULL |
+------+
1 row in set (0.05 sec)
A varivel de usurio @a foi perdida com a conexo e depois da reconexo ela indefinida. Para se
proteger deste risco, voc pode iniciar o cliente mysql com a opo --disable-reconnect.
Se voc digitar 'help' na linha de comando, mysql ir exibir os comandos que ele suporta:
mysql> help
MySQL commands:
help
(\h)
?
(\h)
clear
(\c)
connect
(\r)
delimiter (\d)
edit
(\e)
ego
(\G)
exit
go
nopager
notee
pager
(\q)
(\g)
(\n)
(\t)
(\P)
print
prompt
quit
rehash
source
(\p)
(\R)
(\q)
(\#)
(\.)
status
system
tee
(\s)
(\!)
(\T)
use
(\u)
Voc no tem permisso de utilizar uma instruo UPDATE ou DELETE se voc no possuir
uma chave na parte WHERE. Pode-se, entretanto, forar um UPDATE/DELETE utilizando LIMIT:
UPDATE nome_tabela SET campo_nao_chave=# WHERE campo_nao_chave=# LIMIT 1;
320
Para o log, voc pode utilizar a opo tee. O tee pode ser iniciado com a opo --tee=..., ou
pela linha de comando de maneira interativa com o comando tee. Todos os dados exibidos na tela
sero anexados no arquivo fornecido. Isto tambm pode ser muito til para propsitos de depurao.
O tee pode ser desabilitado da linha de comando com o comando notee. Executando tee novamente o log reiniciado. Sem um parmetro o arquivo anterior ser usado. Perceba que tee ir atualizar os resultados dentro do arquivo depois de cada comando, pouco antes da linha de comando reaparecer esperando pelo prximo comando.
Navegar ou pesquisar os resultados no modo interativo em algum programa do UNIX como o less,
more ou outro similar, agora possvel com a opo --pager[=...]. Sem argumento, o cliente
mysql ir procurar pela varivel de ambiente PAGER e configurar pager para este valor. pager
pode ser iniciado a partir da linha de comando interativa com o comando pager e desabilitado com
o comando nopager. O comando recebe um argumento opcional e e o pager ser configurado
com ele. O comando pager pode ser chamado com um argumento, mas isto requer que a opo -pager seja usada, ou o pager ser usado com a sada padro. pager funciona somente no
UNIX, uma vez que utilizado a funo popen(), que no existe no Windows. No Windows a opo tee pode ser utilizada, entretanto ela pode no ser cmoda como pager pode ser em algumas
situaes.
Algumas dicas sobre pager:
Note a opo -S exibida acima. Voc pode ach-la muito til quando navegar pelos resultados;
experimente com a opo com sada a horizontal (finalize os comandos com \g, ou ;) e com sada vertical (final dos comandos com \G). Algumas vezes um resultado com um conjunto muito
largo difcil ser lido na tela, com a opo -S para less, voc pode navegar nos resultados
com o less interativo da esquerda para a direita, evitando que linhas maiores que sua tela continuem na prxima linha. Isto pode tornar o conjunto do resultado muito mais legvel. voc pode
alterar o modo entre ligado e desligado com o less interativo com -S. Veja o 'h'(help) para
mais ajuda sobre o less.
Voc pode combinar maneiras muito complexas para lidar com os resultados, por exemplo, o seguinte enviaria os resultados para dois arquivos em dois diferentes diretrios, em dois discos diferentes montados em /dr1 e /dr2, e ainda exibe o resultado na tela via less:
mysql> pager cat | tee /dr1/tmp/res.txt | \
tee /dr2/tmp/res2.txt | less -n -i -S
Voc tambm pode combinar as duas funes acima; tenha o tee habilitado, o pager configurado
para 'less' e voc estar apto a navegar nos resultados no less do Unix e ainda ter tudo anexado em
um arquivo ao mesmo tempo. A diferena entre UNIX tee usado com o pager e o tee embutido
no cliente mysql que o tee embutido funciona mesmo se voc no tiver o comando UNIX tee
disponvel. O tee embutido tambm loga tudo que exibido na tela, e o UNIX tee usado com
pager no loga completamente. Por ltimo o tee interativo mais cmodo para trocar entre os
modos on e off, quando voc desejar logar alguma coisa em um arquivo, mas deseja estar apto para
desligar o recurso quando necessrio.
A partir da verso 4.0.2 possvel alterar o prompt no cliente de linha de comando mysql.
Voc pode usar as seguintes opes do prompt:
Opo
Descrio
321
\v
verso mysqld
\d
\h
\p
\u
nome do usurio
\U
nome_usurio@maquina
\\
'\'
\n
\t
tab
espao
\_
espao
\R
\r
\m
minutos
\y
\Y
\D
\s
segundos
\w
\P
am/pm
\o
ms no formato de nmero
\O
\c
'\' seguido por qualquer outra letra apenas retorna aquela letra.
Voc pode definir o prompt nos seguintes lugares:
Varivel de Ambiente
Voc pode configurar o prompt em qualquer arquivo de configurao do MySQL, no grupo
mysql. Por exemplo:
[mysql]
prompt=(\u@\h) [\d]>\_
Linha de Comando
Voc pode definir a opo --prompt na linha de comando para mysql. Por exemplo:
shell> mysql --prompt="(\u@\h) [\d]> "
(usurio@maquina) [banco de dados]>
Interativamente
Voc tambm pode usar o comando prompt (ou \R) para alterar o seu prompt interativamente.
Por exemplo:
322
-?, --help
Exibe esta ajuda e sai.
-b, --blocking_queries
Usa consultas em bloco.
-C, --compress
Usa o protocolo servidor/cliente compactado.
-c, --connection_name=name
Este um sinnimo para --server.
-d, --database=...
Banco de dados a ser usado. Isto til principalmente no arquivo my.cnf.
-H, --history_size=#
Tamanho do histrico para a janiela de consultas.
-h, --host=...
Conecta a uma determinda mquina.
-p[password], --password[=...]
Senha usada ao se conectar ao servidor. Se uma senha no for especificada na linha de comando,
voc dever inform-la. Note que se voc usar a forma simplificada -p no permitido um espao entre a opa e a senha.
323
-g, --plugins_path=name
Caminho para o diretrio onde os plugins do MySQL Control Center estao lacalizados.
-P port_num, --port=port_num
Nmero da porta TCP/IP para uso na conexo.
-q, --query
Abre uma janela de consulta na inicializao.
-r, --register
Abre a caixa de dilogo 'Register Server' na inicializao.
-s, --server=name
Nome da conexo do MySQL Control Center.
-S --socket=...
Arquivo socket usado na conexo.
-y, --syntax
Habilita destque da sintaxe e complementao
-Y, --syntax_file=name
Arquivo de sintaxe para complementao.
-T, --translations_path=name
Caminho para o diretrio onde as tradues do MySQL Control Center esto localizados.
-u, --user=#
Usurio para login se diferente do usurio atual.
-V, --version
Exibe a verso e sai.
Voc tambm pode configurar as seguntes variveis com -O ou --set-variable. Por favor, note que as sintaxes --set-variable=nome=valor e -O name=value esto obsoletas desde
o MySQL 4.0, use --var=option:
Variable Name
Default Description
connect_timeout
local-infile
INFILE
max_allowed_packet
net_buffer_length
16384
select_limit
1000
max_join_size
4.9.4. mysqladmin,
MySQL
Administrando
um
Servidor
create databasename
Cria um novo banco de dados.
drop databasename
Apaga um banco de dados e todas suas tabelas.
extended-status
Fornece uma mensagem extendida sobre o estado do servidor.
flush-hosts
Atualiza todos os nomes de mquinas que estiverem no cache.
flush-logs
Atualiza todos os logs.
flush-tables
Atualiza todas as tabelas.
flush-privileges
Recarrega tabelas de permisses (mesmo que reload).
kill id,id,...
Mata threads do MySQL.
password
Configura uma nova senha. Altera a antiga senha para nova senha.
ping
325
processlist
Exibe lista de threads ativas no servidor, com a instruo SHOW PROCESSLIST. Se a opo -verbose passada, a sada como aquela de SHOW FULL PROCESSLIST.
reload
Recarrega tabelas de permisso.
refresh
Atualiza todas as tabelas e fecha e abre arquivos de log.
shutdown
Desliga o servidor.
slave-start
Inicia thread de replicao no slave.
slave-stop
Termina a thread de replicao no slave.
status
Fornece uma mensagem curta sobre o estado do servidor.
variables
Exibe variveis disponveis.
version
Obtm informao de verso do servidor.
Todos comandos podem ser reduzidos para seu prefixo nico. Por exemplo:
shell> mysqladmin proc stat
+----+-------+-----------+----+-------------+------+-------+------+
| Id | User | Host
| db | Command
| Time | State | Info |
+----+-------+-----------+----+-------------+------+-------+------+
| 6 | monty | localhost |
| Processlist | 0
|
|
|
+----+-------+-----------+----+-------------+------+-------+------+
Uptime: 10077 Threads: 1 Questions: 9 Slow queries: 0
Opens: 6 Flush tables: 1 Open tables: 2
Memory in use: 1092K Max memory used: 1116K
O resultado do comando mysqladmin status possui as seguintes colunas:
Uptime
Threads
Questions
Slow queries
Opens
Flush tables
Open tables
Memory in use
Se voc executa um mysqladmin shutdown em um socket (em outras palavras, em um computador onde o mysqld est executando), mysqladmin ir esperar at que o arquivo-pid do
MySQL seja removido para garantir que o servidor mysqld parou corretamente.
327
A partir do MySQL 4.0.14, mysqlbinlog pode preparar uma entrada para o mysql executar um
LOAD DATA INFILE a partir de um log binrio. Como o log binrio contm os dados para carregar (isto verdade para o MySQL 4.0; o MySQL 3.23 no grava o dado carregado em um log binrio, assim o arquivo original era necessrio quando se queria executar o contedo do log binrio),
mysqlbinlog copiar este data para um arquivo temporrio e imprime um comando LOAD DATA INFILE para o mysql carregar este arquivo temporrio. O local onde o arquivo temorrio
criado o diretrio temporrio por padro; ele pode ser alterado com a opo local-load do
mysqlbinlog.
Antes do MySQL 4.1, mysqlbinlog no podia preaparar sada cabveis para mysql quando o
log binrio continha consultas de diferentes threads usando tabelas temporrias de mesmo nome, se
estas consultas eram entrelaadas. Isto est resolvido no MySQL 4.1.
Voc tambm pode usar o mysqlbinlog --read-from-remote-server para ler o log binrio diretamente de um servidor MySQL remoto. No entanto, isto algo que est obsoleto j que
queremos tornar fcil de se aplicar os logs binrios em servidores MySQL em execuo.
mysqlbinlog --help lhe dar mais informaes
-A, --all-databases
Verifica todos os bancos de dados. Isto o mesmo que --databases com todos os bancos de dados selecionados.
328
-1, --all-in-1
Em vez de fazer uma consulta para cada tabela, execute todas as consultas separadamente para
cada banco de dados. Nomes de tabelas estaro em uma lista separada por vrgula.
-a, --analyze
Anlise as tabelas fornecidas.
--auto-repair
Se uma tabela checada est corrompida, ela corrigida automaticamente. O reparo ser feito depois que todas as tabelas tiverem sido checadas e forem detectadas tabelas corrompidas.
-#, --debug=...
Log de sada de depurao. Normalmente 'd:t:o,filename'
--character-sets-dir=...
Diretrio onde esto os conjuntos de caracteres.
-c, --check
Verifca erros em tabelas
-C, --check-only-changed
Verifica somente tabelas que foram alteradas desde a ltima conferncia ou que no foram fechada corretamente.
--compress
Utilize compresso no protocolo server/cliente.
-?, --help
Exibe esta mensagem de ajuda e sai.
-B, --databases
Para verificar diversos bancos de dados. Perceba a diferena no uso; Neste caso nenhuma tabela
ser fornecida. Todos os argumentos so tratados como nomes de bancos de dados.
--default-character-set=...
Configura o conjunto de caracteres padro.
-F, --fast
Verifica somente as tabelas que no foram fechadas corretamente
-f, --force
Continue mesmo se ns obtermos um erro de sql.
-e, --extended
Se voc estiver utilizando esta opo com CHECK TABLE, ir garantir que a tabela est 100
por cento consistente, mas leva bastante tempo.
Se voc utilizar esta opo com REPAIR TABLE, ele ir executar um comando de reparos na
tabela, que no s ir demorar muito tempo para executar, mas tambm pode produzir muitas linhas de lixo.
329
-h, --host=...
Conecta mquina.
-m, --medium-check
Mais rpido que verificao extendida, mas encontra somente 99.99 de todos os erros. Deve resolver a maioria dos casos.
-o, --optimize
Otimizador de tabelas
-p, --password[=...]
Senha para usar ao conectar ao servidor. Se a senha no for fornecida ser solicitada no terminal.
-P, --port=...
Nmero de porta para usar para conexo.
-q, --quick
Se esta opo for utilizada com CHECK TABLE, evita a busca de registros verificando links errados. Esta a conferncia mais rpida.
Se voc estiver utilizando esta opo com REPAIR TABLE, ela tentar reparar somente a rvore
de ndices. Este o mtodo de reparo mais rpido para uma tabela.
-r, --repair
Pode corrigir quase tudo exceto chaves nicas que no so nicas.
-s, --silent
Exibe somente mensagens de erro.
-S, --socket=...
Arquivo socket para usar na conexo.
--tables
Sobrepe a opo --databases (-B).
-u, --user=#
Usurio para o login, se no for o usurio atual.
-v, --verbose
Exibe informao sobre os vrios estgios.
-V, --version
Exibe informao sobre a verso e sai.
--add-locks
Adicione LOCK TABLES antes de UNLOCK TABLE depois de cada descarga de tabelas. (Para
obter inseres mais rpidas no MySQL.)
--add-drop-table
Adicione um drop table antes de cada instruo create.
-A, --all-databases
Descarrega todos os bancos de dados. Isto ir ser o mesmo que --databases com todos os
bancos de dados selecionados.
-a, --all
Inclui todas as opes do create especficas do MySQL.
--allow-keywords
Permite criao de nomes que colunas que so palavras chaves. Isto funciona utilizando o nome
da tabela como prefixo em cada nome de coluna.
-c, --complete-insert
Utilize instrues de insert completas (com nomes de colunas).
-C, --compress
Compacta todas as informaes entre o cliente e o servidor se ambos suportarem a compactao.
-B, --databases
Para descarregar diversos bancos de dados. Perceba a diferena no uso. Neste caso nenhuma tabela fornecida. Todos argumentos so estimados como nomes de bancos de dados. USE nome_bd; ser includo na sada antes de cada banco de dados novo.
--delayed
331
-e, --extended-insert
Utiliza a nova sintaxe multilinhas INSERT. (Fornece instrues de insero mais compactas e
mais rpidas.)
-#, --debug[=option_string]
Rastreia a utilizao do programa (para depurao).
--help
Exibe uma mensagem de ajuda e sai.
--fields-terminated-by=...
,
--fields-enclosed-by=...
,
-fields-optionally-enclosed-by=... , --fields-escaped-by=... , -lines-terminated-by=...
Estas opes so usadas com a opo -T e tem o mesmo significado que as clusulas correspondentes em LOAD DATA INFILE See Seco 6.4.8, Sintaxe LOAD DATA INFILE.
-F, --flush-logs
Atualiza o arquivo de log no servidor MySQL antes de iniciar a descarga.
-f, --force,
Continue mesmo se obter um erro de SQL durantes uma descarga de tabela.
-h, --host=..
Descarrega dados do servidor MySQL na mquina especificada. A mquina padro localhost.
-l, --lock-tables.
Bloqueia todas as tabelas antes de iniciar a descarga. As tabelas so bloqueadas com READ LOCAL para permitir inseres concorrentes no caso de tabelas MyISAM.
Por favor, note que ao descarregar multiplas tabelas, --lock-tables bloquear as tabelas de
cada banco de dados separadamente. Assim, usar esta opo no garantir que suas tabelas sejam logicamente consistentes entre os banco de dados. Tabela me diferentes bancos de dados podem ser descarregadas em estados completamente diferentes.
-K, --disable-keys
/*!40000 ALTER TABLE nome_tb DISABLE KEYS */; e /*!40000 ALTER TABLE nome_tb ENABLE KEYS */; ser colocado na sada. Isto far com que a carga de dados no MySQL 4.0 server seja mais rpida j que os ndices so criados depois que todos os dados so inseridos.
-n, --no-create-db
'CREATE DATABASE /*!32312 IF NOT EXISTS*/ nome_bd;' no ser colocado
na sada. A linha acima ser adicionada se a opo --databases ou --all-databases
for fornecida.
-t, --no-create-info
No grava informaes de criao de tabelas (A instruo CREATE TABLE.)
-d, --no-data
332
No grava nenhuma informao de registros para a tabela. Isto muito til se voc desejar apenas um dump da estrutura da tabela!
--opt
O mesmo que --quick --add-drop-table --add-locks --extended-insert
--lock-tables. Fornece a descarga mais rpida para leitura em um servidor MySQL.
-pyour_pass, --password[=sua_senha]
A senha para usar quando conectando ao servidor. Se no for especificado a parte
'=sua_senha', o mysqldump ir perguntar por uma senha.
-P port_num, --port=porta_num
O nmero da porta TCP/IP usado para conectar a uma mquina. (Isto usado para conexes a
mquinas diferentes de localhost, na qual sockets Unix so utilizados.)
-q, --quick
No utiliza buffers para as consultas, descarrega diretamente para sada padro. Utilize
mysql_use_result() para fazer isto.
-Q, --quote-names
Coloca os nomes de colunas e tabelas entre '`'.
-r, --result-file=...
Direcione a sada para um determinado arquivo. Esta opo deve ser usada no MSDOS porque
previne a converso de nova linha '\n' para '\n\r' (nova linha + retorno de carro).
--single-transaction
Esta opo envia um comando SQL BEGIN antes de carregar os dados do servidor. Ele mais
til com tabelas InnoDB e nvel READ_COMMITTED de isolao da transao, j que neste modo ela far um dump do estado de consistncia do banco de dados no momento que o BEGIN for
enviado sem bloquear qualquer aplicao.
Ao usar esta opo voc deve manter em mente que ser feito um dump no estado consistente
apenas das tabelas transacionais, ex., qualquer tabela MyISAM ou HEAP na qual for feito um
dump durante est p[o pode ainda mudar de estado.
A opo --single-transaction foi adicionada na verso 4.0.2. Esta opo mutualmente exclusiva com a opo --lock-tables j que LOCK TABLES j faz um commit da transao anterior internamente.
-S /path/to/socket, --socket=/path/to/socket
O arquivo socket que ser utilizado quando conectar localhost (que a mquina padro).
--tables
Sobrepe a opo --databases (-B).
-T, --tab=path-to-some-directory
Cria um arquivo nome_tabela.sql, que contm os comandos SQL CREATE e um arquivo
nome_tabela.txt, que contm os dados, para cada tabela dada. O formato do arquivo .txt
feito de acordo com as opes --fields-xxx e --lines--xxx. Nota: Esta opo s
funciona se mysqldump est sendo executado na mesma mquina que o daemon mysqld. Voc deve usar uma conta MySQL que tem o privilgio FILE, e o login de usurio/grupo com o
qual o mysqld est sendo executado (normalmente usurio mysql, grupo mysql) precisa ter
333
-u user_name, --user=user_name
O nome do usurio do MySQL para usar ao conectar ao servidor. O valor padro seu nome de
usurio no Unix.
-O nome=valor, --set-variable=nome=valor
Confirgura o valor de uma varivel. As variveis possveis so listadas abaixo. Note que a sintaxe --set-variable=nome=valor e -O nome=valor est obsoleto desde o MySQL
4.0. Use --nome=valor.
-v, --verbose
Modo verbose. Exibe mais informaes sobre o que o programa realiza.
-V, --version
Exibe informaes de verso e sai.
-w, --where='where-condition'
Faz um dump apenas dos registros selecionados. Note que as aspas so obrigatrias:
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
-X, --xml
Faz um dump do banco de dados no formato XML
-x, --first-slave
Faz um lock de todas as tabelas de todos os bancos de dados.
--master-data
Como --first-slave, mas tambm exibe algum comando CHANGE MASTER TO o qual,
mais tarde, far o seu slave iniciar a partir da posio certa no log binrio do master, se voc tiver configurado o seu slave usando este dump SQL do master.
maior
que
a
net_buffer_length.
O uso mais comum do mysqldump provavelmente para fazer backups de bancos de dados inteiros. See Seco 4.5.1, Backups dos Bancos de Dados.
mysqldump --opt banco_dados > arquivo-backup.sql
Voc pode ler de volta no MySQL com:
mysql banco_dados < arquivo-backup.sql
ou
334
-?, --help
Exibe uma tela de ajuda e sai
-u, --user=#
Usurio para fazer login no banco de dados
-p, --password=#
Senha para usar ao conectar ao servidor
-P, --port=#
Porta para usar ao conectar ao servidor local
-S, --socket=#
Qual socket usar ao conectando a um servidor local
--allowold
No aborta se o alvo j existir (renomeie-o para _old)
--keepold
No apaga alvos anteriores (agora renomeados) quando pronto
335
--noindices
No inclui arquivos de ndices na cpia para deixar o backup menor e mais rpido. Os ndices
podem ser recostrudos mais tarde com myisamchk -rq..
--method=#
Metdo para copiar (cp ou scp).
-q, --quiet
Seja silencioso exceto em erros
--debug
Habilita depurao
-n, --dryrun
Relata aes sem realiz-las
--regexp=#
Copia todos bancos de dados com nomes que coincidem com a expresso regular
--suffix=#
Sufixo para nomes de bancos de dados copiados
--checkpoint=#
Insere entrada de ponto de controle um uma bd.tabela especificada
--flushlog
Atualiza logs uma vez que todas as tabelas estiverem bloqueadas.
--tmpdir=#
Diretrio Temporrio (em vez de /tmp).
Voc pode utilizar perldoc mysqlhotcopy para obter uma documentao mais completa de
mysqlhotcopy.
mysqlhotcopy l os grupos [client] e [mysqlhotcopy] dos arquivos de opes.
Para poder executar mysqlhotcopy necessrio acesso de escrita ao diretrio de backup, privilgio SELECT nas tabelas que desejar copiar e o privilgio Reload no MySQL (para poder executar
FLUSH TABLES).
336
Para cada arquivo texto passadoo na linha de comando, mysqlimport remove qualquer extenso
do nome do arquivo e utiliza o resultado para determinar para qual tabela os dados do arquivo sero
importados. Por exemplo, arquivos chamados patient.txt, patient.text e patient sero importados para uma tabela chamada patient.
mysqlimport suporta as seguintes opes:
-c, --columns=...
Esta opo recebe uma lista de nomes de campos separados por vrgula como um argumento. A
lista de campos utilizada para criar um comando LOAD DATA INFILE adequado que ento
passado ao MySQL. See Seco 6.4.8, Sintaxe LOAD DATA INFILE.
-C, --compress
Compacta todas as informaes entre o cliente e o servidor se ambos suportarem compresso.
-#, --debug[=option_string]
Rastreia o programa (para depurao).
-d, --delete
Esvazie a tabela antes de importar o arquivo texto.
--fields-terminated-by=...
,
--fields-enclosed-by=...
,
-fields-optionally-enclosed-by=... , --fields-escaped-by=... , -lines-terminated-by=...
Estas opes tem o mesmo significado que as clusulas correspondentes para LOAD DATA
INFILE. See Seco 6.4.8, Sintaxe LOAD DATA INFILE.
-f, --force
Ignorar erros. Por exemplo, se uma tabela para um arquivo texto no existir, continue processando quaisquer arquivos restantes. Sem --force, mysqlimport sai se uma tabela no existir.
--help
Exibe uma mensagem de ajuda e sai.
-h host_name, --host=host_name
Importa dados para o servidor MySQL na mquina referida. A mquina padro localhost.
-i, --ignore
Veja a descrio para a opo --replace.
--ignore-lines=n
Ignora as primeiras n linhas do arquivo de dados.
-l, --lock-tables
Bloqueia TODAS as tabelas para escrita antes de processar qualquer arquivo texto. Isto garante
que todas as tabelas so sincronizadas no servidor.
-L, --local
L arquivos de entrada do cliente. Por padro, assumido que os arquivos texto esto no servidor se voc conectar localhost (mquina padro).
337
-pyour_pass, --password[=sua_senha]
Senha para conectar ao servidor. Se voc no especificar a parte '=sua_senha', o mysqlimport ir pedir por uma senha.
-P port_num, --port=port_num
O nmero da porta TCP/IP para usar quando conectar a uma mquina.
-r, --replace
As opes --replace e --ignore controlam o tratamento de registros de entrada que duplicam registros existentes em valores de chaves nicas. Se voc especificar --replace, novos
registros substituiro registros que tiverem o mesmo valor na chave unica. Se voc especificar -ignore, registros de entrada que duplicariam um registro existente em um valor de chave
nica so saltados. Se voc no especificar nenhuma das duas opes, um erro ocorrer quando
um valor de chave duplicado for encontrado e o resto do arquivo texto ser ignorado.
-s, --silent
Modo silencioso. Gera sada somente quando ocorrer algum erro.
-S /path/to/socket, --socket=/path/to/socket
O arquivo socket para usar ao conectar localhost (mquina padro).
-u user_name, --user=user_name
O nome de usurio MySQL para usar ao conectar ao servidor. O valor padro seu nome de
usurio atual no Unix.
-v, --verbose
Modo verbose. Gera mais informaes na sada.
-V, --version
Exibe informao sobre a verso e sai.
0
\n
Se nenhuma coluna for fornecida, todas colunas e tipos de colunas encontrados na tabela so
exibidos.
Note que em verses mais novas do MySQL, voc s visualiza as tabelas/bancos de dados/colunas
para quais voc tem algum privilgio.
Se o ltimo argumento conter uma shell ou um meta-caracter do SQL, (*, ?, % ou _) somente o que
coincidir com o meta-caracter exibido. Se um banco de dados conter underscore (_), eles devem
ser precedidos por uma barra invertida (algumas shells de Unix iro exigir duas), para se obter tabelas/colunas apropriadamente. '*' so convertidos em metacaracteres '%' do SQL e '?' em metacaracteres '_' do SQL. Isto pode causar alguma confuso quando algum tentar exibir as colunas para uma
tabela com um _, neste caso o mysqlshow exibe somente os nomes de tabelas que casarem com o
padro. Isto facilmente corrigido adicionando um % extra na linha de comando (como um argumento separador).
--cflags
Parmetros de compilao para encontrar arquivos includos e parmetros e definies de compiladores criticos usados ao compilar a biblioteca libmysqlclient.
--include
Opes de compilador para encontrar arquivos de incluso do MySQL. (Normalmente se usaria
--cflags em vez disto)
339
--libs
Bibliotecas e opes exigidas para ligar com a biblioteca cliente do MySQL.
--libs_r
Bibliotecas e opes exigidas para ligar a biblioteca cliente do MySQL segura com thread.
--socket
O nome socket padro, definido ao configurar o MySQL.
--port
O nmero da porta padro, definida ao configurar o MySQL.
--version
Nmero da verso da distribuio MySQL.
--libmysqld-libs ou --embedded
Bibliotecas e opes exigidas para ligar com o servidor embutido MySQL.
Se voc executar mysql_config sem nenhuma opo ele exibir todas as opes suportadas mais
os valores de todas elas:
shell> mysql_config
Usage: /usr/local/mysql/bin/mysql_config [OPTIONS]
Options:
--cflags
[-I/usr/local/mysql/include/mysql -mcpu=pentiumpro]
--include
[-I/usr/local/mysql/include/mysql]
--libs
[-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lcrypt
--libs_r
[-L/usr/local/mysql/lib/mysql -lmysqlclient_r -lpthread
--socket
[/tmp/mysql.sock]
--port
[3306]
--version
[4.0.16]
--libmysqld-libs [-L/usr/local/mysql/lib/mysql -lmysqld -lpthread -lz -l
Voc pode us-lo para compilar o cliente MySQL como a seguir:
CFG=/usr/local/mysql/bin/mysql_config
sh -c "gcc -o progname `$CFG --cflags` progname.c `$CFG --libs`"
Error code
64:
Description
O log de erros
O log isam
Armazena todas as instrues que alteram qualquer coisa. Usada tambm para
replicao.
O log para consul- Armazena todas queries que levaram mais de long_query_time segundos
tas lentas
para executar ou que no usaram ndices.
Todos logs podem ser encontrados no diretrio de dados do mysqld. Voc pode forar o mysqld
a reabrir os arquivos de log (ou em alguns casos trocar para um novo log) executando FLUSH
LOGS. See Seco 4.6.4, Sintaxe de FLUSH.
A arquivo de log de erro contm informaes indicando quando o mysqld foi iniciado e finalizado
e tambm qualquer erro crtico encontrado na execuo.
Se o mysqld finaliza inesperadamente e o mysqld_safe precisar reiniciar o mysqld,
mysqld_safe gravar uma linha restarted mysqld neste arquivo. Este log tambm guarda
um aviso se o mysqld notificar uma tabela que precisa ser automaticamente verificada ou reparada.
Em alguns sistemas operacionais, o log de erro ir conter registros de pilha de onde o mysqld finalizou. Isto pode ser usado para saber onde e como o mysqld morreu. See Seco E.1.4, Usando
Stack Trace.
A partir do MySQL 4.0.10 voc pode especificar onde o mysqld armazena o arquivo de log de erro
com a opo --log-error[=filename]. Se nenhum nome de arquivo for dado, o mysqld
usar mysql-data-dir/'maquina'.err no Unix e \mysql\data\mysql.err no Windows.i Se voc executar flush logs o arquivo antigo ter o prefixo --old e o mysqld criar
um novo arquivo de log vazio.
Em verses mais antigas do MySQL o tratamento do log de erro era feito pelo mysqld_safe o
qual redirecionava o arquivo de erro para 'maquina'.err. Pode se alterar este nome de arquivo
com a opo --err-log=nome_arq.
Se voc no especificar --log-error ou se voc utilizar a opo --console, o erro ser escrito em stderr (o terminal).
No Windows a sada sempre feita no arquivo .err se --console no for utilizado.
342
NOTA: Para o esquema acima funcionar, voc no pode criar seus prprios arquivos com o mesmo
nome que os do log de atualizao + algumas extenses que podem ser tratadas como nmeros, no
diretrio usado pelo log de atualizao!
Se forem utilizadas as opes --log ou -l, o mysqld escreve um log geral com o nome de arquivo nome_mquina.log, e o reinicio e a recarga no geram um novo arquivo de log (embora ele
seja fechado e reaberto). Neste caso voc pode copi-lo (no Unix) usando:
mv nome_mquina.log nome_mquina-antigo.log
mysqladmin flush-logs
cp nome_mquina-antigo.log para-diretrio-backup
rm nome_mquina-antigo.log
O log de atualizao inteligente pois registra somente instrues que realmente alteram dados.
Portanto, um UPDATE ou um DELETE com uma clusula WHERE que no encontre nenhum registro
no escrito no log. Ele salta at instrues UPDATE que atribui a uma coluna o mesmo valor que
ela possuia.
O registro da atualizao feito imediatamente aps uma consulta estar completa mas antes que as
bloqueios sejam liberados ou que algum commit seja feito. Isto garante que o log seja escrito na ordem de execuo.
Se voc desejar atualizar um banco de dados a partir de arquivos de logs de atualizao, voc pode
fazer o seguinte (assumindo que seus logs de atualizao estejam nomeados na forma nome_arquivo.###):
shell> ls -1 -t -r nome_arquivo.[0-9]* | xargs cat | mysql
ls utilizado para obter todos os arquivos de log na ordem correta.
Isto pode ser til se voc tiver que recorrer a arquivos de backup depois de uma falha e desejar refazer as atualizaes que ocorreram entre a hora do backup e a falha.
343
Se voc fornecer uma extenso --log-bin=nome_arquivo.extenso, a extenso ser removida sem aviso.
O mysqld ir acrescentar uma extenso ao nome de arquivo do log binrio que um nmero que
incrementado cada vez que mysqladmin refresh, mysqladmin flush-logs, a instruo
FLUSH LOGS forem executados ou o servidor for reiniciado. Um novo log binrio tambm ser automaticamente criado quando o tamanho do log atual alcanar max_binlog_size. 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 grnades transaes, voc
pode ter logs binrios maiores que max_binlog_size.
Voc pode deletar todos os arquivos de log binrio com o comando RESET MASTER (see Seco 4.6.5, Sintaxe de RESET), ou apenas alguns deles com PURGE MASTER LOGS (see Seco 4.11.7, Instrues SQL para Controle do Servidor Master).
Voc pode utilizar as seguintes opes ao mysqld para afetar o que documentado pelo log binrio (tenha certeza de ler as notas que seguem esta tabela):
Opo
Descrio
binlogdo-db=nome_banco_dados
Diz ao master que ele deve registrar atualizaes no log binrio se o banco de dado atual (ex.: aquele selecionado por
USE) 'nome_banco_dados'. Todos os outros bancos de dados que no forem explicitamente mencionados so ignorados. Note que se voc utiliz-lo voc deve se assegurar que
voc s faz atualizaes no banco de dados atual. (Exemplo:
binlog-do-db=algum_bancodados) Exemplo do que
no funciona como voc poderia esperar: se o servidor iniciado com binlog-do-db=sales, e voc fizer USE
prices; UPDATE sales.january SET amount=amount+1000;, esta consulta no ser gravada no
log binrio.
binlog-ignore-db=nome_banco_dados
As regras esto avaliadas na seguinte ordem, para decidir se a consulta deve ser escrita no log binrio ou no:
1.
2.
3.
4.
Sim: O banco de dados atual se encaixa em qualquer uma das regras binlog-do-db?
Existem algumas regras binlog-ignore-db. O banco de dados atual se encaixa em qualquer uma das regras binlog-ignore-db?
345
O max_binlog_cache_size (padro 4G) pode ser usado para restringir o tamanho total usado
para armazenar uma consulta multi-transacional. Se uma transao maior que isto ela falhar e far
um roll back.
Se voc estiver utilizando o log de atualizao ou o binrio, inseres concorrentes no funcionaro
juntas com CREATE ... INSERT e INSERT ... SELECT. Isto para garantir que voc possa
recriar uma cpia exata de suas tabelas aplicando o log em um backup.
Se o log padro (--log) ou log de consultas lentas (--log-slow-queries) forem utilizados, fecha e reabre o arquivo de log. (mysql.log e `hostname`-slow.log como padro).
346
Se voc s estiver utilizando o log de atualizao, voc tem apenas que atualizar os logs e ento mover os arquivos de log antigos para um backup. Se voc estiver utilizando o log normal, voc pode
fazer algo assim:
shell> cd diretrio-dados-mysql
shell> mv mysql.log mysql.old
shell> mysqladmin flush-logs
e ento fazer um backup e remover o mysql.old.
4.11.1. Introduo
A partir da verso 3.23.15, o MySQL suporta replicao de uma via internamente. Um servidor atua
como o master, enquando o outro atua como slave. O servidor master mantm um log binrio de
atualizaes (see Seco 4.10.4, O Log Binrio). mantido tambm um arquivo de ndices dos
logs binrios para manter os registro da rotatividade dos logs. Cada slave, na conexo, informa ao
master onde parou desde a ltima atualizao propagada com sucesso, realiza a atualizao e ento
para e espera o master informar sobre novas atualizaes.
Um slave tambm pode ser um master se voc condigurar uma cadeia de servidores em replicao.
Note que se voc estiver usando replicao, todas atualizaes nas tabelas replicadas devem ser realizadas no servidor master. Seno, voc sempre deve ter cuidados para evitar conflitos entre as atualizaes que os usurios enviam ao master e aquelas que os usurios enviam ao slave.
Replicao de uma via trazem benefcios de robustez, velocidade e administrao do sistema:
A velocidade extra alcanada dividindo a carga das consultas dos clientes em processamento
para entre os servidores master e slave, resultando em melhor tempo de resposta. Consultas SELECT podem ser enviadas para o slave para reduzir a carga do processamento das consultas do
master. Consultas que modificam dados devem ainda ser enviados para o master e slave para no
ficarem fora de sincronia. Esta estratgia de balancemento de carga efetiva se consultas que
no sejam de atualizao dominarem, mas este o caso normal.
Outro benefcio de utilizar replicao que pode-se obter backups intantneos do sistema fazendo backups no slave em vez de faz-los no master. See Seco 4.5.1, Backups dos Bancos de
Dados.
Master
Master
Master
4.0.1
4.0.3 e posterior
Slave
no
no
no
Slave
4.0.0
no
sim
no
no
Slave
4.0.1
sim
no
sim
no
Slave
4.0.3 e posterior
sim
no
no
sim
Como regra geral, sempre recomendado usar verses MySQL recentes, porque as capacidades de
replicao esto sendo continuamente melhoradas. Com relao a verso 4.0, recomendamos usar a
mesma verso para o master e o slave, com exceo de que o 4.0.2 no recomandado para replicao.
Note qye quando voc atualiza um mestre do MySQL 3.23 para o MySQL 4.0 (ou 4.1) voc no deve reiniciar a replicao usando o log binrio antigo da verso 3.23, porque isto infelizmente deixa o
slave 4.0 confuso. A atualizao pode seguramente feita deste modo, assumindo que voc tenha uma
mestre 3.23 para atualizar e voc tenha slaves 4.0:
1.
2.
Espere at que todos os slaves tenham buscados todas as alteraes pelo master (use SHOW
MASTER STATUS no master, e SELECT MASTER_POS_WAIT() nos slaves). Ento execute STOP SLAVE nos slaves.
3.
4.
Reinicie o MySQL no master. Grave o nome <name> do log binrio mais recentemente criado
do master. Voc pode obter o nome dos arquivos executando SHOW MASTER STATUS no
master. Ento envie estes comando em cada slave:
mysql> CHANGE MASTER TO MASTER_LOG_FILE='<name>', MASTER_LOG_POS=4;
mysql> START SLAVE;
Se voc tambm deve atualizar seus slaves da verso 3.23 para 4.0, voc deve primeiro atualizar
seus slaves: Desligue cada um, atualize-os e os reinicie. Ento atualize o master como descrito.
A partir da verso 4.0.0, pode se usar LOAD DATA FROM MASTER para configurar um escrao. Esteja certo que LOAD DATA FROM MASTER funciona atualmente apenas se todas as tabelas no
master so do tipo MyISAM. Alm disso, estas instruo iro adquirir lock global de leitura, assim
nenhuma escrita ser possvel enquanto as tabelas esto sendo transferidas do master. Quando implementarmos hot backup de tabelas sem lock (no MySQL 5.0), este lock global de leitura no ser
mais necessrio.
Devido a estas limitaes, recomendamos que voc s use LOAD DATA FROM MASTER se o conjunto de dados de master for relativamente pequeno, ou se um lock de leitura prolongado no master
aceitvel. Enquanto a velocidade atual do LOAD DATA FROM MASTER pode variar de sistema
348
para sistema, uma boa regra do dedo de quanto tempo ser necessrio considerar 1 segundo por 1
MB do arquivo de dados. Voc ficar prximo da estimativa se tanto o master quanto o slave forem
equivalentes a um Pentium 700 Mhz e estiverem conectado a uma rede de 100 MBits/s. claro, esta
apenas uma estimativa grosseira da ordem de magnitude.
Uma vez que o slave foi configurado corretamente e est em execuo, ele simplesmente conectar
ao master e esperar por atualizaes nos processos. Se o master for desligado ou o slave perder conectividade com seu master, ele tentar conectar periodicamente at conseguir reconectar e constinuar as atualizaes. O intervalo de tentativa controlado pela opo -master-connect-retry. O padro 60 segundos.
Cada slave mantm registro de onde parou. O servidor master no tem conhecimento de quandos
slaves existem ou quais esto atualizados em um determinado momento.
Time: 11
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
Aqui a thread 2 est no master. A thread 10 a thread de E/S no slave. A thread 11 a thread de
SQL no slave; note que o valor na coluna Time pode dizer quando o slave comparado com o master (see Seco 4.11.9, FAQ da Replicao).
A lista a seguir mostra os estados mais comuns que voc ver na coluna State para a thread Binlog Dump do master. Se voc no ver estas threads em um servidor master, a replicao no est
sendo executada.
Aqui esto os estados mais comuns que voc ver na coluna State para a thread de E/S de um servidor slave. A partir do MySQL 4.1.1, este estado tambm aparece na coluna Slave_IO_State
da sada de SHOW SLAVE STATUS. Isso significa que voc pode ter uma boa viso do que est
acontecendo apenas com SHOW STATUS SLAVE.
Connecting to master.
Conectando ao master.
Waiting for the slave SQL thread to free enough relay log space
Voc est usando um valor relay_log_space_limit diferente de zero e os relay logs tem
crescido tanto que o seu tamanho combinado excedem este valor. A thread E/S ento espera at
que a thread SQL libere espao suficiente deletando o contedo dos relay logs e assim poder deletar alguns arquivos de relay logs.
Aqui esto os estado mais comuns que voc ver na coluna State para a thread de SQL de um servidor slave:
Has read all relay log; waiting for the slave I/O thread to update it
A thread processou todos os eventos nos arquivos de relay logs e est esperando a thread de E/S
gravar novos eventos no relay log.
A coluna State para a thread de E/S tambm podem mostrar um string de consulta. Isto indica que
a thread leu um evento do relay log, extraiu a conulta dele e est a est executando.
Antes do MySQL 4.0.2, as threads de E/S e SQL eram combinadas em uma s e nenhum relay log
era usado. A vantagem do uso de duas threads que elas separam a leitura e a execuo da consulta
em duas tarefas independentes, e assim o trabalho de leitura da consulta no se torna lento se a execuo da consulta for lento. Por exemplo, se o servidor slave no estiver em execuo por um instante, a sua thread de E/S pode rapidamente buscar todos o contedo dos logs binrios do master
351
quando o slave iniciar, mesmo se a thread de SQL demorar e levar horas para pegar os logs. Se o
slave parar antes da thread SQL executar todas as consultas buscadas, a thread de E/S ter finalmente buscado tudo e assim um cpia segura das consultas estar armazenada localmente nos relay logs
do slave para execuo na prxima execuo do slave. Isto permite que os log binrios sejam apagados no master, j que no h mais necessidade de esperar que o slave busque o contedo deles.
Por padro, relay logs so nomeados usando nome de arquivos da forma
host_name-relay-bin.nnn, onde host_name o nome da mquina servidora slave e nnn
uma sequncia numrica. Arquivos de relay logs sucvessivos so criados usando uma sequncia de
nmeros sucessiva, comeando com 001. O slave mantm registro dos relay logs em uso atualmente em um arquivo de ndice. O nome de arquivo padro dos relay logs
host_name-relay-bin.index. Por padro estes arquivos so criados no diretrio de dados
do slave. O nome de arquivo padro pode ser sobrescrito com as opes --relay-log e -relay-log-index do servidor.
Relay logs tm o mesmo formato dos logs binrios, assim ele podem ser lidos com mysqlbinlog.
Um relay log automaticamente deletado pela thread de SQL to logo no seja mais necessria (ex.:
assim que tiver sido executado todos os seus eventos). No existem comandos para deletar relay
logs j que a thread SQL cuida de faz-lo. No entanto, a partir do MySQL 4.0.14, FLUSH LOGS rotaciona os relay logs), o que ir influenciar quando a thread de SQL delet-los.
Um novo relay log criado sob as seguintes condies:
A primeira vez que a thread de E/S inicia depois que o servidor slave inicia (No MySQL 5.0, um
novo relay log ser criado a cada vez que a thread de E/S inicia, no apenas pela primeira vez.)
O tamanho do relay log atual se torna muito grande. O significado de ``muito grande'' determinado da seguinte forma:
Um servidor de replicao slave cria dois arquivos pequenos no diretrio de dados. Estes arquivos
so chamados master.info e relay-log.info por padro. Eles possuem informao como
aquela mostrada na sada da instruo SHOW SLAVE STATUS (see Seco 4.11.8, Instrues
SQL para Controle do Servidor Slave para uma descrio deste comando). Como imagem de discos, eles sobrevivem ao desligamento do slave. A prxima vez que o slave reiniciado, ele pode ler
estes arquivos para saber o quanto ele processou do log binrio do master e do seus prprios relay
logs.
O arquivo master.info atualizado pela thread de E/S.
A correspondncia entre as linhas do arquivo e as colunas mostradas por SHOW SLAVE STATUS
aparece a seguir:
Li- Descrio
nh
a
1
Master_Log_File
Read_Master_Log_Pos
Master_Host
Master_User
Master_Port
Connect_Retry
352
Relay_Log_File
Relay_Log_Pos
Relay_Master_Log_File
Exec_Master_Log_Pos
Quando voc faz backup dos dados de seu slave, voc deve fazer backup destes 2 pequenos arquivos, junto com seus relay logs pois eles so necessrios para continuar a replicao depois que voc
restaurar os dados do slave. Se voc perder os seus relay logs mas ainda tiver o arquivo relaylog.info, voc pode verifclos para determinar por quanto tempo a thread de SQL executou no
log binrio do master. Ento voc pode usar CHANGE MASTER TO com as opes MASTER_RELAY_LOG e MASTER_RELAY_POS para dizer ao slave para reler os log binrios a partir
deste ponto. Isto exige que o log binrio ainda exista no servidor master. claro.
Se seu slave est sujeito a replicao de instrues LOAD DATA INFILE, voc tambm deve fazer
backup dos arquivos SQL_L0AD-* que podem existir no diretrio que o slave utiliza para este propsito. O slave precisar destes arquivos para continuar a replicao de qualquer instruo LOAD
DATA INFILE interrompido.
A localizao do diretrio especificada usando a opo --slave-load-tmpdir. Seu valor padro, se no especificado, o valor da varivel tmpdir.
Certifique-se que voc possui uma verso recente do MySQL instalado no servidor master e
no(s) slave(s), e que estas verses so compatveis de acordo com a tabela mostrada em Seco 4.11.2, Viso Geral da Implementao da Replicao.
Por favor no relate os erros at que voc tenha verificado que o problema est presente na ltima distribuio.
2.
Configure uma conta no servidor master com o com a qual o slave possa se conectar. Deve ser
353
dada a esta conta o privilgio REPLICATION SLAVE. (Se a verso do MySQL for anterior a
4.0.2, de conta o privilgio FILE.) Se a conta somente para a replicao (o que recomendvel), ento voc no precisar fornecer nenhum privilgio adicional para ele.
O nome de mquina no nome da conta deve ser aquele usado por cada um dos servidores slaves
para conectar ao master. Por exemplo, para criar um usurio chamado repl que pode acessar
seu master de qualquer mquina, voc deve utilizar este comando:
3.
Conceda o privilgio SELECT em todas as tabelas que voc deseja carregar. Qualquer das
tabelas master nas quais a conta no possa fazer um SELECT sero ignoradas por LOAD
DATA FROM MASTER.
Se voc estiver usando tabelas MyISAM, descarregue todas as tabelas e bloqueie as consultas
de escrita executando o comando FLUSH TABLES WITH READ LOCK
mysql> FLUSH TABLES WITH READ LOCK;
e faa uma cpia de todos os dados existentes em seu servidor master.
A maneira mais fcil de fazer isto simplesmente usar um programa (tar no Unix, PowerArchiver, WinRAR, WinZip ou qualquer outro software similar no Windows) para produzir um arquivo de banco de dados no diretrio de dados do seu master. Por exemplo, para usar
tar que cria um arquivo que inclui todos os bancos de dados, altere a localizao no diretrio
de dados do servidor master, e ento execute este comando:
shell> tar -cvf /tmp/mysql-snapshot.tar .
Se voc quiser que o arquivo inclua apenas um banco de dados chamado estebd, utilize este
comando:
shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db
Ento copie o arquivo para o diretrio /tmp na mquina servidora slave. Naquela mquina, altere a localizao em um diretrio de dados do slave e desempacote o arquivo usando este comando:
shell> tar -xvf /tmp/mysql-snapshot.tar
Voc pode no desejar replicar o banco de dados mysql. Se no, voc pode exclu-lo do arquivo. Voc tambm no precisa incluir qualqer arquivo de log nos arquivos master.info ou
relay-log.info.
Enquanto o lock de leitura colocado por FLUSH TABLES WITH READ LOCK estiver em
funcionando, leia o valor atual do nome do log binrio e offset no master:
mysql > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File
| Position | Binlog_Do_DB | Binlog_Ignore_DB |
354
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73
| test,bar
| foo,manual,mysql |
+---------------+----------+--------------+------------------+
1 row in set (0.06 sec)
A coluna File exibe o nome do log, enquanto Position exibe o offset. No exemplo acima,
o valor do log binrio mysql-bin.003 e o offset 73. Grave os valores. Voc precisar
us-los mais tarde quando estiver configurando o slave.
Uma vez realizada a cpia e gravado o nome do log e offset, voc pode reabilitar a atividade de
escrita no master:
mysql> UNLOCK TABLES;
Se voc estiver usando tabelas InnoDB, voc deve usar a ferramente InnoDB Hot Backup que
est disponvel para aqueles que compraram as licenas comerciais do MySQL, suporte ou a
prpria ferramenta de backup. Ele faz uma cpia consistente sem fazer nenhum lock no servidor master, e grava o nome do log e o offset correspondente em um snapshot para ser usado
postriormente no slave. Mais informaes sobre esta ferramenta esta disponvel em
http://www.innodb.com/order.php.
Sem a ferramenta Hot Backup, o modo mais rpido para tirar uma cpia das tabelas InnoDB
desligar o servidor master e copiar os arquivos e logs de dados do InnoDB e os arquivos de definio de tabela (.frm). Para gravar o nome e offset do arquivo de log atual voc deve fazer o
seguinte antes de desligar o servidor:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
E ento grave o nome e offset do log da sada de SHOW MASTER STATUS como mostrado
anteriormente. Uma vez gravado o nome e o offset do log, desligue o servidor sem destravar as
tabelas para se certificar que ele finalizar com a cpia correspondente ao arquivo de log e offset:
shell> mysqladmin -uroot shutdown
Uma alternativa para tabelas MyISAM e InnoDB fazer um dump SQL do master em vez de
uma cpia binria como acima; para isso voc pode usar mysqldump --master-data em
seu master e mais tarde executar o dump SQL em seu slave. No entanto, isto mais lento que
fazer a cpia binria.
Se o master foi executado anteriormente sem o --log-bin habilitado, os valores do nome do
log e da posio mostrados por SHOW MASTER STATUS ou mysqldump estaro vazios.
Neste caso, grave a string vazia ('') para o nome do log e 4 para o offset.
4.
Assegure-se que a seo [mysqld] do arquivo my.cnf no master inclui a opo log-bin.
Esta seo tambm deve conter a opo server-id=unique number, onde master_id
deve ser um valor inteiro entre 1 e 2^32 - 1. Por exemplo:
[mysqld]
log-bin
server-id=1
Se estas opes no esto presentes, adicione-as e reinicie o servidor.
5.
Pare o servidor que ser usado como slave e adicione o seguinte ao arquivo my.cnf:
[mysqld]
server-id=slave_id
355
O valor slave_id, como o valor master_id, deve ser um valor inteiro de 1 to 2^32 - 1.
Adicionalmente, muito importante que o ID do slave seja diferente do ID do master. Por
exemplo:
[mysqld]
server-id=2
Se voc estiver usando vrios servidores, cada um deve ter um valor server-id que seja diferente daquele do master e de cada um dos slaves. Pense nos valores de server-id como
algo similar ao endereo IP: Estes IDs identificam de forma nica cada instncia de servidor na
comunidade dos parceiros de replicao.
Se voc no quiser especificar um server-id, ele ser configurado com 1 se voc no tiver
definido master-host, seno ele ser definido com 2. Note que no caso de omisso do
server-id, um master ir recusar conexes de todos os slaves e um slave ir recusar se conectar a um master. Assim, omitir server-id s bom para backups com um log binrio.
6.
Se voc fizer um backup birio dos dados do servidor master, copie-o para o diretrio de dados
do servidor slave antes de inici-lo. Certifique-se que os privilgios nos arquivos e diretrios
esto corretos. O usurio com o qual o MySQL executa precisa estar apto a l-los e alter-los,
assim como no master.
Se voc fizer um backup usando mysqldump, inicie o slave primeiro (veja o prximo passo).
7.
Inicie o servidor slave. Se ele tiver sido replicado previamente, inicie o servidor slave com a
opo --skip-slave-start. Voc tambm pode querer iniciar o servidor slave com a opo --log-warnings. Deste modo voc ir obter mais mensagens sobre problemas (por
exemplo, problemas de rede, ou conexo).
8.
Se voc fez um backup dos dados do servidor master usando mysqldump, carregue o arquivo
de dump no servidor slave:
shell> mysql -u root -p < dump_file.sql
9.
Execute os seguintes comandos no slave, substutitua os valores dentro de <> com o os valores
atuais relevantes ao ser sistema:
mysql> CHANGE MASTER TO
->
MASTER_HOST='<master host name>',
->
MASTER_USER='<replication user name>',
->
MASTER_PASSWORD='<replication password>',
->
MASTER_LOG_FILE='<recorded log file name>',
->
MASTER_LOG_POS=<recorded log offset>;
A tabela a seguir lista o tamanho mximo da string para as variveis:
MASTER_HOST
60
MASTER_USER
16
MASTER_PASSWORD
32
MASTER_LOG_FILE
255
356
Depois de realizado este procedimento, o slave deve se conectar ao master e pegar todas as atualizaes que ocorreram desde que o backup foi restaurado.
Se voc esqueceu de configurar o server-id no master, os slaves no podero se conectar a eles:
Se voc esqueceu de configurar o server-id no slave, voc ir obter o seguinte erro no arquivo
de log:
Warning: one should set server_id to a non-0 value if master_host is set.
The server will not act as a slave.
Voc tambm encontrar mensagens de erro no log de erro do slave se ele no puder replicar por
qualquer motivo.
Uma vez que um slave est replicando, voc encontrar um arquivo chamado master.info e um
chamado relay-log.info no diretrio de dados. Estes dois arquivos so usados pelo slave para
manter o registro de quanto foi processado do log binrio do master. No remova ou edite o arquivo,
a menos que voc realmente saiba o que est fazendo e entenda as implicaes. Mesmo neste caso,
mais aconselhvel usar o comando CHANGE MASTER TO.
NOTA: o contedo de master.info sobrepe algumas opes especificadas na lina de comando
ou no my.cnf veja Seco 4.11.6, Opes de Inicializao da Replicao para mais detalhes.
Agora que voc tem uma cpia instantnea, voc pode us-la para configurar outros slaves. Para isso siga a poro referente ao slave descrita acima. Voc no precisa ter outra cpia do master.
As funes USER() e LOAD_FILE() so replicadas sem alteraes e no funcionaro de forma confivel no slave. Isto tambm verdade para CONNECTION_ID() em verses de servidor slaves mais antigas que 4.1.1. A nova funo PASSWORD() no MySQL 4.1, bem replicada desde os masters 4.1.1; o seu slave deve ser 4.1.0 ou acima para replic-la. Se voc tem slaves mais antigos e precisa replicar PASSWORD() do seu master 4.1.x, voc deve iniciar o master com a opo --old-password.
Voc deve uilizar o mesmo conjunto de caracteres (--default-character-set) no master e slave. Seno, voc pode conseguir erros de chaves duplicadas no slave, pois uma chave que
considrada como nica no conjunto de caracteres no master pode no ser nico no conjunto de
caracteres do slave.
Se voc estiver usando tabelas transacionais no master e no transacionais (para as mesmas tabelas) no slave, voc ter prblemas se o slave for parado no meio de um bloco BEGIN/COMMIT,
j que o slave ir, mais tarde, iniciar a partir do incio do bloco BEGIN. Este assunto est em
nosso TODO e ser corrigido em um futuro prximo.
Consultas de atualizao que usam variveis de usurios so mal replicadas nas verses 3.23 e
4.0. Isto corrigido no MySQL 4.1. Note que nomes de variveis de usurios so caso insensitivo a partir da verso 5.0, assim voc deve levar isto em conta quando configurar uma replicao
entre um servidor com verso 5.0 e outro com uma verso anterior.
357
O slave pode se conectar ao master usando SSL, se o master e o slave forem ambos 4.1.1 ou
mais novos.
Embora nunca tenhamos tido casos de ocorrnciar reais, teoricamente possvel de que o dado
no master e no slave podem estar diferentes se uma consulta projetada de modo que a modificao do dado seja no determinstica, p.ex. deixar a vontade do otimizados de consultas (o que
geralmente no uma boa prtica, mesmo fora da replicao!). Para uma explicao detalhada
Seco 1.8.6.2, Open Bugs / Deficincias de Projeto no MySQL.
Antes do MySQL 4.1.1, os comandos FLUSH, ANALYZE, OPTIMIZE e REPAIR no so armazenados no log binrio e por isto no so replicados para o slave. Isto normalmente no um
problema j que estes comandos no alteram nada. Isto significa, no entanto, que se voc atualizar a tabela de privilgio do MySQL diretamente sem usar a instruo GRANT e replicar o banco
de dados de privilgios mysql, voc deve fazer um FLUSH PRIVILEGES em seu slave para
que os novos privilgios tenham efeito. Tambm, se voc utilizar FLUSH TABLES ao renomear
uma tabela MyISAM envolvida em uma tabela MERGE, voc ter uqe executar FLUSH TABLES
manualmente no servidor. Desde o MySQL 4.1.1, estes comandos so escritos no log binrio
(exceto FLUSH LOGS, FLUSH MASTER, FLUSH SLAVE, FLUSH TABLES WITH READ
LOCK) a menos que voc especifique NO_WRITE_TO_BINLOG (ou seu alias LOCAL). Para um
exemplo da sintaxe Seco 4.6.4, Sintaxe de FLUSH.
O MySQL suporta somente um master e vrios slaves. Posteriormente adicionaremos um algortimo de votao para trocar automaticamente o master se alguma coisa estiver errada com o
master atual. Iremos tambm introduzir processos agentes para ajudar a fazer o balanceamento
de carga enviando consultas SELECT para diferentes slaves.
Tabelas temporrias so replicadas, exceto no caso em que voc desliga o servidor slave (e no
apenas a thread slave), e voc tem alguns tabelas temporrias replicadas e so usadas em instrues UPDATES que ainda no foram executadas no slave. (Se voc desligar o slave, as tabelas
temporrias necessrias por estas atualizaes no estaro mais disponveis quando o slave iniciar novamente.) Para evitar este problema, no desligue o servidor enquanto ele tiver tabelas temporrias abertas. Em vez disto, use este procedimento:
1.
2.
3.
4.
5.
Repita o procedimento anterior para ver se voc ter melhor sorte na prxima vez.
seguro conectar servidores em um relacionamento master/slave circular com log-slave-updates habilitado. Note, entretanto, que vrias consultas no iro funcionar corretamente
neste tipo de configurao a menos que o cdigo do cliente seja escrito para tomar cuidado dos
potenciais problemas que podem ocorrer em diferentes sequncias em servidores diferentes.
Isto significa que voc pode fazer uma configurao parecida com o seguinte:
A -> B -> C -> A
As IDs do servidor so codificadas nos eventos do log binrio. A saber quando o evento que ele
l foi originalmente criado por A, assim A no o executar no haver loop infinito. Mas esta
configurao circular s funcionar se voc realizar atualizaes no conflitantes entre as tabelas. Em outras palavras, se voc insere dados em A e C, voc nunca deve inserir um registro em
A que pode ter uma chave confiltante com um registro em C. Voc tambm no deve atualizar
os mesmos registros em dois servidores se a ordem que a atualizao aplicada importa.
Se houver um erro em uma consulta no slave, a thread slave ir terminar e uma mensagem ir
aparecer no log de erro do slave. Voc deve ento conectar a um slave manualmente, corrigir a
358
causa do erro (por exemplo, tabela no existente), e ento executar o comando sql SLAVE
START.
Se a conexo para o master for perdida, o slave ir tentar se reconectar imediatamente. Se ele falhar, o slave ir tenatr a cada master-connect-retry segundos (padro 60). Por causa disto, seguro desligar o master, e ento reinici-lo depois de um tempo. O slave tambm est apto
para lidar com interrupes de rede. No entanto o slave notificar a a perda da rede apenas aps
no ter recebido dados do master por slave_net_timeout segundos. Assim se sua perda for
pequena, voc pode querer diminuir slave_net_timeout. See Seco 4.6.8.4, SHOW VARIABLES.
Desligar o slave (corretamente) tambm seguro, pois mantm sinais de onde parou. Desligamentos incorretos podem produzir problemas, especialmente se o cache de disco no foi sincronizado antes do sistema morrer. Seu sistema de tolerncia a falhas ser melhorado se voc possuir um bom No-Break ou UPS.
Devido a natureza no trabnsacional das tabelas MyISAM, possvel ter uma consulta que atulizar apenas parcialmente uma taela e retornar um cdigo de erro. Isto pode acontecer, por
exemplo, em uma insero multi-registro que tem uma violao da restrio da chave o use uma
consulta de atualizao finalizada aps atualizar alguns dos registros. Se isto acontecer no
master, a thread slave sair e ir esperar o DBA decidir o que fazer com isto a menos que seja
autenticado e a execuo da consulta resulte no mesmo cdigo de erro. Se este comportamento
da validao do cdigo de erro no for desejvel, algum (ou todos) os erros podem ser ignorados
com a opo --slave-skip-errors. Ela est disponvel a partir da verso 3.23.47.
Se voc atualiza tabelas transacionais a partir de tabelas no-transacioanis dentro de um segmento BEGIN/COMMIT, a atualizao no log binrio pode estar fora de sincronia se algumas threads alterarem a tabela no transacional antes do commit da transao. Isto porque a transao
escrita no log binrio apenas quando feito o commit.
Antes da verso 4.0.15, qualquer atualizao de uma tabela no transacional gravada no log binrio imeditamente quando a atualizao feita enquanto atualizaes transacionais so gravadas no COMMIT ou no gravadas se voc utilizar um ROLLBACK. Voc deve levar isto em conta
quando atualizar tabelas transacionais e no transacionais na mesma transao e voc estiver
usando o log binrio para backup ou replicao. Na verso 4.0.15 ns alteramos o comportamento do registro de transaes que misturam atualizaes de tabelas transacionais e no transacionais, que soluciona o problema (ordem das consultas boas no log binrio, e todas as consultas
necessrias so gravadas no log binrio mesmo no caso de um ROLLBACK). O problema que
permanece quando uma segunda conexo atualiza uma tabela no transacional enquanto a primeira transao da conexo ainda no est finalizada (ordenao errada ainda pode ocorrer, porque a atualizao da segunda conexo ser gravada imediatamente depois de ela ter sido feita).
A seguinte tabela lista problemas na verso 3.23 que esto corrigidas na verso 4.0:
LOAD DATA INFILE tratado apropriadamente desde que o arquivo ainda esteja no servidor
master no momento da propagao da atualizao.
As opes que voc pode utilizar no servidor master para controle do log binrio esto todas descritas em Seco 4.10.4, O Log Binrio.
A seguinte tabela descreve as opes que voc pode utilizar nos servidores slaves. Voc pode especific-las na lina de comando ou no arquivo de opo.
NOTA: A replicao trata das seguintes opes de um modo especial:
--master-host
--master-user
--master-password
--master-port
--master-connect-retry
Se no existir nenhum arquivo master.info quando o servidor slave inicia, ele usa valores especficados no arquivo de opes ou na linha de comando. Isto ir ocorrer quando voc iniciar o servidor como um slave de replicao pela primeira vez, ou voc executar RESET SLAVE e desliga e
reiniciar o servidor slave.
No entanto, se o arquivo master.info existe quando o servidor slave iniciar, ele usa o valor no
arquivo e IGNORA qualquer valor especificado para aquelas opes no arquivo de opo ou na linha de comando.
Suponha que voc especifique esta opo em seu arquivo my.cnf:
[mysqld]
master-host=this_host
A primeira vez que voc iniciar o servidor como um slave de replicao, ele ir ler e usar a opo do
arquivo my.cnf. O servidor gravar ento aquele valor no arquivo master.info. A prxima
vez que voc iniciar o servidor, ele ir ler o valor da mquina master a partir do arquivo master.info. Se voc modificar o arquivo my.cnf para especificar uma mquina master diferente,
ele no ter efeito. Voc deve usar CHANGE MASTER TO.
A partir do MySQL 4.1.1, as seguintes opes tambm tratada de forma especial:
--master-ssl
--master-ssl-ca
--master-ssl-capath
--master-ssl-cert
--master-ssl-cipher
--master-ssl-key
O arquivo master.info inclui os valores correspondentes a essas opes. Adicionalmente, o formato do arquivo na verso 4.1.1 inclui na sua primeira linha o nmero de linhas no arquivo. Se voc
atualizar um servidor mais antigo para a verso 4.1.1, o master.info ser atualizado para o novo
formato automaticamente quando o novo servidor iniciar. (Se voc substituir um MySQL 4.1.1 ou
mais novo por uma verso mais antiga que a 4.1.1, voc deve remover a primeira linha manualmente antes de iniciar o servidor mais antigo pela primeira vez.)
Como o servidor da precedncia a uma arquivo master.info existente sobre as opes de inicia360
lizao acima descrito, voc pode preferir usar as opes de inicializao para estes valores, e especifique-os usando a instruo CHANGE MASTER TO. See Seco 4.11.8.1, CHANGE MASTER
TO.
Este exemplo mostra um uso mais extensivo das opes de inicializao para configurar um servidor
slave:
[mysqld]
server-id=2
master-host=db-master.mycompany.com
master-port=3306
master-user=pertinax
master-password=freitag
master-connect-retry=60
report-host=db-slave.mycompany.com
The following list describes startup options for controlling replication:
--log-slave-updates
Diz ao slave para registrar as atualizaes feitas pela thread da SQL do slave no log binrio do
slave. desligado por padro. claro que ele exige que ele exige que o slave seja iniciado com
o log binrio habilitado (opo --log-bin). --log-slave-updates usado quando voc
deseja colocar diversos servidores em cadeia. Por exemplo, voc pode querer uma configurao
como esta:
A -> B -> C
Isto , A o servidor master do slave B, e B o servidor master do slave C. Para isto funcionar,
onde B tanto uma master quanto um slave, voc deve iniciar B com a opo -log-slave-updates. A e B devem ser iniciados com o log binrio habilitado.
--log-warnings
Fazer slave exibir mais mensagens sobre o que est sendo feito. Por exemplo, ele avisar que ele
obteve sucesso em reconectar depois de uma falha de conexo/rede, o avisr sobre cada thread
slave iniciada.
Esta opo no est limitada apenas ao uso da replicao. Ela produz avisos atravs de um espectro de servidores ativos.
--master-host=host
Especifica o nome de mquina ou endereo de IP do master para replicao. Se esta opo no
for dada, a thread slave no ser iniciada. O valor em master.info tem precedncia se ele
puder ser lido. Provavelmemte um nome nelhor para est opo seria algo do tipo -bootstrap-master-host, mas muito tarde para alter-la agora.
--master-user=nome_usurio
O usurio da conta que a thread slave usar para autenticar ao conectar ao master. A conrta deve
ter o privilgio REPLICATION SLAVE (Em verses anteriores a 4.0.2 ele devia ter o privilgio
FILE). Se o usurio do master no for configurado, assume-se o usurio teste. O valor em
master.info toma precedncia se puder ser lida.
--master-password=password
A senha da conta com a qual a thread slave autenticar quando conectar ao master. Se no definida, um senha vazia considerada. O valor em master.info toma precedncia se puder ser
lido.
--master-port=portnumber
361
--master-connect-retry=seconds
O nmero de segundos que a thread slave espera antes de tentar se conectar ao master no caso do
master ter cado ou a conexo for perdida. O padro 60. O valor em master.info toma precedncia se puder ser lido.
--master-info-file=filename
Especifica o nome a ser usado no arquivo que o slave grava a informao sobre o master. O nome padro master.info no diretrio de dados.
--master-ssl
,
--master-ssl-ca=file_name
,
-master-ssl-capath=directory_name , --master-ssl-cert=file_name , -master-ssl-cipher=cipher_list , --master-ssl-key=filename
Estas opes so usadas para configurar um conexo de replicao segura para o servidor master
usando SSL. Os seus significados so os mesmos das opes correspondentes --ssl, -ssl-ca, --ssl-capath, --ssl-cert, --ssl-cipher, --ssl-key descritas em
Seco 4.4.10.5, Opes SSL de Linha de Comando.
Estas opes esto operacionais a partir do MySQL 4.1.1.
--max-relay-log-size=#
Para rotacionar o relay log automaticamente. See Seco 4.6.8.4, SHOW VARIABLES.
--relay-log=filename
Para especificar a localizao e nome que deve ser usado os relay logs. Voc pode us-lo para
ter nomes de relay logs independentes do nome de mquina, ou se o seu relay log tend a ser
grande (e voc no que diminuir max_relay_log_size) e voc precisa coloc-los em alguma rea diferente do diretrio de dados, ou se voc quiser aumentar a velocidade balanceando as
cargas entre os discos.
--relay-log-index=filename
Para especificar a localizao e nome que deve ser usado para arquivo de ndice dos relay logs.
--relay-log-info-file=filename
Para dar outro nome a relay-log.info e/ou coloc-lo em outro diretrio, diferente do diretrio de dados.
--relay-log-purge=0|1
Disabilita/habilita a remoo automtica dos relay logs assim que ele no so mais necessrios.
Esta uma varivel global que ode ser alterada dinmicamente com SET GLOBAL RELAY_LOG_PURGE=0|1. o valor padro 1.
Esta opo est disponvel a partir do MySQL 4.1.1.
--relay-log-space-limit=#
Para colocar um limite superior no tamanho total de todos os relay logs no slave (Um valor 0
significa ``ilimitado''). Isto til se voc tiver um disco rgido pequeno em. sua mquina slave.
Quando o limite alcanado, a thread de E/S fica em pausa (no l o log binrio do master) at
que a thread de SQL tenha buscado e deletado alguns dos relay logs no utilizados. Note que este limite no absoluto: existem casos onde a thread SQL precisa de mais eventos para poder
deletar, neste caso a thread de E/S ir superar o limite at que a deleo seja possvel. Se isto no
362
for feito ela entra em deadlock (o que acontecia antes do MySQL 4.0.13). Os usurios no devem configurar --relay-log-space-limit para menos que duas vezes o valor de -max-binlog-size (ou --max-binlog-size se --max-relay-log-size for 0)
porque neste caso h a chance de que quando a thread de E/S espera por espao livre porque -relay-log-space-limit excedido, a thread de SQL no tem relay log para apagar e
assim no pode satisfazer a thread de E/S, forando-a a ignorar temporariamente -relay-log-space-limit.
--replicate-do-table=db_name.nome_tabela
Diz para thread slave restrigir a replicao a uma tabela especfica. Para especificar mais de uma
tabela, use a diretiva mltiplas vezes, uma para cada tabela. Isto funcionar para atualizaes
atravs de bancos de dados, em contraste com --replicate-do-db. Por favor, leia as notas
que seguem esta lista de opes
--replicate-ignore-table=db_name.nome_tabela
Diz a thread slave para no replicar qualquer comando que atualiza a tabela especificada
(mesmo se qualquer outra tabela puder ser atualizada pelo mesmo comando). Para especificar
mais de uma tabela a ser ignorada, use a diretiva vrias vezes, para cada tabela. Isto funcionar
para atualizaes atravs de bancos de dados, em contraste com --replicate-ignore-db.
Por favor, leia as notas que seguem esta lista de opes
--replicate-wild-do-table=db_name.nome_tabela
Diz a thread slave para restringir a replicao a consultas onde qualquer das tabelas atualizadas
correspondam a padro de meta caracteres especificado. Para especificar mais de uma tabela,
use a diretiva vria vezes, uma para cada tabela, Isto funciona para atualizaes atravs de banco
de dados. Por favor, leia as notas que seguem esta lista de opes
Exemplo: --replicate-wild-do-table=foo%.bar% replicar apenas atualizaes que
usam uma tabela em qualquer banco de dadis que comece com foo e cujos nomes de tabelas comecem com bar.
Note que se voc fizer --replicate-wild-do-table=foo%.% ento a regra ser propagada para CREATE DATABASE e DROP DATABASE, ex.: estas duas instrues sero replicadas se o nome de banco de dados corresponder ao padro do banco de dados ('foo%' aqui)
(testa mgica possvel por '%' ser o padro da tabela).
Caracteres curingas _ e % escapados: se voc quiser replicar, por exemplo, todas as tableas do
banco de dados my_own%db (este o nome exato do banco de dados), e no replicar tabelas do
banco de dados my1ownAABCdb, voc deve escapar o _ e %: voc deve usar algo como isto:
replicate-wild-do-table=my\_own\%db. E se voc estiver especificando esta opo
para a linha de comando, dependendo do seu sistema, voc precisar escapar o \ (por exemplo,
com
uma
shell
bash,
voc
precisaria
digitar
-replicate-wild-do-table=my\\_own\\%db).
--replicate-wild-ignore-table=db_name.nome_tabela
Diz a thread slave pra no replicar um consulta onde qualquer tabela corresponda ao padro de
meta caracteres dado. Para especificar mais de uma tabela, use a diretiva vrias vezes, uma vez
para cada tabela. Isto funcionar para atualizaes atravs de banco de dados. Por favor, leia as
notas que seguem esta lista de opes
Exemplo: --replicate-wild-ignore-table=foo%.bar% no atualizar tabelas no
banco de dados que iniciar com foo e cujo os nomes de tabela iniciem com bar.
Note que se voc fizer --replicate-wild-ignore-table=foo%.% ento a regra ser
propagada para CREATE DATABASE e DROP DATABASE, ex. estas duas instrues no sero
replciadas se o nome do banco de dados no corresponder ao padro ('foo%' aqui) (esta mgica ocorre devido ao '%' como padro da tabela).
363
--replicate-do-db=nome_bd
Diz ao slave para restringir a replicao a comandos onde o banco de dados atual (p.ex., aquele
selecionado por USE) nome_bd. Para especificar mais de uym banco de dadosm use a diretiva
vrias vezes, uma vez por tabela. Note que isto no replicar consultas entre bancos de dados
tais como UPDATE algum_bd.alguma_tabela SET foo='bar' se for selecionado
outro banco de dados ou nenhum banco de dados. Se voc precisa que atualizaes entre bancos
de dados funcionem, certifique-se de que voc tem o MySQL 3.23.28 ou posterior, e use -replicate-wild-do-table=db_name.%. Por favor, leia as notas que seguem esta lista
de opes
Exemplo do que no funciona como voc espera: se o slave iniciado com -replicate-do-db=sales, e voc faz USE prices; UPDATE sales.january
SET amount=amount+1000;, esta consulta no ser replicada.
Se voc precisar que atualizaes entre bancos
-replicate-wild-do-table=db_name.%.
de
dados
funcionem,
use
A principal razo para este comportamento de apenas verificar o banco de dados atual que
difcil para um comando sozinho saber se deve ser replicado ou no; por exemplo se voc est
usando comandos delete ou update multi-tabelas que continuam entre mltiplos bancos de dados. Tambm muito mais rpido verificar apenas o banco de dados atual.
--replicate-ignore-db=nome_bd
Diz ao slave para no replicar qualquer comando onde o banco de dados atual (p.ex. o selecionado por USE) nome_bd. Para especificar mais bancos de daods use a diretiva diversas vezes,
uma para cada banco de dados. Voc no deve utilizar esta diretiva se voc est usando atualizao atravs de tabelas e voc no quer que estas atualizaes sejam replicadas. Por favor, leia as
notas que seguem esta lista de opes
Exemplo do que no funcionaria como esperado: se o slave iniciado com -replicate-ignore-db=sales, e voc faz USE prices; UPDATE sales.january SET amount=amount+1000;, esta consulta ser replicada.
Se voc precisar de atualizaes entre banco
-replicate-wild-ignore-table=db_name.%.
de
dados
funcione,
use
--replicate-rewrite-db=de_nome->para_nome
Diz ao slave para traduzir o banco de dados atual (p.ex. aquele selecionado por USE) para para_nome se ele era de_nome no master. Apenas instrues envolvendo a tabela podem ser
afetadas (CREATE DATABASE, DROP DATABASE no podero), e apenas se de_nome era o
banco de dados atual no master. Isto no funcionar para atualizaes entre banco de dados. Note que a translao feita antes das regras de --replicate-* serem testadas.
Exemplo: replicate-rewrite-db=master_db_name->slave_db_name
--report-host=host
O Nome de mquina ou nmero IP do slave a ser relatado ao master durante o registro do slave.
Aparecer na sada de SHOW SLAVE HOSTS. Deixe indefinido se voc no quiser que o slave
se registre no master. Note que ele no suficiente para o master simplesmente ler o nmero IP
do slave fora dos sockets uma vez que o slave se conecte. Devido ao NAT e outros assuntos de
roteamento,a quele IP pode no ser vlido para se conectar ao slave a partir do master ou outras
mquinas.
364
--report-port=portnumber
Porta para conexo do slave relatado ao master durante o registro do slave. Defina-o apenas se o
slave est escutando por uma porta diferente da padro ou se voc tiver um tunel especial do
master ou outros clientes para o slave. Se no tiver certeza, deixe esta opo indefinida.
Esta opo est disponvel a partir do MySQL 4.0.0.
--skip-slave-start
Diz ao servidor slave para no iniciar a thread slave na iicializao do servidor. O usurio pode
inici-las mais tarde com START SLAVE.
--slave_compressed_protocol=#
Se 1, usa compactao no protocolo cliente/servidor se tanto o slave quanto o mester suport-la.
--slave-load-tmpdir=filename
Esta opo igual ao valor da varivel tmpdir por padro. Quando a thread SQL do slave replica um comando LOAD DATA INFILE, ele extrai os arquivos a serem carregados do relay
logs em arquivos temporrios, e ento os carrega dentro da tabela. Se o arquivo carregado no
master era enorme, os arquivos temporrios no slave tambm sero enormes; embora voc possa
desejar que o slave coloque o arquivo temporrio em algum disco grande diferente de tmpdir,
usando esta opo. Nestes caso, voc tambm pode usar a opo --relay-log, j que os relay logs sero grandes tambm. --slave-load-tmpdir deve apontar para o sistema de arquivo baseado em disco; no em um baseado em memria. Como o slave precisa de arquivos
temporrios usados para replicar LOAD DATA INFILE) para sobreviver a uma reinicializao
da mquina.
--slave-net-timeout=#
Nmero de segundos a esperer por mais dados do master antes de abortar a leitura, considerando
o quebra de conexo e as tentativas de reconectar. A primeira vez ocorre imediatamente depois
do tempo limite. O intervalo entre tentativas controlado pela opo -master-connect-retry.
365
--slave-skip-errors=1062,1053
--slave-skip-errors=all
Algumas destas opes, como todas as opes --replicate-*, s podem ser definidas na inicializao do servidor slave, e no com ele ligado. Planejamos corrigir isto.
Aqui est a ordem de avaliao das regras --replicate-*, para decidir se a consulta ser executada pelo slave ou ignorada por ele:
1.
2.
3.
Sim: v para o passo abaixo. Apenas tabela que sero atualizadas sero comparadas s regras (INSERT INTO sales SELECT * from prices: apenas sales ser comparada s regras). Se vrias tabelas forem ser atualizadas (instrues multi-tabelas) a primeira
a corresponder a regra (com ``do'' ou ``ignore'') vence (isto , a primeira tabela comparada
a regra. se nenhuma deciso pode ser tomada a segunda tabela compara s regras, etc).
5.
4.
Sim: teste-as como para --binlog-do-db e --binlog-ignore-db (see Seco 4.10.4, O Log Binrio). Qual o resultado do teste?
6.
7.
Nenhuma regra --replicate-*-table foi correspondida. Existe outra tabela para se testar com estas regras?
Sim: loop.
No: testamos todas as tabelas a serem atualizadas, nenhuma regra foi obedecida. Existem
regras --replicate-do-table ou --replicate-wild-do-table?
RESET MASTER
Deleta todos os logs binrios listado no arquivo de ndice, zerando o arquivo de ndice do log binrio.
Esta instruo rea chamada FLUSH MASTER antes do MySQL 3.23.26.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MASTER_HOST = 'host_name'
MASTER_USER = 'user_name'
MASTER_PASSWORD = 'password'
MASTER_PORT = port_num
MASTER_CONNECT_RETRY = count
MASTER_LOG_FILE = 'master_log_name'
MASTER_LOG_POS = master_log_pos
RELAY_LOG_FILE = 'relay_log_name'
RELAY_LOG_POS = relay_log_pos
MASTER_SSL = {0|1}
MASTER_SSL_CA = 'ca_file_name'
MASTER_SSL_CAPATH = 'ca_directory_name'
MASTER_SSL_CERT = 'cert_file_name'
MASTER_SSL_KEY = 'key_file_name'
MASTER_SSL_CIPHER = 'cipher_list'
Altera os parmetros que o servidor slave usa para conectar e comunicar com o servidor master. Os
valores possveis para o valor master_def esto mostrados acima.
As opes do relay log (RELAY_LOG_FILE e RELAY_LOG_POS) esto disponveis a partir do
MySQL 4.0.
As opes SSL (MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH, MASTER_SSL_CERT, MASTER_SSL_KEY, e MASTER_SSL_CIPHER) esto disponveis a partir do
MySQL 4.1.1. Voc pode alterar estas opes mesmo nos slaves que so compilados sem suporte a
SSL. Eles sero salvos no arquivo master.info mas ignorados at que voc use um servidor que
tenha suporte a SSL habilitado.
Por exemplo:
mysql> CHANGE MASTER TO
->
MASTER_HOST='master2.mycompany.com',
->
MASTER_USER='replication',
->
MASTER_PASSWORD='bigs3cret',
->
MASTER_PORT=3306,
->
MASTER_LOG_FILE='master2-bin.001',
->
MASTER_LOG_POS=4,
->
MASTER_CONNECT_RETRY=10;
mysql> CHANGE MASTER TO
->
RELAY_LOG_FILE='slave-relay-bin.006',
->
RELAY_LOG_POS=4025;
MASTER_USER,
MASTER_PASSWORD,
MASTER_SSL,
MASTER_SSL_CA,
MASTER_SSL_CAPATH, MASTER_SSL_CERT, MASTER_SSL_KEY, and MASTER_SSL_CIPHER
are information for the slave to be able to connect to its master. If you don't specify some of these
informations, the non-specified informations will keep their old value. For example, if the password
to connect to your MySQL master has changed, you just need to issue
mysql> STOP SLAVE; -- if replication was running
mysql> CHANGE MASTER TO MASTER_PASSWORD='new3cret';
mysql> START SLAVE; -- if you want to restart replication
to tell the slave about the new password; no need to specify the information which did not change
(host, port, user etc).
MASTER_HOST, MASTER_PORT are the hostname or IP adress of the master host, and its TCP
port. Note that if MASTER_HOST is equal to localhost, then, like in other parts of MySQL, the
port may be ignored (if Unix sockets can be used for example).
Se voc especificar MASTER_HOST ou MASTER_PORT, o slave assumir que o mestre diferente
do anterior (mesmo se voc especificar um valor de nost ou porta iguais ao do valor atual.) Neste caso Assim, os valores antigos do nome e posio do log binrio do mestre no so mais aplicveis,
assim se voc no especificar MASTER_LOG_FILE e MASTER_LOG_POS no comando, MASTER_LOG_FILE='' e MASTER_LOG_POS=4 so silenciosamente adicionados a ele.
369
Ele adquire um lock de leitura global no master enquanto tira um instantneo, que evita atualizaes no master durante esta operao.
No futuro est planejado faz-lo funcionar com tabelas InnoDB e remover a necessidade de lock
deleitura global usando o recurso de backup online sem bloqueio.
Se voc estiver carregando tabelas grandes, voc pode aumentar os valores de
net_read_timeout e net_write_timeout no mestre e no slave. Veja Seco 4.6.8.4,
SHOW VARIABLES.
Note que LOAD DATA FROM MASTER NO copia nenhuma tabela do banco de dados mysql.
Isto para tornar facil de se ter diferentes usurios e privilgios no master e no slave.
Esta instruo exige que o usurio de replicao usado para se conectar ao master tenha privilgios
RELOAD e SUPER no master, privilgios SELECT em todas as tabelas do master que voc queira
carregar. Todas as tabelas do master nas quais os usurios no tenham privilgio SELETC sero ignoradas pelo LOAD DATA FROM MASTER; isto ocorre porque o master ir esconde-los do usurio: LOAD DATA FROM MASTER chama SHOW DATABASES para saber qual banco de dados do
master carregar, mas SHOW DATABASES retorna apenas o banco de dados nos quais o usurio tem
algum privilgio. Veja Seco 4.6.8.1, Recuperando Informaes sobre Bancos de Dados, Tabelas,
Colunas e ndices. No lado do slave, o usurio que executa LOAD DATA FROM MASTER deve ter
permisso para apagar e criar o banco de dados e tabelas envolvidos.
4.11.8.4. MASTER_POS_WAIT()
SELECT MASTER_POS_WAIT('master_log_file', master_log_pos)
Esta uma funo, no um comando. usada para assegurar que o slave tenha alcanado (lido e
executado) uma dada posio no log binrio do master. Veja Seco 6.3.6.2, Funes Diversas para uma descrio completa.
Slave_IO_State
Uma cpia da coluna State da sada de SHOW PROCESSLIST para a thread de E/S do slave;
lhe dir se est thread est tentando se conectar ao master, esperando por eventos do master, reconectando ao master, etc. Os estados possveis esto listados em Seco 4.11.2, Viso Geral
da Implementao da Replicao. Olhar est coluna necessrio porque, por exemplo, a thread
pode estar em execuo mas no tem sucesso ao tentar se conectar ao master: apenas esta coluna
lhe deixar ciente do problema de conexo. Por outro lado, o estado da thread SQL no copiada, porque as coisas so mais simples para esta thread: se ela estiver em execuo, no haver
problema; se no, voc encontrar o erro na coluna Last_Error (descrita abaixo).
Este campo est presente a partir do MySQL 4.1.1.
Master_Host
A mquina master atual.
Master_User
O usurio usado para conectar ao master.
Master_Port
A porta atual do master.
Connect_Retry
O valor atual de master-connect-retry.
Master_Log_File
O nome do arquivo de log binrio do master no qual a thread de E/S est lendo atualmente.
Read_Master_Log_Pos
A posio at a qual a thread de E/S leu no log binrio do master.
Relay_Log_File
O nome do arquivo de relay log na qual a thread SQL est lendo e executando atualmente.
Relay_Log_Pos
A posio at a qual a thread de SQL leu e executou neste relay log.
Relay_Master_Log_File
O nome do arquivo de log binrio do master no qual contm o ltimo evento executado pela thread de SQL.
Slave_IO_Running
Diz se a thread de E/S foi iniciada ou no.
Slave_SQL_Running
Diz se a thread de SQL est iniciada ou no.
Replicate_Do_DB, Replicate_Ignore_DB
A lista de banco de dados que foi especificado com as opes --replicate-do-db e -replicate-ignore-db.
Replicate_Do_Table,
Replicate_Ignore_Table,
373
Replica-
te_Wild_Do_Table, Replicate_Wild_Ignore_Table
As tabelas que foram especificadas com as opes --replicate-do-table, -replicate-ignore-table,
--replicate-wild-do-table,
e
-replicate-wild-ignore_table.
Estes campos esto presentes a partir do MySQL 4.1.1.
Last_Errno
O nmero de erro retornado pela consulta executada mais recentemente. Um valor 0 significa
``sem erro''.
Last_Error
A mensagem de erro retonada pela consulta executada mais recentemente. Por exemplo:
Last_Errno: 1051
Last_Error: error 'Unknown table 'z'' on query 'drop table z'
A mensagem indica que a tabela z existia no mestre e foi apagada l, mas ela no existe no slave, assim DROP TABLE falhou no servidor. (Isto pode ocorrer se o usurio esqueceu de copi-la
no slave ao configur-lo).
A string vazia significa ``sem erro''. Se o valor Last_Error no for vazio, ele tambm apareceria como uma mensagem no log de erro do slave. Por exemplo:
Skip_Counter
O ltimo valor usado por SQL_SLAVE_SKIP_COUNTER.
Exec_Master_Log_Pos
A posio no log binrio do master (Relay_Master_Log_File) do ltimo evento executado pela thread de SQL. ((Relay_Master_Log_File,Exec_Master_Log_Pos) no log
binrio do master corresponde a (Relay_Log_File, Relay_Log_Pos) no relay log).
Relay_Log_Space
O tamanho total de todos os relay logs existentes.
Master se o slave estiver lendo at uma dada posio no log binrio do master.
Relay se o slave estiver lendo at uma dada posio em seus relay logs
rem.
Master_SSL_Allowed possui estes valores:
Ignored se uma conexo SSL permitida pelo servidor slave no tem suporte a SSL habilitado.
Os valores dos outros campos correspodem ao valor das opes --master-ca, -master-capath, --master-cert, --master-cipher, e --master-key.
Estes campos esto presentes a partir do MySQL 4.1.1.
Seconds_Behind_Master
O nmero de segundos passados desde o ltimo evento do master executado pela thread salve
SQL. Ser NULL quando nenhum evento foi executado ainda, ou depois de CHANGE MASTER e
RESET SLAVE. Esta coluna pode ser usada para saber "quo atrasado est o seu slave". Funcionar mesmo se o seu master e slave no tiverem clocks idnticos.
Estes campos esto presentes a partir do MySQL 4.1.1.
da at um pouco antes do ponto que voc deseja evitar que o slave replique uma instruo. Por
exemplo, se uma instruo DROP TABLE foi executada no master, voc pode usar UNTIL para dizer ao slave para executar at aquele ponto, mas no depois. Para encontrar qual o evento, use
mysqlbinlog com o log do master ou o relay logs, ou usando uma instruo SHOW BINLOG
EVENTS.
Se voc estiver usando UNTIL para ter o processo slave replicando consultas nas sees, recomendado que voc inicie o slave com a opo --skip-slave-start para evitar que a thread de
SQL execute quando o slave iniciar. provavelmente melhor usar esta opo em um arquivo de opo em vez de us-la na linha de comando, assim uma reinicializao inesperada do servidor no faz
com que isso seja esquecido.
A instruo SHOW SLAVE STATUS inclui campos na sada que mostram o valor atual da condio
UNTIL.
Este comando chamado SLAVE START antes do MySQL 4.0.5. No momento, SLAVE START
ainda aceito para compatibilidade com verses anteriores, mas est obsoleto.
2.
Execute as seguintes instrues no slave, preenchendo os valores apropriados para cada parmetro:
mysql> CHANGE MASTER TO
->
MASTER_HOST='master_host-name',
->
MASTER_USER='master_user_name',
->
MASTER_PASSWORD='master_pass',
->
MASTER_LOG_FILE='recorded_log_name',
->
MASTER_LOG_POS=recorded_log_pos;
3.
Se voc j no tiver um backup do master, aqui est um modo rpido de faz-lo de forma consistente:
1.
2.
3.
SHOW MASTER STATUS - esteja certo de gravar a sada - voc precisar dela mais tarde
376
4.
UNLOCK TABLES
Uma alternativa tirar um dump do SQL do master em vez de uma cpia binria como acima; para
isto voc podee usar mysqldump --master-data em seu master e posteriormente executar este dump SQL em seu slave. Isto , no entanto, mais lento que fazer uma cpia binria.
No importa qual dos dois mtodos voc usa, mais tarde siga as instrues para o caso em que voc
tem uma cpia e gravou o nome e offset dos logs Voc pode usar a mesma cpia para configurar diversos slaves. Uma vez que os logs binrios do master esto intctos, voc pode esperar por dias ou
meses para configurar um slave uma vez que voc possui a cpia do master. Em teoria a lacuna de
espera pode ser infinita. As duas limitaes prticas o espao em disco do master sendo preenchido com logs antigos e a quantidade de tempo que o slave gastar para busc-los.
Voc tambm pode usar LOAD DATA FROM MASTER. Este um comando conveniente que tira
uma cpia, a restaur no slave e ajustar o nome e offset do log no slave, todos de uma vez. No futuro, LOAD DATA FROM MASTER ser o modo recomendado de configurar um slave. Esteja avisado, no entanto, que o lock de leitura pode ser mantido por um longo tempo se voc usar este comando. Ele ainda no est implementado de forma to eficiente quanto gostariamos. Se voc tiver tabelas grandes, o mtodo prefervel neste momento ainda com uma cpia tar local depois de executar FLUSH TABLES WITH READ LOCK.
P: O slave precisa estar conectado ao master o tempo todo?
R: No, ele no precisa. O slave pode ser desligado ou permanecer desconectado por horas ou mesmo dias, ento reconecta e busca as atualizaes. Por exemplo, voc pode usar uma relao master/
slave sobre uma conexo dial-up que est ligada espordicamente apenas por um curto perodo de
tempo. A implicao disto que a uma hora dada qualquer no temos garantias de que o slave est
sincronizado com o master a menos que voc tire algumas medidas especiais. No futuro, teremos a
opo de bloquear o master at que pelo menos um slave esteja sincronizado.
P: Como posso saber se um slave est atrasado comparado ao master? Em outra palavras, como eu
sei que o dado da ltima consulta replicada pelo escravo?
R: Se o slave for 4.1.1 ou mais novo, leia a coluna Seconds_Behind_Master de SHOW SLAVE STATUS. Para verso mais antigas o seguinte se aplica. Isto s possvel se a thread salve de
SQL existir (p.ex. se ele for exibida em SHOW PROCESSLIST, see Seco 4.11.3, Detalhes de
Implementao da Replicao) (no MySQL 3.23: se a thread slave existir, p.ex. e mostrada em
SHOW PROCESSLIST), e se ela executou pelo menos um evento do master. Realmente, quando a
thread slave de SQL executa um evento lido do master, esta thread modifica seu prprio tempo do
timestamp do evento ( por isto que TIMESTAMP bem replicado). Assim indicado na coluna
Time na sada de SHOW PROCESSLIST, o nmero de segundos entre o timestamp do ltimo
evento replicado e o tempo real da mquina slave. Vopc podee usar isto para determinar a data do
ltimo evento replicado. Note que se o seu slave foi desconectado do master por uma hora e ento
reconectado, voc poder ver uma vlaor de 3600 na coluna Time para a thread slave de SQL em
SHOW PROCESSLIST... Isto ocorreria porque o slave est executando consultas de uma hora atrs.
P: Como eu foro o master a bloquear as atualizaes at que o slave as busque?
R: Use o seguinte procedimento:
1.
2.
A instruo SELECT ser bloqueada at que o slave alcance o arquivo de log e offset especificados. Neste ponto, o slave estar em sincronia com o master e a instruo ir retornar.
3.
No master, execute a seguinte instruo para permitir que o master comece a processar atualizaes novamente:
mysql> UNLOCK TABLES;
P: Sobre quais assuntos eu devo estar ciente ao configurar uma replicao de duas vias?
R: Atualmente a replicao do MySQL no suporta nenhum protocolo de locking entre master e slave para garantir a atomicidade de uma atualizao distribuda (entre servidores). Em outras palavras,
possvel para um cliente A fazer uma atualizao para um co-master 1, e neste tempo, antes de
propagar para o co-master 2, o cliente B pode fazer uma atualizao para o co-master 2 que far a
atualizao do cliente A funcionar diferentemente da que ele fez no co-master 1. Assim, quando a
atualizao do cliente A fizer a atualizao para o co-master, ele produzir tabelas que so diferentes
daquelas que voc tem no co-master 1, mesmo depois de todas as atualizaes do co-master2 tambm terem sido propagadas. Por isso voc no deve co-encadear dois servidores em uma replicao
de duas vias, a menos que voc possa assegurar que suas atualizaes possem seguramente ocorrer
em qualquer ordem, ou que de alguma forma voc cuide de alguma forma a atualizao fora de ordem no cdigo do cliente.
Voc tambm deve perceber que replicao de duas vias no melhorar em muito o desempenho, j
que temos atualizaes envolvidas. Ambos os servidores precisam fazer a mesma quantidade de atualizaes cada, como se tivesse um servidor. A nica diferena que haver uma pouco menos de
conteno de lock, porque as atualizaes originando em outro servidor sero serializadas em uma
thread slave. mesmo assim, este benefcio pode ser por atrasos de rede.
P: Como eu posso usar replicao para melhorar a performance do meu sistema?
R: Voc devev configurar um servidor como master e direcionar todas as escritas para ele. Ento
configure tantos slaves quantos voc pode comprar e instalar, e distribua as leituras entre o master e
os
slaves.
Voc
tambm
pode
iniciar
os
slaves
com
--skip-bdb,
-low-priority-updates e --delay-key-write=ALL para conseguir aumento de velocidade para o slave. Neste caso o slave usar tabelas MyISAM no transacionais em vez de tabelas
BDB para conseguir mais velocidade.
Q: O que eu devo fazer para preparar o cdigo do cliente em minhas prprias aplicaes para usar
replicao para melhora de performance?
A: Se a parte do seu cdigo que for responsvel pela acesso ao banco de dados tiver sido abstado/
modularizado apropriadamente, converte-lo para executar com uma configurao de replicao deve
ser bem fcil. Apenas altere a implementao de seu acesso a banco de dados para enviar todas as
escritas para o master e todas as leituras para o master e o slave. Se o seu cdigo no tiver este nvel
de abstrao, configurar um sistema de replicao lhe dar a oportunidade e motivao de limp-lo.
Voc deve iniciar criando uma biblioteca ou mdulo wrapper com as seguites funes:
safe_writer_connect()
safe_reader_connect()
safe_reader_query()
safe_writer_query()
safe_ no nome de cada funo significa que a funo cuidar do tratamento de todas as condies
de erro.
378
Voc pode, claro, usar diferentes nomes para as funes. O importante ter uma interface unificada para conexo para leitura, conexo para escrita, fazer uma leitura e fazer uma escrita.
Voc deve ento converter o cdigo do seu cliente para usar a biblioteca wrapper. Este pode ser um
processo doloroso e assustador a princpio, mas ser gratificante a longo prazo. Todas as aplicaes
que usam a abordagem descrita podero tirar vantagem de uma configurao master/slave, mesmo
envolvendo vrios slaves. O cdigo ser muito mais fcil de manter, e adicionar opes para solues de problemas ser trivial. Voc s precisar modificar uma ou duas funes, por exemplo, para
registrar quanto tempo uma consulta gastou ou qual consulta, entre todas elas, retornou um erro.
Se voc j tiver escrito muito cdigo, voc pode querer automatizar a converso de tarefas usando o
utilitrio replace, que vem com a distribuio padro do MySQL, ou simplesmente escrever seu
prprio script Perl. Provavelmente, o seu cdigo segue algum padro de reconhecimento. Se no,
ento talvez sej melhor reescrev-lo ou pelo menos coloc-lo dentro de um padro.
Q: Quando e em quanto a replicao do MySQL pode aumentar a performance do meu sistema?
A: A replicao do MySQL mais benfica para um sistema com leituras frequentes e escritas infrequentes. Em teoria, usando uma configurao um mastre/vrios slaves voc pode escalar o sistema
adicionando mais slaves at que voc fique sem largura de banda na rede, ou a sua carga de atualizaes cresa ao ponto que o master no possa trat-la.
Para determinar quantos slaves voc pode ter antes dos benefcios adicionados comearem a estabilzar e quanto voc pode melhorar o desempenho do seu site, voc precisa saber o padro de suas consultas e determinar empiricamente (pelo benchmark) a ralao entre a taxa nas leituras (leituras por
segundo, ou max_reads) e nas escritas (max_writes) em um master e um slave comum. O
exemplo aqui lhe mostrar um calculo simplificado do que voc pode obter com replicao para o
nosso sistema hipottico.
Vamos dizer que o sistema de cargas consiste de 10% de escrita e 90% de leitura, e determinamos
max_reads para ser 1200 - 2 * max_writes. Em outras palavras, nosso sistema pode fazer 1200
leituras por segundo sem nenhuma escrita, a escrita mdia duas vezes mais lenta que a leitura mdia e a realao linear. Vamos supor que o master e cada slave possuem a mesma capacidade, e temos 1 master e N slaves. Ento temos para cada servidor (master ou slave):
leituras = 1200 - 2 * escritas (a partir do benchmark)
leituras = 9* escritas / (N + 1) (as leituras so separadas, mas a escrita deve ir para todos os servidores)
9*escritas/(N+1) + 2 * escritas = 1200
escritas = 1200/(2 + 9/(N+1)
Esta anlise leva as seguintes concluses:
Se N = 0 (que significa que no temos replicao) nosso sistema pode tratar 1200/11, cerca de
109, escritas por segundos (o que significa que teremos 9 vezes mais leituras devidos a natureza
de nossa aplicao)
Se N = 8, conseguimos 400.
Eventualmente, a medida que N se aproxima de infinito (e seu oramento de menos infinito), podemos chegar prximo a 600 escritas por segundo, aumentando o throughput do sistema em cerca de 5,5 vezes. No entanto, com apenas 8 servidores, j o aumentamos em quase 4 vezes.
Note que nossos calculos assumem uma largura de banda de rede infinita, e negligencia vrios outros fatores que podiam se tornar significante em seu sistema. Em muitos casos, voc pode no con379
seguir fazer um clculo similar ao acima que ir predizer exatamente o que acontecer em seus sistema se voc adicionar N slaves de replicao. No entanto, responder as seguintes questes deve ajud-lo a decidir quando e quanto a replicao aumentar a performance do seu sistema:
Quanto mais de carga de escrita um servidor pode tratar se voc reduzir a leitura?
Para quantos slaves voc tem largura de banda disponovel em sua rede?
Para dizer para um slave para alterar o master, use o comando CHANGE MASTER TO.
Um bom modo de manter sua aplicao informadas sobre a localizao do master tendo uma
entrada DNS dinmica para o master. Com bind voc pode usar nsupdate para atualizar dinamicamente o seu DNS.
v
M
| \
| \
v
v
S2 S3
bemos que ele o primeiro log binrio, na posio 4, e estes so os padres de CHANGE MASTER. Finalmente faa START SLAVE em S2 e S3, e agora voc ter isto:
WC
/
|
WC
| M(indisponvel)
\
|
\ |
v v
S1<--S2 S3
^
|
+-------+
Quando M estiver ativo novamente, voc s precisa enviar a ele o mesmo CHANGE MASTER
enviado a S2 e S3, assim que M se tornar um slave de S1 e pegar tudo que WC gravou enquando
ele estava desativado. Agora para tornarmos M como master novamente (por exemplo, porque
ela a melhor mquina), siga os procedimentos como se S1 estivesse indisponvel e M fosse o
novo master; ento durante o procedimento no esquea d executar RESET MASTER em M antes de tornar S1, S2, S3 como slaves de M ou eles podem buscar escritas antigas de WC, antes
da indisponibilidade de M.
Atualmente estamos trabalhando na integrao de um sistema de eleio de master autmotico dentro
do MySQL, mas at que ele esteja pronto, voc ter que criar suas prprias ferramentas de monitoramento.
Verifique as mensagens no log de erros. Muitos usurios perderam tempo por no fazer isto
cedo o suficiente.
O master est logando ao log binrio? Verifique com SHOW MASTER STATUS. Se estiver,
Position ser diferente de zero. Se no, verifique que deu a opo log-bin do master e definiu o server-id.
O slave est executando? Faa SHOW SLAVE STATUS e verifique se os valores Slave_IO_Running e Slave_SQL_Running so ambos Yes. Se no, verifique a opo do
slave.
Se o slave estiver rodando, ele estabeleceu uma conexo com o master? Faa SHOW PROCESSLIST, encontre as threads de E/S e SQL (see Seco 4.11.3, Detalhes de Implementao
da Replicao para ver como exibido), e verifique a sua coluna State. Se ela disser Connecting to master, verifique os privilgios do usurio de replicao no master, nome de
mquina do master, sua configurao de DNS, se o master est atualmente em execuo e se ele
est a alcance do slave.
Se o slave estava em execuo antes mas agora parou, a razo que normalmente algumas consultas que obtem sucesso no master falham no slave. Into nunca deve acontecer se voc tiver tirado a cpia apropriada do master e nunca modificou os dados no slave fora da thread slave. Se
isto ocorrer, voc encontrou um erro; leia abaixo como relat-lo.
Se uma consulta bem sucedida no master se recusou a executar no slave, e no parece prtico fazer um nova sincronizao completa do banco de dados (p.ex.: deletar o banco de dados slave e
fazer uma nova cpia do master), tente o seguinte:
Primeiro veja se a tabela do slave estava diferente da do master. Entenda como isto aconteceu (pode ser um erro: leia o registro de alteraes no manual online do MySQL como
http://www.mysql.com/documentation para verificar se este um erro conhecido e se ele j
381
est corrigido). Ento faa a tabela do slave idntica a do master e execute START SLAVE.
Se o acima no funcionar ou no se aplica, tente entender se ele estaria seguro para fazer
uma atualizao manualmente (se necessrio) e ento ignorar a prxima consulta do master.
Se voc decidiu que voc pode saltar a prxima consulta, execute as seguintes instrues:
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n;
mysql> START SLAVE;
O valor de n deve ser 1 se a consulta no usa AUTO_INCREMENT ou
LAST_INSERT_ID(). Seno, o valor de ser 2. A razo para usarem um valor de 2 para
consultas que usam AUTO_INCREMENT ou LAST_INSERT_ID() que elas gastam dois
eventos no log binrio do master.
Tenha certeza de que voc no est tendo problemas com um erro antigo atualizando para a
verso mais recente.
Se voc tem certeza que o slave iniciou perfeitamente em sincronia com o master, e que as
tabelas envolvidas no foram atualizadas fora da thread slave, relate o erro.
Verifique se nenhum erro de usurio est envolvido. Por exemplo, se voc atualiza o slave fora
da thread slave, os dados podem ficar fora de sincronia e podem ocorrer violaes de chave
nica nas atualizaes. Neste caso a thread slave ir terminar e esperar que voc limpe as tabelas manualmente para entrar em sincronia. Este no um problema de replicao; um problema de interferncia externa que faz com que a replicao falhe.
2.
Execute o slave com as opes log-slave-updates e log-bin. Elas faro com que o registre todas as atualizaes que ele receber no seu prprio log binrio.
3.
4.
A sada de SHOW MASTER STATUS no master na hora que voc descobriu o problema.
A sada de SHOW SLAVE STATUS no master na hora que voc descobriu o problema.
Utilize mysqlbinlog para examinar os logs binrios. A informao a seguir pode ser til para encontrar a consulta problemtica, por exemplo:
mysqlbinlog -j pos_from_slave_status /caminho/para/log_do_slave | head
382
Uma vez que voc coletou as evidncias do problema fantasma, tente isol-lo em um caso de testes
separados inicialmente. Ento relate o problema para http://bugs.mysql.com/ com a maior quantidade possveis de informaes.
383
Pesquisa em disco necessrio tempo para o disco encontrar uma quantidade de dados. Com
discos modernos em 1999, o tempo mdio para isto era normalmente menor que 10ms, portanto
em teoria poderamos fazer 100 buscas por segundo. Este tempo melhora moderadamente com
discos novos e isso muito difcil otimizar para uma nica tabela. A maneira de otimizar isto
colocando os dados em mais de um disco.
Leitura de disco/Escrita (I/O) Quando o disco estiver na posio correta precisaremos que os dados sejam lidos. Com discos mais modernos em 1999, um disco retorna algo em torno de
10-20Mb/s. Isto mais fcil de otimizar que as buscas porque voc pode ler vrios discos em paralelo.
Ciclos de CPU. Quando tivermos os dados na memria principal (ou se eles j estiverem l) precisaremos process-los para conseguir nosso resultado. O fator de limitao mais comum ter
ppequenas tabelas, comparadas com a memria. Mas, com pequenas tabelas, normalmente no
teremos problemas com velocidade.
Largura de banda da memria. Quando a CPU precisa de mais dados que podem caber no cache
da CPU a largura da banda da memria principal se torna um gargalo. Isto um gargalo muito
incomum para a maioria dos sistema, mas bom estarmos ciente dele.
Se voc inserir um valor 'errado' em uma coluna, como um NULL em uma coluna NOT NULL
ou um valor numrico muito grande em uma coluna numrica, o MySQL definir a coluna com o
'melhor valor possvel' em vez de dar um erro. Para valores numricos isto 0, o menor valor
possvel ou o maior valor possvel. Para strings into tanto uma string vazia quanto a maior
string possvel que possa estar na coluna.
384
Otimizao do MySQL
Todas as expresses calculadas retornam um valor que pode ser usado em vez de apresentar uma
condio de erro. Por exemplo, 1/0 retorna NULL
Para mais informaes sobre isto, veja See Seco 1.8.5, Como o MySQL Lida com Restries.
O mostrado acima quer dizer que no se deve usar o MySQL para verificar o contedo dos campos,
mas deve se fazer isto no aplicativo.
5.1.2. Portabilidade
Como todos os servidores SQL implementam diferentes partes de SQL, trabalhoso escrever aplicativos SQL portveis. Para selects/inserts muito simples muito fcil, mas quanto mais recursos voc
precisa, mais difcil se torna. Se voc quiser uma aplicao quue rpida com muitos bancos de dados ela se torna ainda mais difcil.
Para fazer um aplicativo portvel complexo voc precisa escolher um nmero de servidores SQL
com o qual ele deve trabalhar.
Voc
pode
utilizar
o
MySQL
programa/web-page
crash-me
http://www.mysql.com/information/crash-me.php - para encontrar funes, tipos e limites que voc
pode utilizar com uma seleo de servidores de bancos de dados. O Crash-me agora testa quase tudo
possvel, mas continua compreensvel com aproximadamente 450 itens testados.
Por exemplo, voc no deve ter nomes de colunas maior do que 18 caracteres se desejar utilizar o
Informix ou DB2.
Os programas de benchmarks e crash-me do MySQL so bastante independentes do bancos de
dados. Dando uma olhada em como ns os tratamos, voc pode sentir o que necessrio para escrever sua aplicao independente do banco de dados. Os benchmarks podem ser encontrados no diretrio sql-bench na distribuio fonte do MySQL. Eles so escritos em Perl com a interface de
banco de dados DBI (que resolve a parte do problema de acesso).
Veja http://www.mysql.com/information/benchmarks.html para os resultados deste benchmark.
Como pode ser visto nestes resultados, todos os bancos de dados tem alguns pontos fracos. Isto ,
eles possuem diferentes compromissos de projeto que levam a comportamentos diferentes.
Se voc procura por independencia de banco de dados, precisar ter uma boa idia dos gargalos de
cada servidor SQL. O MySQL muito rpido para recuperao e atualizao de dados, mas ter
problemas em misturar leituras/escritas lentas na mesma tabela. O Oracle, por outro lado, possui um
grande problema quando voc tentar acessar registros que foram recentemente atualizados (at eles
serem atualizados no disco). Bancos de dados transacionais geralmente no so muito bons gerando
tabelas de resumo das tabelas log, nestes casos o travamento de registros praticamente intil.
Para fazer sua aplicao realmente independente de banco de dados, voc precisar definir uma interface que possa ser expandida, por meio da qual voc far a manipulao dos dados. Como o C++
est disponvel na maioria dos sistemas, faz sentido utilizar classes C++ para fazer a interface ao
banco de dados.
Se voc utilizar algum recurso especfico para algum banco de dados (como o comando REPLACE
no MySQL), voc deve codificar um mtodo para os outros serviodores SQL para implementar o
mesmo recurso (mas mais lento). Com o MySQL voc pode utilizar a sintaxe /*! */ para adicionar palavras chave especficas do MySQL para uma query. O cdigo dentro de /**/ ser tratado
como um comentrio (ignorado) pela maioria dos servidores SQL.
Se alta performance REAL mais importante que exatido, como em algumas aplicaes WEB,
uma possibilidade criar uma camada de aplicao que armazena todos os resultados para lhe fornecer uma performance ainda mais alta. Deixando resultados antigos 'expirar' depois de um tempo, voc pode manter o cache razoavelmente atual. Isto muito bom no caso de uma carga extremamente
pesada, pois neste caso voc pode aumentar o cache dinamicamente e configurar o tempo de expirao maior at que as coisas voltem ao normal.
385
Otimizao do MySQL
Neste caso a informao de criao de tabelas devem conter informaes do tamanho inicial do cache e com qual frequncia a tabela, normalmente, deve ser renovada.
386
Otimizao do MySQL
Este conjunto de benchmark pretende ser um benchmark que ir dizer a qualquer usurio que operaes uma determinada implementao SQL ir realizar bem ou mal.
Note que este benchmark utiliza uma nica thead, portanto ele mede o tempo mnimo para as operaes realizadas. Planejamos adicionar vrios testes multi-threaded no conjunto de benchmark no futuro.
A seguinte tabela mostra alguns resultados comparativos de benchmark para diversos servidores de
bancos de dados quando acessados por meio do ODBC em uma mquina Windows NT 4.0.
Lendo 2000000 linhas por ndice
Segundos
Segundos
mysql
367
249
mysql_odbc
464
db2_odbc
1206
informix_odbc
121126
ms-sql_odbc
1634
oracle_odbc
20800
solid_odbc
877
sybase_odbc
17614
Segundos
Segundos
mysql
381
206
mysql_odbc
619
db2_odbc
3460
informix_odbc
2692
ms-sql_odbc
4012
oracle_odbc
11291
solid_odbc
1801
sybase_odbc
4802
Para os testes anteriores, o MySQL foi executado com um cache de ndices de 8M.
Temos
concentrado
alguns
resultados
http://www.mysql.com/information/benchmarks.html.
de
benchmarks
em
Perceba que a Oracle no est includa porque eles solicitaram a remoo. Todos benchmarks Oracle devem ser aprovados pela Oracle! Acreditamos que os benchmarks da Oracle so MUITO tendecioso pois os benchmarks acima devem ser executados supostamente para uma instalao padro
para um nico cliente.
Para executar a suite de benchmarks, as seguintes exigncias devem ser satisfeitas:
O pacote de benchamark fornecido com a distribuio fonte do MySQL, assim voc deve ter
uma distribuio fonte. Voc tambm pode fazer um download de uma distribuio em
http://www.mysql.com/downloads/, ou usar a rvore fonte de desenvolvimento atual. (see Seco 2.3.4, Instalando pela rvore de fontes do desenvolvimento).
Os scripts do benchmark so escritos em Perl e usam o mdulo Perl DBI para acessar o servidor
de banco de dados, assim o DBI deve estar instalado. Voc tambm precisar do driver DBD espercfico do servidor para cada um dos servidores que voc quer testar. Por exemplo, para testar
o MySQL, PostgreSQL, e DB2, os mdulos DBD::mysql, DBD::Pg e DBD::DB2 devem estar
instalados.
387
Otimizao do MySQL
Otimizao do MySQL
Se voc no tiver nenhuma instruo GRANT realizada, MySQL otmizar a verificao de permisses de alguma forma. Dessa forma, se voc possui um volume muito alto, o tempo pode piorar tentando permitir o acesso. Por outro lado, maior verificao de permisses resulta em uma sobrecarga
maior.
Se o seu problema com alguma funo explcita do MySQL, voc pode sempre consultar o tempo
da mesma com o cliente MySQL:
mysql> SELECT BENCHMARK(1000000,1+1);
+------------------------+
| BENCHMARK(1000000,1+1) |
+------------------------+
|
0 |
+------------------------+
1 row in set (0.32 sec)
O exemplo acima demonstra que o MySQL pode excutar 1.000.000 expresses + em 0.32 segundos
em um PentiumII 400MHz.
Todas funes MySQL devem ser bem otimizadas, mas existem algumas excesses e o benchmark(loop_count,expression) uma tima ferramenta para saber se existe um problema
com sua query.
EXPLAIN nome_tabela
EXPLAIN SELECT opes_select
EXPLAIN nome_tabela um sinnimo para DESCRIBE nome_tabela ou SHOW COLUMNS FROM nome_tabela.
Quando uma instruo SELECT for precedida da palavra chave EXPLAIN, o MySQL explicar como ele deve processar a SELECT, fornecendo informao sobre como as tabelas esto sendo unidas
e em qual ordem.
Com a ajuda de EXPLAIN, voc pode ver quando devem ser adicionados ndices tabelas para obter uma SELECT mais rpida que utiliza ndices para encontrar os registros.
Voce deve executar frequentemente ANALYZE TABLE para atualizar estatsticas de tabela tais como a cardinalidade das chaves que podem afetar a escolha que o otimizador faz. See Seco 4.6.2,
Sintaxe de ANALYZE TABLE.
Voc tambm pode ver se o otimizador une as tabelas em uma melhor ordem. Para forar o otimizador a utilizar uma ordem especfica de join para uma instruo SELECT, adicione uma clusula
STRAIGHT_JOIN.
Para ligaes mais complexas, EXPLAIN retorna uma linha de informao para cada tabela utilizada na instruo SELECT. As tabelas so listadas na ordem que seriam lidas. O MySQL soluciona todas as joins utilizando um mtodo multi-join de varedura simples. Isto significa que o MySQL l
uma linha da primeira tabela, depois encontra uma linha que combina na segunda tabela, depois na
terceira tabela e continua. Quando todas tabelas so processadas, ele exibe as colunas selecionadas e
recua atravs da lista de tabelas at uma tabela na qual existem registros coincidentes for encontrada. O prximo registro lido desta tabela e o processo continua com a prxima tabela.
No MySQL verso 4.1 a sada do EXPLAIN foi alterada para funcionar melhor com construes como UNIONs, subqueries e tabelas derivadas. A mais notvel a adio de duas novas colunas: id e
select_type.
A sada de EXPLAIN inclui as seguintes colunas:
389
Otimizao do MySQL
id
Identificador SELECT, o nmero sequncial desta SELECT dentro da consulta.
select_type
Tipo de clusula SELECT, que pode ser uma das seguintes:
SIMPLE
SELECT simples (sem UNIONs ou subqueries).
PRIMARY
SELECT mais externa.
UNION
Segunda SELECT e as SELECTs posteriores do UNION
DEPENDENT UNION
Seunda SELECT e SELECTs posteriores do UNION, dependente da subquery exterior.
SUBQUERY
Primeiro SELECT na subquery.
DEPENDENT SUBQUERY
Primeiro SELECT, dependente da subquery exterior.
DERIVED
SELECT de tabela derivada (subquery na clusula FROM).
table
A tabela para a qual a linha de sada se refere.
type
O tipo de join. Os diferentes tipos de joins so listados aqui, ordenados do melhor para o pior tipo:
system
A tabela s tem uma linha (= tabela de sistema). Este um caso especial do tipo de join
const.
const
A tabela tm no mximo um registro coincidente, o qual ser lido na inicializao da consulta. Como s h um registro, os valores da coluna neste registro podem ser considerados
constantes pelo resto do otimizador. Tabelas const so muito rpidas e so lidas apenas
uma vez!
const usado quando voc compara todas as partes de uma chave PRIMARY/UNIQUE
com restries:
SELECT * FROM const_table WHERE primary_key=1;
SELECT * FROM const_table
390
Otimizao do MySQL
eq_ref
Uma linha ser lida desta tabela para cada combinao de linhas da tabela anterior. Este o
melhor tipo de join depois dos tipos const. usado quando todas as partes do ndice so
usados pela join e o ndice nico (UNIQUE) ou uma chave primria (PRIMARY KEY).
eq_ref pode ser usado para coluna indexadas que comparada com o\ operador =. O item
comparado pode ser uma constante ou uma expresso que usa colunas de tabelas que so lidas antes desta tabela.
Nos seguintes examplos, ref_table poder usar eq_ref
SELECT * FROM ref_table,other_table
WHERE ref_table.key_column=other_table.column;
SELECT * FROM ref_table,other_table
WHERE ref_table.key_column_part1=other_table.column
AND ref_table.key_column_part2=1;
ref
Todas as colunas com valores de ndices correspondentes sero lidos desta tabela para cada
combinao de registros da tabela anterior. ref usado se o join usa apenas o prefixo mais
a esquerda da chave, ou se a chave no nica (UNIQUE) ou uma chave primria (PRIMARY KEY) (em outras palavras, se a join no puder selecionar um nico registro baseado
no valor da chave). Se a chave que usada coincide apenas em alguns registros, este tipo de
join bom.
ref pode ser usado para colunas indexadas que so comparadas com o operador =.
Nos seguintes exemplos, ref_table poder usar ref
SELECT * FROM ref_table WHERE key_column=expr;
SELECT * FROM ref_table,other_table
WHERE ref_table.key_column=other_table.column;
SELECT * FROM ref_table,other_table
WHERE ref_table.key_column_part1=other_table.column
AND ref_table.key_column_part2=1;
ref_or_null
Como ref, mas com o adicional que faremos uma busca extra para linhas com NULL. See
Seco 5.2.5, Como o MySQL Otimiza IS NULL.
SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;
Esta otimizao do tipo join nova para o MySQL 4.1.1 e mais usada na resoluo de sub
queries.
range
Apenas registros que esto numa dada faixa sero retornados, usando um ndice para selecionar os registros. A coluna key indica qual ndice usado. key_len contm a maior parte
da chave que foi usada. A coluna ref ser NULL para este tipo.
range pode ser usado para quando uma coluna de chave comparada a uma constante com
391
Otimizao do MySQL
*
*
*
*
FROM
FROM
FROM
FROM
range_table
range_table
range_table
range_table
WHERE
WHERE
WHERE
WHERE
key_column
key_column
key_column
key_part1=
= 10;
BETWEEN 10 and 20;
IN (10,20,30);
10 and key_part2 IN (10,20,30);
index
Isto o mesmo que ALL, exceto que apenas a rvore de ndice varrida. Isto normalmente
mais rpido que ALL, j que o arquivo de ndice normalmente menor que o arquivo de dados.
Ele pode ser usado quando a consulta s usa colunas que so parte de um ndice.
ALL
Ser feita uma varredura completa da tabela para cada combinao de registros da tabela anterior. Isto normalmente no bom se a tabela a primeiro tabela no marcada como
const, e normalmente muito ruim em todos os casos ordenados. Voc normalmente pode
ebitar ALL adicionando mais ndices, assim o registro pode ser retornado baseado em valores
constantes ou valores de colunas de tabelas anteriores.
possible_keys
A coluna possible_keys indica quais ndices o MySQL pode utilizar para encontrar os registros nesta tabela. Note que esta coluna totalmente independente da ordem das tabelas. Isto
significa que algumas das chaves em possible_keys podem no ser usadas na prtica com a
ordem de tabela gerada.
Se esta coluna for NULL, no existem ndices relevantes. Neste caso, voc poder melhora a performance de sua query examinando a clusula WHERE para ver se ela refere a alguma coluna ou
colunas que podem ser indexadas. Se for verdade, crie um ndice apropriado e confira a consulta
com EXPLAIN novamente. See Seco 6.5.4, Sintaxe ALTER TABLE.
Para ver os ndices existentes em uma tabela, utilize SHOW INDEX FROM nome_tabela.
key
A coluna key indica a chave (ndice) que o MySQL decidiu usar. A chave ser NULL se nenhum ndice for escolhido. Para forar o MySQL a usar um ndice listado na coluna possible_keys, use USE INDEX/IGNORE INDEX em sua consulta. See Seco 6.4.1, Sintaxe
SELECT .
Executando myisamchk --analyze (see Seco 4.5.6.1, Sintaxe do myisamchk) ou
ANALYSE TABLE (see Seco 4.6.2, Sintaxe de ANALYZE TABLE) na tabela tambm ajudar o otimizador a escolher ndices melhores.
key_len
A coluna key_len indica o tamanho da chave que o MySQL decidiu utilizar. O tamanho ser
NULL se key for NULL. Note que isto nos diz quantas partes de uma chave multi-partes o
MySQL realmente est utilizando.
ref
A coluna ref exibe quais colunas ou contantes so usadas com a key para selecionar registros
da tabela.
rows
392
Otimizao do MySQL
A coluna rows informa o nmero de linhas que o MySQL deve examinar para executar a consulta.
Extra
Esta coluna contem informaes adicionais de como o MySQL ir resolver a consulta. A seguir
uma explicao das diferentes strings de texto que podem ser encontradas nesta coluna:
Distinct
O MySQL no continuar a procurar por mais registros para a combinao de registro atual
depois de ter encontrado o primeiro registro coincidente.
Not exists
O MySQL estava apto a fazer uma otimizao LEFT JOIN na consulta e no examinar
mais registros nesta tabela para a combinao do registro anterior depois que encontrar um
registro que satisfaa o critrio do LEFT JOIN.
Exemplo:
SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id
WHERE t2.id IS NULL;
Assume que t2.id definido com NOT NULL. Neste caso o MySQL ir percorrer t1 e
procurar pelos registros em t2 atravs de t1.id. Se o MySQL encontrar um registro combinando em t2, ele sabe que t2.id nunca poder ser NULL e no ir percorrer at o resto
dos registros em t2 que possuirem o mesmo id. Em outras palavras, para cada registro em
t1 o MySQL s precisa fazer uma nica pesquisa em t2, independente de quantos registros
coincidentes existirem em t2.
Using filesort
O MySQL precisar fazer uma passada extra para descobrir como recuperar os registros na
ordem de classificao. A classificao feita indo atravs de todos os registros de acordo
com join type e armazenar a chave de ordenao mais o ponteiro para o registro para todos os registros que combinarem com o WHERE. Ento as chaves so classificadas. Finalmente os registros so recuperados na ordem de classificao.
Using index
A informao da coluna recuperada da tabela utilizando somente informaes na rvore de
ndices sem ter que fazer uma pesquisa adicional para ler o registro atual. Isto pode ser feito
quando todas as colunas usadas para a tabela fizerem parte do mesmo ndice.
Using temporary
Para resolver a consulta, o MySQL precisar criar uma tabela temporria para armazenar o
resultado. Isto acontece normalmente se voc fizer um ORDER BY em um conjunto de colunas diferentes das quais voc fez um GROUP BY.
Using where
Uma clusula WHERE ser utilizada para restringir quais registros sero combinados com a
393
Otimizao do MySQL
prxima tabela ou enviar para o cliente. se voc no possui esta informao e a tabela do tipo ALL ou index, pode existir alguma coisa errada na sua query (Se voc no pretender
examinar todos os registros da tabela).
Se voc desejar deixar suas consultas o mais rpido possvel, voc deve dar uma olhada em
Using filesort e Using temporary.
Voc pode ter uma boa indicao de quo boa sua join multiplicando todos os valores na coluna
rows na sada de EXPLAIN. Isto deve dizer a grosso modo quantos registros o MySQL deve examinar para executar a consulta. Este nmero tambm usado quando voc restringe consultas com a
varivel max_join_size. See Seco 5.5.2, Parmetros de Sintonia do Servidor.
O exemplo a seguir mostra como um JOIN pode ser otimizado progressivamente utilizando a informao fornecida por EXPLAIN.
Suponha que voc tem a instruo SELECT exibida abaixo, que voc est examinando utilizando
EXPLAIN:
EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,
tt.ProjectReference, tt.EstimatedShipDate,
tt.ActualShipDate, tt.ClientID,
tt.ServiceCodes, tt.RepetitiveID,
tt.CurrentProcess, tt.CurrentDPPerson,
tt.RecordVolume, tt.DPPrinted, et.COUNTRY,
et_1.COUNTRY, do.CUSTNAME
FROM tt, et, et AS et_1, do
WHERE tt.SubmitTime IS NULL
AND tt.ActualPC = et.EMPLOYID
AND tt.AssignedPC = et_1.EMPLOYID
AND tt.ClientID = do.CUSTNMBR;
Para este exemplo, assuma que:
Coluna
Tipo da coluna
tt
ActualPC
CHAR(10)
tt
AssignedPC
CHAR(10)
tt
ClientID
CHAR(10)
et
EMPLOYID
CHAR(15)
do
CUSTNMBR
CHAR(15)
ndice
tt
ActualPC
tt
AssignedPC
tt
ClientID
et
do
394
Otimizao do MySQL
Initially, before any optimizations have been performed, the EXPLAIN statement produces the following information:
table
et
do
et_1
tt
type possible_keys
key key_len
ALL PRIMARY
NULL NULL
ALL PRIMARY
NULL NULL
ALL PRIMARY
NULL NULL
ALL AssignedPC,ClientID,ActualPC NULL NULL
range checked for each record (key map: 35)
ref
NULL
NULL
NULL
NULL
rows
74
2135
74
3872
Extra
Como o tipo ALL em todas tabelas, esta sada indica que o MySQL est gerando um produto
Cartesiano de todas as tabelas! Isto levar muito tempo para ser executado, pois o produto do nmero de registros em cada tabela deve ser examinado ! Neste caso, existem 74 * 2135 * 74 *
3872 registros. Se as tabelas forem maiores, imagine quanto tempo este tipo de consulta pode demorar.
Um dos problemas aqui que o MySQL no pode (ainda) utilizar ndices em colunas de maneira
eficiente se elas foram declaras ide forma diferente. Neste contexto, VARCHAR e CHAR so o mesmo a menos que tenham sido declarados com tamanhos diferentes. Como tt.ActualPC declarado como CHAR(10) e et.EMPLOYID declarado como CHAR(15), existe aqui uma diferena
de tamanho.
Para corrigir esta diferena entre tamanhos de registros, utilize ALTER TABLE para alterar o tamanho de ActualPC de 10 para 15 caracteres:
mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);
Agora ambos campos tt.ActualPC e et.EMPLOYID so VARCHAR(15). Executando a instruo EXPLAIN novamente produzir este resultado:
table type
possible_keys
key
key_len ref
tt
ALL
AssignedPC,ClientID,ActualPC NULL NULL NULL
do
ALL
PRIMARY
NULL
NULL
NULL
range checked for each record (key map: 1)
et_1 ALL
PRIMARY
NULL
NULL
NULL
range checked for each record (key map: 1)
et
eq_ref PRIMARY
PRIMARY 15
tt.ActualPC
rows
3872
2135
Extra
Using where
74
1
Isto no est perfeito, mas est bem melhor ( o produto dos valores de rows agora menor por um
fator de 74 ). Esta verso executada em vrios segundos.
Uma segunda alterao pode ser feita para eliminar as diferenas de tamanho das colunas para as
comparaes tt.AssignedPC = et_1.EMPLOYID e tt.ClientID = do.CUSTNMBR :
mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),
->
MODIFY ClientID
VARCHAR(15);
Agora EXPLAIN produz a sada mostrada abaixo:
table type
et
ALL
tt
ref
possible_keys
PRIMARY
AssignedPC,
ClientID,
ActualPC
eq_ref PRIMARY
eq_ref PRIMARY
key
key_len ref
NULL
NULL
NULL
ActualPC 15
et.EMPLOYID
et_1
do
PRIMARY
PRIMARY
15
15
rows Extra
74
52
Using where
tt.AssignedPC 1
tt.ClientID
1
Otimizao do MySQL
possible_keys
AssignedPC
ClientID,
ActualPC
eq_ref PRIMARY
eq_ref PRIMARY
eq_ref PRIMARY
key
NULL
key_len ref
NULL
NULL
et
et_1
do
PRIMARY 15
PRIMARY 15
PRIMARY 15
rows Extra
3872 Using where
tt.ActualPC
1
tt.AssignedPC 1
tt.ClientID
1
Perceba que a coluna rows na sada de EXPLAIN uma boa ajuda para otimizador de joins do
MySQL. Para otimizar uma consulta, voc deve conferir se os nmeros esto perto da realidade. Se
no, voc pode obter melhor desempenho utilizando STRAIGHT_JOIN em sua instruo SELECT
e tentar listar as tabelas em uma ordem diferente na clusula FROM.
Otimizao do MySQL
parte do ndice que indica o nmero mdio de registros que tem o mesmo valor. (Para ndices
nicos, isto sempre 1, claro). O MySQL usar isto para decidir qual ndice escolher quando
voc conectar duas tabelas utilizando uma 'expresso no constante'. Os resultados de analyze
podem ser conferidos utilizando SHOW INDEX FROM nome_tabela e examindo a coluna
Cardinality.
Para ordenar um ndice e dados de acordo com um ndice, utilize myisamchk -sort-index --sort-records=1 (se voc deseja ordenar pelo ndice 1). Se voc possui
um ndice unico no qual deseja ler todos registros na ordem do ndice, esta uma boa forma para
torn-lo mais rpido. Perceba entretanto, que esta ordenao no foi escrita de maneira otimizada e levar muito tempo em tabelas grandes!
Enlaos de constantes:
(a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5
COUNT(*) em uma nica tabela sem um WHERE recuperado diretamente da informao da tabela dos tipos MyISAM e HEAP. Isto tambm feito para qualquer expresso NOT NULL quando usada somente com uma tabela.
Pr deteco de expresses contantes invlidas. O MySQL detecta rapidamente que algumas instrues SELECT so impossveis e no retornar registros.
Para cada sub-join, um WHERE mais simples construdo para obter uma avaliao mais rpida
de WHERE para cada sub-join e tambm para saltar registros da maneira mais rpida possvel.
Todas tabelas constantes so lidas primeiro, antes de qualquer tabelas na consulta. Uma tabela
constante :
Uma tabela que usada com uma clusula WHERE em um ndice UNIQUE, ou uma PRIMARY KEY, onde todas as partes do ndice so usadas com expresses constantes e as partes
397
Otimizao do MySQL
A melhor combinao de join para unir as tabelas encontrada tentando todas as possibilidades.
Se todas colunas em ORDER BY e em GROUP BY vierem da mesma tabela, ento esta tabela
ser preferencialmente a primeira na unio.
Cada ndice de tabela consultado e o melhor ndice que cobrir menos de 30% dos registros
usado. Se nenhum ndice for encontrado, uma varredura rpida feita pela tabela.
Em alguns casos, o MySQL pode ler registros do ndice mesmo sem consultar o arquivo de dados. Se todas colunas usadas do ndice so numricas, ento somente a rvore de ndice usada
para resolver a consulta.
Antes de dar sada em cada registro, aqueles que no combinam com a clusula HAVING so ignorados.
As seguintes consultas so resolvidas utilizando somente a rvore de ndices (assumindo que as colunas indexadas so numricas):
mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val;
mysql> SELECT COUNT(*) FROM tbl_name
->
WHERE key_part1=val1 AND key_part2=val2;
mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1;
As consultas a seguir utilizam indexao para recuperar os registros na ordem de classificao sem
um passo de ordenao separado:
mysql> SELECT ... FROM tbl_name
->
ORDER BY key_part1,key_part2,... ;
mysql> SELECT ... FROM tbl_name
->
ORDER BY key_part1 DESC,key_part2 DESC,... ;
Otimizao do MySQL
com IS NULL.
SELECT * FROM table_name WHERE key_col IS NULL;
SELECT * FROM table_name WHERE key_col <=> NULL;
SELECT * FROM table_name WHERE key_col=# OR key_col=# OR key_col IS NULL
Se voc usa column_name IS NULL em um NOT NULL em uma clusula WHERE na tabela
que no usada no OUTER JOIN, esta espresso ser otimizada de qualquer forma.
O MySQL 4.1. pode adicionalmente otimizar a combinao column = expr AND column
IS NULL, uma forma que comum em sub queries resolvidas. EXPLAIN mostrar
ref_or_null quando esta otimizao usada.
Esta otimizao pode tratar um IS NULL para qualquer parte da chave.
Alguns exemplos de consultas que so otimizadas (assumindo chave em t2 (a,b)):
SELECT
SELECT
SELECT
SELECT
SELECT
*
*
*
*
*
FROM
FROM
FROM
FROM
FROM
ref_or_null funciona fazendo primeiro uma leitura na chave indicada e depois disto uma busca
separada por linhas com chave NULL.
Note que a otimizao s pode tratar um nvel IS NULL.
SELECT * FROM t1,t2 where (t1.a=t2.a AND t2.a IS NULL) OR (t1.b=t2.b AND t2.b IS
No caso acima o MySQL s usar busca de chave na parte (t1.a=t2.a AND t2.a IS
NULL) e no poder usar a parte da chave em b.
A tabela B configurada para ser dependente da tabela A e de todas as tabelas das quais A depende.
399
Otimizao do MySQL
A tabela A configurada para ser dependente de todas as tabelas (exceto B) que so usadas na
condio LEFT JOIN.
A condio LEFT JOIN usada para decidir como devemos recuperar registros a partir da tabela B. (Em outras palavras, qualquer condio na clasula WHERE no usada).
Todas as otimizaes padres de join so feitas, com a excesso que uma tabela sempre lida
depois de todas as tabelas das quais dependente. Se existir uma dependncia circular o MySQL
ir emitir um erro.
Se existir um registro em A que coincida com a clusula WHERE, mas no existir nenhum registro em B que coincida com a condio ON ento um registro extra em B gerado com todas as
colunas com valor NULL.
Se voc utiliza LEFT JOIN para encontrar registros que no existem em alguma tabela e est
usando o seguinte teste: nome_coluna IS NULL na parte WHERE, onde nome_colun um
campo que declarado como NOT NULL, ento o MySQL para de pesquisar por mais registros
(para uma combinao particular de chaves) depois de ter encontrado um registro que combinar
com a condio LEFT JOIN.
Otimizao do MySQL
O ndice tambm pode ser usado mesmo se o ORDER BY no coincidir exatamente com o ndice,
uma vez que todas as partes de ndices no usadas e todos os extras na coluna ORDER BY so constantes na clusula WHERE. A seguinte consulta usar o ndice para resolver a parte ORDER BY /
GROUP BY:
SELECT
SELECT
SELECT
SELECT
SELECT
*
*
*
*
*
FROM
FROM
FROM
FROM
FROM
t1
t1
t1
t1
t1
ORDER
WHERE
WHERE
ORDER
WHERE
BY key_part1,key_part2,...
key_part1=constante ORDER BY key_part2
key_part1=constante GROUP BY key_part2
BY key_part1 DESC,key_part2 DESC
key_part1=1 ORDER BY key_part1 DESC,key_part2 DESC
Alguns casos onde o MySQL no pode usar ndices para resolver o ORDER BY: (Note que o
MySQL ainda usar ndices para encontrar o registro que coincide com a clusula WHERE):
As chaves usadas para buscar os registros so as mesmas usadas para fazer o ORDER BY:
SELECT * FROM t1 WHERE key2=constant ORDER BY key1
Voc est unindo muitas tabelas e as colunas nas quais voc est fazendo um ORDER BY no
so todas da primeira tabela que no const e que usada para retornar registros. (Esta a primeira tabela na sada do EXPLAIN que no usa um mtodo de busca de registro const).
O ndice da tabela usada um tipo de ndice que no armazena registros em ordem. (Como o ndice HASH em tabelsn HEAP).
Nestes casos onde o MySQL tem que ordenar o resultado, ele usa o seguinte algoritmo:
L todos os registros de acordo com a chave ou por uma varredura da tabela. Registros que no
coincidem com a clusula WHERE so saltados.
Quando o buffer ficar cheio, execute ordeno-o e armazene o resultado em um arquivo temposrrio. Salve um ponteiro para o bloco ordenado. (No caso de todos os regitros caberem no buffer
ordenado, nenhum arquivo temporrio criado).
Faz um multi-merge at MERGEBUFF (7) regies para um bloco em outro arquivo temporrio.
Repete at que todos os blocos do primeiro arquivo estejam no segundo arquivo.
No ltimo multi-merge, s o ponteiro para o registro (ltima parte de chave ordenada) escrito
em um arquivo de resultado.
Agora o cdigo em sql/records.cc ser usado para ler atravs deles ordenadamente usan401
Otimizao do MySQL
Altere tmpdir para apontar para um disco dedicado com muito espao vazio. Se voc usa o
MySQL 4.1 ou posterior voc pode distribuir a carga entre diversos discos fsicos definindo
tmpdir com uma lista de caminhos separados por dois pontos : (ponto e vrgula ; no Windows). Eles sero usados de acordo com o mtodo round-robin. Nota: Estes caminho devem estar em diferentes discos fsicos, e no em diferentes parties do mesmo disco.
Por padro, o MySQL ordena todas as consultas GROUP BY x,y[,...] como se voc tivesse
especificado ORDER BY x,y[,...]. Se voc incluir a clusula ORDER BY explicitamente, o
MySQL a otimizar sem qualquer penalidade na velocidade, embora a ordenacao ainda ocorra. Se a
consulta inclui um GROUP BY mas voc deseja evitar a sobrecarga da ordenar o resultado, voc pode suprimir a ordenacao especificando ORDER BY NULL:
INSERT INTO foo SELECT a,COUNT(*) FROM bar GROUP BY a ORDER BY NULL;
Se voc estiver selecionando apenas alguns registros com LIMIT, o MySQL usar ndices em
alguns casos quando ele normalmente preferiria fazer uma varredura completa na tabela.
Se voc utilizar LIMIT row_count com ORDER BY, O MySQL ir terminar a ordenao logo que ele encontrar os primeiros row_count registros em vez de ordenar a tabela inteira.
Ao combinar LIMIT row_count com DISTINCT, o MySQL ir parar logo que ele encontrar
row_count registros nicos.
Em alguns casos um GROUP BY pode ser resolvido lendo a chave em ordem (ou fazer uma classificao na chave) e ento calcular resumos at o valor da chave alterar. Neste caso, LIMIT
row_count no ir calcular nenhum GROUP BY desnecessrio.
Logo que o MySQL enviar os primeiros # registros para o cliente, ele ir abortar a consulta.
LIMIT 0 ir sempre retornar rapidamente um conjunto vazio. Isto util para conferir a consulta e obter os tipos de campos do resultado.
Quando o servidor utiliza tabelas temporrias para resolver a consulta, o LIMIT row_count
usado para calcular a quantidade de espao necessrio.
402
Otimizao do MySQL
Conexo: (3)
Fechar: (1)
onde os nmeros so de certa forma proporcionais ao tempo total. Isto no leva em consideraco o
sobrecarga inicial para abrir tabelas (que feita uma vez para cada consulta concorrente em execuo).
O tamanho da tabela diminuem a velocidade da insero de ndices em N log N (Arvores B).
Algumas maneiras de acelerar as inseres:
Se voc estiver inserindo vrios registros do mesmo cliente ao mesmo tempo, utilize instrues
INSERT com listas de mltiplos valores. Isto muito mais rpido (muitas vezes em alguns casos) do que utilizar instrues INSERT separadas. Se voc esta adicionando dados a uma tabela
que no est vazia, voc pode ajustar a varivel bulk_insert_buffer_size para tornr
isto mais rpido. See Seco 4.6.8.4, SHOW VARIABLES.
Se voc inserir vrios registros de diferentes clientes, voc pode obter velocidades mais altas utilizando a instruo INSERT DELAYED. See Seco 6.4.3, Sintaxe INSERT.
Perceba que com MyISAM voc pode inserir registros ao mesmo tempo que SELECTs estejam
executando se no existirem registros apagados nas tabelas.
Ao carregar uma tabela de um arquivo texto, utilize LOAD DATA INFILE. Isto normalmente
20 vezes mais rpido do que utilizar vrias instrues INSERT See Seco 6.4.8, Sintaxe LOAD DATA INFILE.
possvel com algum trabalho extra fazer o LOAD DATA INFILE executar ainda mais rpido
quando a tabela tiver vrios ndices. Utilize o seguinte procedimento:
1.
Opcionalmente crie a tabela com CREATE TABLE. Por exemplo, utilizando mysql ou
Perl-DBI.
2.
3.
4.
Insira dados na tabela com LOAD DATA INFILE. Isto no atualizar ndices e ser muito
mais rpido.
5.
Se no futuro voc precisar da tabela somente para leitura, execute myisampack na mesma
para torn-la menor. See Seco 7.1.2.3, Caractersticas de Tabelas Compactadas.
6.
Otimizao do MySQL
mais rpido porque evita que seja feita muita busca disco. A rvore de ndices resultante
tambm balanceada perfeitamente.
7.
Note que LOAD DATA INFILE tamb faz a otimizao acima se voc a insero for em uma
tabela vazia; a principal diferena com o procedimento acima qeu voc pode deixar o myisamchk alocar muita mais memria temporria para a criao do ndice que voc deseje que o
MySQL alocasse para todas as recriaes de ndice.
Desde o MySQL 4.0 voc tambm pode usar ALTER TABLE nome_tbl DISABLE KEYS
em vez de myisamchk --keys-used=0 -rq /caminho/para/bd/nome_tbl e
ALTER TABLE nome_tbl ENABLE KEYS em vez de myisamchk -r -q /
caminho/para/bd/nome_tbl. Deste modo voc tambm pode saltar os passos FLUSH
TABLES.
Voc pode acelerar inseres feitas usando vrias instrues bloqueando suas tabelas:
mysql>
mysql>
mysql>
mysql>
Otimizao do MySQL
Consultas de atualizao so otimizadas como uma consulta que usa SELECT com a sobrecarga adicional de escrita. A velocida da escrita depende do tamanho dos dados e do nmero de ndices que
sero atualizados. ndices que no forem alterados no sero atualizados.
Outra forma para obter atualizaes rpidas atrasar as atualizaes e ento fazer vrias atualizaes em um registro posteriormente. Fazer vrias atualizaes em um registro muito mais rpido
do que fazer uma por vez se voc travar a tabela.
Perceba que, com formato de registros dinmicos, atualizar um registro para um valor maior que o
tamanho total pode dividir o registro. Portanto, se voc faz isso frequentemente, muito importante
usar OPTIMZE TABLE de vez em quando. See Seco 4.6.1, Sintaxe de OPTIMIZE TABLE.
Utilize conexes persistentes aos banco de dados para evitar a sobrecarga da conexo. Se voc
no poder utilizar conexes persistentes e for fazer vrias novas conexes para o banco de dados, voc pode desejar alterar o valor da varivel thread_cache_size. See Seco 5.5.2,
Parmetros de Sintonia do Servidor.
Sempre verifique se todas as suas consultas realmente utilizam os ndices que foram criados nas
tabelas. No MySQL voc pode fazer isto com o comando EXPLAIN. See Explain: (manual) Explain.
Tente evitar consultas SELECT complexas em tabelas que so muito atualizadas. Isto evita problemas com travamento de tabelas.
Com tabelas MyISAM que no tenham linhas deletadas, voc pode inserir registros ao mesmo
tempo que outra tabela a estiver lendo. Se este recurso importante para voc, deve considerar
mtodos onde voc no tem que apagar registrou ou executar OPTIMIZE TABLE depois de ter
apagado vrios registros.
Utilize ALTER TABLE ... ORDER BY expr1,expr2... se voc na maioria das vezes
recupera registros na ordem expr1,expr2... Utilizando esta opo depois de grandes alteraes
para a tabela, pode lhe dar um ganho de performance.
Em alguns casos pode fazer sentido introduzir uma coluna 'hash' baseada nas informaes das
outras colunas. Se esta coluna for curta e razoavelmente nica pode ser muito mais rpido do
que ter um grande ndice em vrias colunas. No MySQL muito fcil usar esta coluna extra:
SELECT * FROM nome_tabela WHERE hash=MD5(concat(col1,col2)) AND
col_1='constante' AND col_2='constante'
Para tabelas que alteram muito voc deve tentar evitar todas colunas VARCHAR ou BLOB. Voc
ter tamanho de registro dinmico assim que usar um simples campo VARCHAR ou BLOB. See
Captulo 7, Tipos de Tabela do MySQL.
Normalmente no muito til cortar uma tabela em diferentes tabelas apenas porque os registros
esto 'grandes'. Para acessar um registro, o maior problema para a performance a busca em disco para encontra o primeiro byte do registro. Depois de encontrar os dados a maioria dos novos
405
Otimizao do MySQL
discos podem ler o registro inteiro rpido o bastante para a maioria das aplicaes. Os nicos caos onde realmente faz sentido dividir uma tabela se ela uma tabela de registros com tamanho
dinmico (veja acima) que voc pode alterar para um tamanho fixo, ou se voc frequentemente
precisa examinar a tabela e no precisa da maioria das colunas. See Captulo 7, Tipos de Tabela
do MySQL.
Se frequentemente voc precisar calcular alguma coisa baseada em informao de vrios registros (ex: contagem de registros), provavlmente melhor introduzir uma nova tabela e atualizar o
contador em tempo real. Uma atualizao do tipo UPDATE table set count=count+1
where index_column=constante muito rapida!
Isto realmente importante quando voc usa bancos de dados como o MySQL que s tem travamento de tabelas (multiplos leituras/escrita nica). Isto tambm dar melhor performance com a
maioria dos banco de dados, j que o gerenciador de bloqueio de registro ter menos a fazer neste caso.
Se voc precisar colerar estatisicas de tabelas maiores, utilize tabelas resumo em vez de buscar
em toda a tabela. Manter os resumos deve ser mais rpido que tentar criar estatitscas instantaneamente. muito mais rpido criar novas tabelas atravs dos logs quando as coisas mudam
(dependendo das descises de negcio) que ter que alterar a aplicao em execuo.
Se possvel, deve-se classificar relatrios como 'instantneo' ou 'estatsticos' onde os dados necessrios para relatrios estaisticos so gerados apenas com base nas tabelas resumo que so geradas a partir dos dados atuais.
Tire vantagem do fato de que a coluna tem valores padres. Insira valores explicitamente apenas
quando os valores a serem inseridos diferem do padro. Isto reduz a analise que o MySQL precisa fazer e aumenta a velocidade de insero.
Em alguns casos conveniente empacotar e armazenar os dados em um campo blob. Neste caso
voc deve adicionar algum cdigo em sua aplicao para empacotar/desempacotar as coisas no
campo blob, mas isto pode poupar vrios acessos a algum estgio. Isto prtico quando voc
possui dados que no conformam com uma estrutura esttica de tabela.
Normalmente, voc deve tentar manter todos dados no-redundantes (o que chamado de 3a
forma normal na teoria de bancos de dados), mas voc no deve ter medo de duplicar alguns
itens ou criar tabelas de resumo se voc precisar delas para ganhar mais velocidade.
Stored Procedures ou UDF (funes definidas pelo usurios) pode ser uma boa forma para obter
mais performance. Neste caso voc deve, entretanto, sempre ter uma maneira de fazer isso de
outra maneira (mais lenta) se voc utilizar algum banco de dados que no suporta isto.
Voc sempr pode ganhar velocidade fazendo cache de perguntas/respostas na sua aplicao e
tentando fazer vrias inseres/atualizaes ao mesmo tempo. Se seu banco de dados suporta
travamento de tabelas (como o MySQL e Oracle), isto deve ajudar a garantir que o cache de ndices descarregado somente uma vez depois de todas atualizaes.
Use INSERT /*! DELAYED */ quando no precisar saber quando os dados so gravados.
Isto melhora a velocidade porque vrios registros podem ser gravados com uma simples escrita
em disco.
Use INSERT /*! LOW_PRIORITY */ quando voc desejar que suas consultas sejam mais
importantes.
Use SELECT /*! HIGH_PRIORITY */ para obter consultas que ignoram a fila. Isto , a
consulta feita mesmo se alguem estiver esperando para fazer uma escrita.
Use a instruo INSERT multi-linhas para armazenar vrios registros com um comando SQL
(vrios servidores SQL suportam isto).
Use LOAD DATA INFILE para carregar volumes maiores de dados. Isto mais rpido que as
inseres normais e mais rpido at quando o myisamchk for integrado no mysqld.
406
Otimizao do MySQL
Use OPTIMIZE TABLE de vez em quando para evitar fragmentao quando estiver usando
formatos de tabela dinmica. See Seco 4.6.1, Sintaxe de OPTIMIZE TABLE.
Use tabelas HEAP para obter mais velocidade sempre que possvel. See Captulo 7, Tipos de Tabela do MySQL.
Quando estiver usando uma configurao de servidor Web normal, imagens devem ser armazenadas como arquivos. Isto , armazene apenas uma referncia para o arquivo no banco de dados.
A principal razo para isto que um servidor Web normal muito melhor trabalhando com cache de arquivos do que com contedo de banco de dados. Portanto ser muito mais fcil obter
um sistema rpido se voc utilizar arquivos.
Use tabelas em memria para dados no-crticos que so acessados frequentemente (como informaes sobre o ltimo banner visto para usurios que no possuem cookies).
Colunas com informaes identicas em diferentes tabelas devem ser declaradas idnticas e ter
nomes idnticos. No entanto, antes da verso 3.23, voc pode obter ligaes mais lentas.
Tente manter os nomes mais simples (use nome em vez de nome_cliente na tabela cliente).
Para deixar seus nomes portveis para outros servidores SQL voc deve mant-los menores que
18 caracteres.
Se voc realmente precisa de alta velocidade, voc deve verificar as interfaces de baixo nvel para armazenagem de dados que os diferentes servidores SQL suportam! Por exemplo, para acessar tabelas MySQL MyISAM diretamente, voc pode obter um aumento de velocidade de 2-5 vezes comparado ao uso da interface SQL. Para conseguir essa faanha, os dados devem estar no
mesmo servidor que sua aplicao, e normalmente devem ser acessados por apenas um processo
(porque travamento de arquivos externo so muito lentos). Os problemas acima podem ser eliminados introduzindo comandos MyISAM de baixo nvel no servidor MySQL (isto pode ser a maneira mais fcil para aumentar a performance). Tenha cuidado em projetar a interface com o
banco de dados, ela deve ser bem facil para suportar estes tipos de otimizaes.
Em vrios casos mais rpido acessar dados de um banco de dados (utilizando uma conexo ativa) do que acessar um arquivo texto, apenas pelo fato do banco de dados ser mais compacto do
que o arquivo texto (se voc estiver utilizando dados numricos), e isto ir envolver menos acessos disco. Voc tambm ir poupar cdigo porque no ser necessrio analisar seus arquivos
texto para encontrar limites de registros e campos.
Voc pode tambm usar replicao para conseguir ainda mais performance nas suas aplicaes.
See Seco 4.11, Replicao no MySQL.
Declarando uma tabela com DELAY_KEY_WRITE=1 ir tornar a atualizao de ndices mais rpida, pois as mesmas no sero escritas em disco at o arquivo ser fechado. O lado ruim que
voc deve executar myisamchk nestas tabelas antes de iniciar o mysqld para garantir que os
dados esto corretos se o mysqld for finalizado no meio da execuo. Como a informao de
chave pode sempre ser gerada a partir dos dados, voc no deve perder nada usando DELAY_KEY_WRITE.
Otimizao do MySQL
Tipos de tabela InnoDB automaticamente adquire seus locks de registro e os tipos de tabela BDB
seus locks de pginas, durante o processamento das instrues SQL, e no no incio da transao.
O mtodo de bloqueio que o MySQL utiliza para ESCRITA funciona da seguinte forma:
O mtodo de bloqueio que o MySQL utilizado para LEITURA funciona da seguinte maneira:
Quando um bloqueio liberado, a trava fica disponvel para as threads na fila de bloqueios de escrita, e ento para as threads na fila de bloqueios de leitura.
Isto significa que se voc possui vrias atualizaes em uma tabela, instrues SELECT iro esperar
at que no existam mais atualizaes.
Para contornar este problema no caso onde voc precisa fazer vrias operaes de INSERT e SELECT em uma tabela, voc pode inserir registros em uma tabela temporria e atualizar a tabela real
com os registros da tabela temporria de uma s vez.
Isto pode ser feito usando o cdigo a seguir:
mysql>
mysql>
mysql>
mysql>
Otimizao do MySQL
tempo que outras threads esto lendo da mesma tabela. Perceba que atualmente isto funciona somente se no existirem buracos depois de registros apagados na tabela no momento que a insero
feita. Quando todos os buracos forem preenchidos com novos dados, inseres concorrentes iro automaticamente ser habilitadas novamente.
O bloqueio de tabelas habilita vrias threads para lerem de uma tabela ao mesmo tempo, mas se uma
thread desejar escrever a uma tabela, ela primeiramente deve obter acesso exclusivo. Durante a atualizao, todas outras threads que desejarem acessar esta tabela em particular iro esperar at que a
atualizao acabe.
Como atualizaes em tabelas normalmente so consideradas mais importantes que SELECT, todas
as instrues que atualizam uma tabela tem maior prioridade que instrues que simplesmente recuperam informaes. Isto deve garantir que atualizaes no fiquem na fila por terem sido passadas
vrias consultas pesadas em uma tabela especfica. (Voc pode alterar isto utilizando
LOW_PRIORITY com a instruo que faz a atualizao ou HIGH_PRIORITY com a instruo
SELECT.)
A partir do MySQL verso 3.23.7 pode-se utilizadar a varivel max_write_lock_count para
forar o MySQL a fornecer temporariamente a todas as instrues SELECT, que esperam por uma
tabela, uma prioridade mais alta depois de um nmero especfico de inseres em uma tabela.
O bloqueio de tabela no , no entanto, muito bom sobre os seguintes cenrios:
Um cliente emite uma SELECT que exige muito tempo para ser executada.
Outro cliente ento executa um UPDATE na tabela usada. Este cliente ter que esperar at que a
SELECT seja terminada.
Outro cliente executa outra instruo SELECT na mesma tabela. Como UPDATE tem maior prioridade que SELECT, esta SELECT ir esperar pelo trmino da UPDATE. Ela tambm ir esperar pelo trmino da primeira SELECT!
Uma thread est esperando por algo do tipo disco cheio, caso em que todas as threads que
desejam acessar a tabela com problema iro ser colocadas em estado de espera at que mais espao em disco seja disponvel.
Tente deixar suas instrues SELECT sempre rpidas. Voc pode ter que criar algumas tabelas
de resumo para fazer isto.
Inicie o mysqld com um valor baixo para max_write_lock_count para fornecer bloqueios de
LEITURA depois de um certo nmero de bloqueios de ESCRITA.
Voc pode especificar que todas as atualizaes de uma thread especfica deve ser feita utilizando prioridade baixa com o comando SQL: SET SQL_LOW_PRIORITY_UPDATES=1. See
Seco 5.5.6, Sintaxe de SET.
Voc pode especificar que uma SELECT especfica muito importante com o atributo
HIGH_PRIORITY. See Seco 6.4.1, Sintaxe SELECT .
Se voc tiver problemas com INSERT combinado com SELECT, utilize as novas tabelas MyISAM, pois elas suportam SELECTs e INSERTs concorrentes.
Otimizao do MySQL
no INSERT provavelmente ir resolver seus problemas. See Seco 6.4.3, Sintaxe INSERT.
Se voc tiver problemas com SELECT e DELETE, a opo LIMIT para DELETE pode ajudar.
See Seco 6.4.5, Sintaxe DELETE.
A varredura da tabela muito mais lenta porque voc tem que ler os ndices para encontrar os
dados.
No podem ser usados apenas a tabela de ndices para recuperar dados para uma consulta.
Voc perde muito espao de armazenagem, j que que os ndices devem ser duplicados nos ns
(pois os registros no podem ser armazenados nos ns).
Delees iro degenerar a tabela depois de um tempo (j que os ndices nos ns normalmente
no so atualizados na deleo).
Utilize os tipos mais eficientes (menores) sempre que possvel. O MySQL tem vrios tipos especializados que economizam espao em disco e memria.
410
Otimizao do MySQL
Utilize tipos inteiros menores se possvel para obter tabelas menores. Por exemplo, MEDIUMINT normalmente melhor que INT.
Declare colunas para serem NOT NULL se possvel. Isto deixa tudo mais rpido e voc economiza um bit por coluna. Perceba que se voc realmente precisa de NULL nas suas aplicaes, podem ser usados. Tente simplesmente no us-la em todas as colunas por padro.
Se voc no possui nenhuma coluna de tamanho varivel (VARCHAR, TEXT ou BLOB), um formato de registro de tamanho fixo para utilizado. Isto mais rpido mas infelizmente pode ocupar mais espao. See Seco 7.1.2, Formatos de Tabelas MyISAM.
O ndice primrio de uma tabela deve ser o mais curto possvel. Isto torna a identificao de um
registro fcil e eficiente.
Para cada tabela, voc deve decidir qual metdo de armazenamento/ndice utilizar. See Captulo 7, Tipos de Tabela do MySQL.
Crie somente os ndices necessrios. ndices so bons para recuperao mas ruins quando voc
precisa armazenar os dados rapidamente. Se na maioria das vezes voc acessa uma tabela pesquisando em uma combinao de colunas, crie um ndice para elas. A primeira parte do ndice
deve ser a coluna mais utilizada. Se voc SEMPRE utiliza vrias colunas, deve usar a coluna
com mais duplicaes em primeiro lugar para obter melhor compactao do ndice.
Se for melhor que uma coluna tenha um prefixo nico nos primeiros caracteres, melhor indexar somente este prefixo. O MySQL suporta um ndice em uma parte de uma coluna de caracteres. ndices menores so mais rpidos no somente porque eles exigem menos espao em disco
mas tambm porque eles iro fornecer a voc mais acerto no cache de ndice e isto diminui acessos a disco. See Seco 5.5.2, Parmetros de Sintonia do Servidor.
Em algumas circunstncias pode ser benfico dividir uma tabela que varrida frequentemente
em duas. Isto verdade especificamente se a tabela tiver um formato dinmico e for possvel utilizar um formato de tabela esttico que possa ser usada para encontrar os registros relevantes
quando se fizer uma varredura da tabela.
Para encontrar rapidamente os registros que coincidam com uma clusula WHERE.
Para encontrar o valor MAX() ou MIN() para uma coluna indexada espeifica. Isto otimizado
por um preprocessador que confere se voc est utilizando WHERE key_part_#=constante em todas as partes da chave < N. Neste caso o MySQL ir fazer uma simples procura na chave e trocar a expresso MIN() com uma constante. Se todas as expresses forem trocadas por constantes, a consulta retornar imediatamente:
411
Otimizao do MySQL
Para ordenar ou agrupar uma tabela se a ordenao ou agrupamento for feito em um prefixo
mais esquerda de uma chave util (por exemplo, ORDER BY key_part_1, key_part_2
). A chave lida na ordem invertida se todas as partes da chave forem seguidas por DESC. See
Seco 5.2.8, Como o MySQL Otimiza Clusulas ORDER BY.
Em alguns casos uma consulta pode ser otimizada para recuperar valores sem consultar o arquivo de dados. Se todas colunas utilizadas para alguma tabela so numricas e formam um prefixo
mais esquerda para alguma chave, os valores podem ser recuperados da rvore de ndices para
aumentar a velocidade:
SELECT key_part3 FROM nome_tabela WHERE key_part1=1
Otimizao do MySQL
O MySQL 4.0 faz outra otimizao em LIKE. Se voc usar ... LIKE "%string%" e string
tiver mais de 3 caracteres, o MySQL usar o algortmo Turbo Boyer-Moore para inicializar o
padro para a string e ento usar este padro para realizar a pesquisa mais rpido.
Buscas usando nome_coluna IS NULL usa ndices se nome_coluna um ndice.
O MySQL normalmente utiliza o ndice que encontra o menor nmero de registros. Um ndice
usado para colunas que voc compara com os seguintes operadores: =, >, >=, <, <=, BETWEEN ou
um LIKE com um padro que comea com um prefixo sem meta caracteres como 'algo%'.
Qualquer ndice que no cobrem todos os nveis de AND na clusula WHERE no utilizado para otimizar a consulta. Em outras palavras: Para poder usar um ndice, um prefixo do ndice deve ser utilizado em todo agrupamento AND.
A seguinte clusula WHERE utilizar ndices:
... WHERE index_part1=1 AND index_part2=2 AND other_column=3
... WHERE index=1 OR A=10 AND index=2
/* index = 1 OR index = 2 */
... WHERE index_part1='hello' AND index_part_3=5
/* optimised like "index_part1='hello'" */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;
/* Can use index on index1 but not on index2 or index 3 */
Estas clusulas WHERE no utilizam ndices:
... WHERE index_part2=1 AND index_part3=2
... WHERE index=1 OR A=10
... WHERE index_part1=1 OR index_part2=10
Perceba que algumas vezes o MySQL no utilizar um ndice, mesmo se algum estiver disponvel.
Um exemplo deste caso quando o uso do ndice necessita que o MySQL acesse mais de 30% dos
registros na tabela. (Neste caso uma varredura da tabela provavelmente mais rpido, j que ela necessitar de menos pesquisas em discos). No entanto, se uma consulta utiliza LIMIT para recuperar
somente parte dos registros, o MySQL ir utilizar um ndice de qualquer forma, pois assim pode encontrar os poucos registros mais rapidamente e retornar o resultado.
Otimizao do MySQL
tes.
No MySQL Verso 3.23.23 ou posterior, voc pode tambm criar ndices FULLTEXT especiais.
Eles so utilizados para pesquisas textuais. Somente o tipo de tabela MyISAM suporta ndices
FULLTEXT e apenas para colunas CHAR, VARCHAR e TEXT. Indexao sempre acontece sobre toda
a coluna e indexao parcial (prefixo) no suportada. Veja Seco 6.8, Pesquisa Full-text no
MySQL para detalhes.
Otimizao do MySQL
nada tabela simultaneamente. Para minimizar o problema com dois clientes tendo diferentes estados
no mesmo arquivo, a tabela aberta independentemente por cada thread concorrente. Isto exige
mais memria mas normalmente aumentar o desempenho. Com tabelas ISAM e MyISAM, um descritor extra de arquivo necessrio para o arquivo de dados, para cada cliente que tem a tabela aberta. O descritor de arquivo de ndice compartilhado entre todas as threads.
Voc pode ler mais sobre este tpico na prxima seo. See Seco 5.4.7, Como o MySQL Abre e
Fecha as Tabelas.
Quando a cache est cheia e um thread tenta abrir uma tabela que no est na cache.
Quando a cache contm mais que table_cache entradas e uma thread no est mais usando
uma tabela.
Quando o cache de tabela encher, o servidor usa o seguinte procedimento para encontrar uma entrada de cache para usar:
Se o cache estiver cheio e nenhuma tabelas pode ser liberada, mas uma nova tabela precisar ser
aberta, o cache extendido temporariamente quando necessrio.
Se o cache estiver no estado temporariamente extendido e uma tabela vai do estado em-uso para
o fora-de-uso, a tabela fechada e liberada do cache.
415
Otimizao do MySQL
A table is opened for each concurrent access. This means the table needs to be opened twice if two
threads access the same table or if a thread accesses the table twice in the same query (for example,
by joining the table to itself).
Uma tabela aberta para cada acesso simultneo. Isto significa a tabela precisa ser aberta duas vezes
se duas threads acessam a mesma tabela ou se uma thread acessa a tabela duas vezes na mesma consulta (por exemplo, fazendo um join da tabela com ela mesma). A primeira abertura de qualquer tabela exige dois descritores de arquivos; cada uso adicional da tabela exige somente um descritor. O
descritor extra para a primeira abertura para o arquivo de ndice: este descritor compartilhado entre todas as threads.
Se voc est abrindo uma tabela com a instruo HANDLER nome_tabela OPEN, uma tabela
dedicada alocada para a thread. Este objeto da tabela no compartilhado por outras threads e no
ser fechado at que a thread chame HANDLER nome_tabela CLOSE ou seja finalizada. See
Seco 6.4.9, Sintaxe HANDLER. Quando isto acontece, a tabela colocada de volta na cache de
tabela (se a cache no estiver cheia).
Voc pode conferir se o seu cache de tabela est muito pequeno conferindo a varivel opened_tables do mysqld. Se este valor for muito grande, mesmo se voc no fez vrios FLUSH
TABLES, voc deve aumentar o tamanho da sua cache de tabelas. See Seco 4.6.8.3, SHOW
STATUS.
Se voc possui RAM suficiente, voc pode remover todos os dispositivos de troca. Alguns sistemas operacionais iro utilizar um disposotico de troca em alguns contextos, mesmo se voc possuir memria livre.
Otimizao do MySQL
ba que isto no ir afetar a funcionalidade do MySQL se voc estiver executando um nico servidor. Apenas lembre-se de desligar o servidor (ou travar as partes relevantes) antes de executar
myisamchk. Em alguns sistemas esta opo obrigatrio porque o lock externo no funcionam em nenhum caso.
A opo --skip-external-locking est ligada por padro a partir do MySQL 4.0. Antes
disto, era ligada por padro quando compilando com MIT-pthreads, porque flock() no totalmente suportado pelas MIT-pthreads em todas plataformas. tambm o padro para Linux
pois o bloqueio de arquivos no Linux no muito seguro.
O nico caso que voc no pode utilizar --skip-external-locking se voc precisa de
vrios servidores MySQL (no clientes) acessando os mesmos dados, ou executar myisamchk
na tabela sem dizer ao servidor para descarregar e travar as tabelas primeiro
Voc pode continuar usando LOCK TABLES/UNLOCK TABLES mesmo se voc estiver utilizando --skip-external-locking.
current value: 5
current value: 1048540
current value: 32768
current value: 5
current value: 300
current value: 100
current value: 1000
current value: 0
current value: 28800
current value: 131072
current value: 1048540
current value: 0
current value: 10
current value: 1048576
current value: 4294967295
current value: 100
current value: 10
current value: 20
current value: 16777216
current value: 4294967295
current value: 1024
current value: 32
current value: 4294967295
current value: 8388608
current value: 16384
current value: 10
current value: 30
current value: 60
current value: 131072
current value: 262144
current value: 2
current value: 2097116
current value: 64
current value: 10
current value: 1048576
current value: 131072
current value: 28800
417
Otimizao do MySQL
Se existir um servidor mysqld em execuo, voc pode ver quais valores ele est usando atualmente para as variveis executando esta instruo:
mysql> SHOW VARIABLES;
Voc tambm pode ver algumas estatsticas e indicadores de status para um servidor em execuo
executando este comando:
mysql> SHOW STATUS;
Para encontrar uma descrio completa de todas as variveis na seo SHOW VARIABLES neste
manual. See Seco 4.6.8.4, SHOW VARIABLES.
Para informao sobre variveis de estado, veja Seco 4.6.8.3, SHOW STATUS.
Variveis de servidor e informao de status tambm pode ser obtido usando mysqladmin:
shell> mysqladmin variables
shell> mysqladmin extended-status
O MySQL utiliza algortmos que so muito escalveis, portanto, normalmente voc pode trabalhar
com pouca memria. Entretanto, se voc fornecer ao MySQL mais memria, obter um desempenho
melhor.
Quando estiver ajustando um servidor MySQL, as duas variveis mais importantes que devem ser
usadas so key_buffer_size e table_cache. Voc deve se sentir confiante que as duas estejam corretas antes de tentar alterar qualquer outra varivel.
Os seguintes exemplos indicam alguns valores tpicos de variveis para diferentes configuraes de
tempo de execuo. Os exemplos usam o script mysqld_safe e usam a sintaxe --name=value
para definir a varivel name com o valor value. Esta sintaxe est disponvel a partir do MySQL
4.0. Para verses mais antigas do MySQL, tome as seguintes diferenas nas contas:
Para nomes de variveis que finalizam em _size, voc pode precisar especific-las sem
_size. Por exemplo, o nome antigo para sort_buffer_size sort_buffer. O nome
antigo para read_buffer_size record_buffer. Para ver quais variveis a verso do
seu servidor reconhece, use mysqld --help.
Se voc possui pelo menos 256M de memria e vrias tabelas e deseja obter o melhor desempenho
com um nmero moderado de clientes, deve utilizar algo como:
shell> mysqld_safe --key_buffer_size=64M --table_cache=256 \
--sort_buffer_size=4M --read_buffer_size=1M &
Se possui apenas 128M de memria e apenas algumas poucas tabelas, mas ainda deseja realizar vrias ordenaes, voc pode utilizar:
shell> mysqld_safe --key_buffer_size=16M --sort_buffer_size=1M
Se voc possuir pouca memria e tiver muitas conexes, utilize algo como:
shell> mysqld_safe --key_buffer_size=512K --sort_buffer_size=100K \
--read_buffer_size=100K &
418
Otimizao do MySQL
ou mesmo isto:
shell> mysqld_safe --key_buffer_size=512K --sort_buffer_size=16K \
--table_cache=32 --read_buffer_size=8K -O net_buffer_length=1K &
Se voc estiver executando um GROUP BY ou ORDER BY em tabelas que so muito maiores que
sua memria disponvel voc deve aumentar o valor de record_rnd_buffer_size para acelerar a leitura de registros aps a operao de ordenao.
Quando voc tiver instalado o MySQL, o diretrio support-files ir conter alguns arquivos
exemplos
do
my.cnf,
my-huge.cnf,
my-large.cnf,
my-medium.cnf
e
my-small.cnf, voc pode us-los como base para otimizar seu sistema.
Se voc possui vrias conexes simultneas, ``problemas de trocas'' podem ocorrer a menos que o
mysqld tenha sido configurado para usar muito pouca memria para cada conexo. O mysqld
tem melhor performance se voc tiver memria suficiente para todas as conexes, claro.
Perceba que se voc especifica uma opo na linha de comando para o mysqld, ou
mysqld_safe ele permanece em efeito somente para aquela chamada do servidor. Para usar a opo toda vez que o servidor executa, coloque-o em um arquivo de opo.
Para ver os efeitos de uma alterao de parmetro, faa algo como:
shell> mysqld --key_buffer_size=32m --help
Tenha certeza que a opo --help seja a ltima do comando; de outra forma o efeito de qualquer
opes listadas depois na linha de comando no sero refletidas na sada.
419
Otimizao do MySQL
Se voc utiliza o pgcc e compila tudo com -O6, o servidor mysqld 1% mais rpido do que
com o gcc 2.95.2.
Se voc liga dinamicamente (sem -static), o resultado 13% mais lento no Linux. Note que
voc ainda pode utilizar uma biblioteca do MySQL dinamicamente ligada sua aplicao cliente. s o servidor que crtico para performance.
Se voc corta seu binrio mysqld com strip libexec/mysqld, o binrio gerado pode ficar at 4% mais rpido.
Para uma conexo de um cliente para um servidor em execuo na mesma mquina, se voc conecta utilizando TCP/IP em vez de utilizar um arquivo socket Unix, o rendimento 7.5% mais
lento no mesmo computador. (Se voc fizer conexo localhost, o MySQL ir, por padro,
utilizar sockets).
Para conexes TCP/IP de um cliente para um servidor, conectando a um servidor remoto em outra mquina ser 8-11% mais lento que conectando ao servidor local na mesma mquina, mesmo
para conexes Ethernet de 100M.
Quando executar o nosso teste de benchamrk usando conexes seguras (todos os dados crptografados com suporte interno SSL) ele se torna 55% mais lento.
Se voc compilar com --with-debug=full, a maioria das consultas ser 20% mais lentas.
Algumas consultas podem demorar muito mais tempo (por exemplo, os benchmarks do MySQL
demonstram 35% de perda). Se utilizar --with-debug, a queda ser de apenas 15%. Para
uma verso do mysqld compilada com --with-debug=full, voc pode desabilitar a verificao de memria em tempo de execuo iniciando-o com a opo --skip-safemalloc.
O resultado final neste caso deve estar prximo de quando compilado com --with-debug.
Em um Sun UltraSPARC-IIe, Forte 5.0 4% mais rpido em modo de 32 bits que em modo de
64 bits.
No Solaris 2.5.1, a MIT-pthreads 8-12% mais lenta do que as threads nativas do Solaris em um
nico processador. Com mais carga/CPUs a diferena deve aumentar.
Compilando no Linux-x86 com gcc sem frame pointers -fomit-frame-pointer ou fomit-frame-pointer -ffixed-ebp deixa o mysqld 1-4% mais rpido.
com
opo
-mcpu=v8
420
Otimizao do MySQL
Cada conexo utiliza algum espao especfico da thread: Uma de pilha (padro de 64K, varivel
thread_stack), um buffer de conexo (varivel net_buffer_lenght), e um buffer de
resultados (varivel net_buffer_lenght). Os buffers de conexes e resultados so aumentados dinamicamente para max_allowed_packet quando necessrio. Quando uma consulta
est sendo executada, uma cpia da string da consulta atual tambm alocada.
Cada requisio fazendo uma varredura sequencial em uma tabela aloca um buffer de leitura
(varivel read_buffer_size).
Ao ler registros na ordem ``randmica'' (por exemplo, depois de uma ordenao) um buffer de
leitura randmico alocado para evitar pesquisas em disco. (varivel read_rnd_buffer_size).
Todas as joins so feitas em um nico passo, e a maioria delas podem ser feitas mesmo sem usar
uma tabela temporria. A maioria das tabelas temporrias so tabelas baseadas em memria
(HEAP). Tabelas temporrias com uma grande extenso de registros (calculada como a soma do
tamanho de todas as colunas) ou que contenham colunas BLOB so armazenadas em disco.
Um problema nas verses do MySQL anteriores a 3.23.2 que se uma tabela HEAP excede o tamanho de tmp_table_size, voc recebe o erro The table nome_tabela is full.
A partir da verso 3.23.2, isto tratado alterando automaticamente a tabela em memria HEAP
para uma tabela baseada em disco MyISAM quando necessrio. Para contornar este problema,
voc pode aumentar o tamanho da tabela temporria configurando a opo tmp_table_size
do mysqld, ou configurando a opo do SQL SQL_BIG_TABLES no progrma cliente. See
Seco 5.5.6, Sintaxe de SET. Na verso 3.20 do MySQL, o nmero mximo da tabela temporria record_buffer*16; se voc estiver utilizando esta verso, voc ter que aumentar o
valor record_buffer. Voc tambm pode iniciar o mysqld com a opo --big-tables
para sempre armazenar as tabelas temporrias em disco. Entretanto isto afetar a velocidade de
vrias consultas complicadas.
A maioria das requisies que realizam ordenao alocam um bufer de ordenao e 0-2 arquivos
temporrios dependendo do tamanho do resultado. See Seco A.4.4, Onde o MySQL Armazena Arquivos Temporrios.
Cada arquivo de ndice aberto uma vez e o arquivo de dados aberto uma vez para cada thread
concorrente. Uma estrutura de tabela, estrutura de coluna para cada coluna e um buffer de tamanho 3 * n alocado para cada thread concorrente. (onde n o maior tamanho do registro, sem
levar em considerao colunas BLOB. Uma coluna BLOB utiliza de 5 a 8 bytes mais o tamanho
dos dados contidos na mesma. O manipulador de tabelas ISAM/MyISAM iro usar um registro
extra no buffer para uso interno.
Para cada tabela com colunas BLOB, um buffer aumentado dinamicamente para ler grandes valores BLOB. Se voc ler uma tabela, um buffer do tamanho do maior registro BLOB alocado.
Estruturas de manipulaco para todas tabelas em uso so salvos em um cache e gerenciado como
FIFO. Normalmente o cache possui 64 entradas. Se uma tabela foi usada por duas threads ao
mesmo tempo, o cache ter duas entredas para a tabela. See Seco 5.4.7, Como o MySQL
Abre e Fecha as Tabelas.
Otimizao do MySQL
Voc pode desabilitar a procura de nomes de mquinas no DNS iniciando o mysqld com a opo -skip-name-resolve. No entanto, neste caso voc s pode usar nmeros IP nas tabelas de privilgio do MySQL.
Se voc possuir um DNS muito lento e vrias mquinas, pode obter mais desempenho desligando a
procura de nomes de mquinas usando a opo --skip-name-resolve ou aumentando
HOST_CACHE_SIZE (valor padro: 128) e recompilar mysqld.
Voc pode desabilitar o cache de nomes de mquinas iniciando o servidor com a opo -skip-host-cache. Para limpar a cache do nome de mquinas, envie uma instru;o FLUSH
HOSTS ou execute o comando mysqladmin flush-hosts.
Se voc deseja disabilitar as conexes TCP/IP totalmente, inicie o mysqld com a opo -skip-networking.
Otimizao do MySQL
AUTOCOMMIT= 0 | 1
Se configurado com 1 todas alteraes em uma tabela ser feita de uma vez. Para iniciar uma
transao de vrios comandos, deve ser usada a instruo BEGIN. See Seco 6.7.1, Sintaxe de
START TRANSACTION, COMMIT e ROLLBACK. Se configurado com 0 deve ser usado COMMIT/ROLLBACK para aceitar/recusar aquela transao. See Seco 6.7.1, Sintaxe de START
TRANSACTION, COMMIT e ROLLBACK. Note que quando voc altera do modo no-AUTOCOMMIT para AUTOCOMMIT, o MySQL ir fazer um COMMIT automtico em quaisquer transaes abertas.
BIG_TABLES = 0 | 1
Se definido com 1, todas as tabelas temporrias so armazenadas no disco em vez de o ser na
423
Otimizao do MySQL
meria. Isto ser um pouco mais lento, mas voc no ter o erro The table tbl_name is
full para grandes operaes SELECT que exigem uma tabela temporria maior. O valor padro para uma nova conexo 0 (isto , usa tabelas temporrias em memria) Esta opo era
chamada SQL_BIG_TABLES. No MySQL 4.0 voc normalmente nunca deve precisar deste parmetro j que o MySQL converter automaticamente tabelas em memria para tabelas em disco
se isto for necessrio.
DATE_FORMAT = format_str
Determina como o servidor converte valores DATE para strings. Esta varivel est disponvel
como uma opo global, local ou de linha de comando. format_str pode ser especificado
convenientemente usando a funo GET_FORMAT(). Veja See Seco 6.3.4, Funes de Data
e Hora.
DATETIME_FORMAT = format_str
Determina como o servidor converte valores DATETIME para string. Esta varivel est disponvel como uma opo global, local ou de linha de comando. format_str pode ser especificada
convenientemente usando a funo GET_FORMAT(). Veja See Seco 6.3.4, Funes de Data
e Hora.
INSERT_ID = #
Configura o valor que ser usado pelo comando INSERT ou ALTER TABLE seguinte ao inserir
um valor AUTO_INCREMENT. Isto usado principalmente com o log de atualizaes.
LAST_INSERT_ID = #
Configura o valor a ser retornado de LAST_INSERT_ID(). Ele armazenado no log de atualizaes quando voc utiliza LAST_INSERT_ID() em um comando que atualiza uma tabela.
LOW_PRIORITY_UPDATES = 0 | 1
Se configurado com 1, todas instrues INSERT, UPDATE, DELETE e LOCK TABLE WRITE
iro esperar at que no existam SELECT ou LOCK TABLE READ pendentes na tabela afetada.
Esta opo era chamada SQL_LOW_PRIORITY_UPDATES.
Otimizao do MySQL
prpria senha!
Opo
Descrio
0 ou OFF
1 ou ON
Armazena todos os
SQL_NO_CACHE ....
2 ou DEMAND
resultados,
exceto
consultas
SELECT
SQL_AUTO_IS_NULL = 0 | 1
Se configurado com 1 (padro) o ltimo registro inserido em uma tabela com um regitro auto_incremnto pode ser encontrado com a seguinte construo: WHERE
auto_increment_column IS NULL. Isto usado por alguns programas ODBC como o Access.
SQL_BIG_SELECTS = 0 | 1
Se configurado com 0, o MySQL aborta as instrues SELECTs que provavelmente levam muito tempo (isto , instrues para as quais o otimizador estima que o nmero de registros examinados provavelmente ir exceder o valor de MAX_JOIN_SIZE. Isto til quando uma instruo WHERE no aconselhada for utilizado. O valor padro para uma nova conexo 1 (que permitir qualquer instruo SELECT).
Se voc definir MAX_JOIN_SIZE com
SQL_BIG_SELECTS ser definida com 0.
um
valor
diferente
de
DEFAULT,
SQL_BUFFER_RESULT = 0 | 1
SQL_BUFFER_RESULT fora para que o resultado das SELECT's seja colocado em tabelas
temporrias. Isto ir ajudar o MySQL a liberar mais cedos bloqueios de tabela e ajudaro em casos onde elas ocupam muito tempo para enviar o conjunto de resultados para o cliente.
SQL_SAFE_UPDATES = 0 | 1
Se configurado com 1, o MySQL ir aborar se tentarmos fazer um UPDATE ou DELETE sem
425
Otimizao do MySQL
utilizar uma chave ou LIMIT na clusula WHERE. Desta forma possvel capturar atualizaes
erradas ao criarmos comandos SQL manualmente.
SQL_LOG_OFF = 0 | 1
Se configurado com 1, nenhum registro ser feito no log padro para este cliente, se o cliente tiver o privilgio SUPER.
SQL_LOG_BIN = 0 | 1
Se configurada com 0, nenhum registro feito no log binrio para o cliente, se o cliente tiver o
privilgio SUPER.
SQL_LOG_UPDATE = 0 | 1
Se configurado com 0, nenhum registro ser feito no log de atualizaes para o cliente, se o cliente tiver o privilgio SUPPER. Esta varivel est obsoleta a partir da verso 5.0.
SQL_QUOTE_SHOW_CREATE = 0 | 1
Se configurado com 1, SHOW CREATE TABLE ir colocar os nomes de tabela e colunas entre
aspas. Est ligado por padro, para que replicao de tabelas com nomes de colunas estranhos
funcione. Seco 4.6.8.8, SHOW CREATE TABLE.
TIME_FORMAT = format_str
Determina como o servidor converte valores TIME para string. Esta varivel est disponvel como uma opo global, local ou de linha de comando. format_str pode ser especificada convenientemente usando a funo GET_FORMAT(). Veja See Seco 6.3.4, Funes de Data e
Hora.
Como mencionado acima, pesquisas em disco so o maior gargalo de desempenho. Estes problemas ficam cada vez mais aparentes quando os dados comeam a crescer tanto que efetivo armazenamento em cache se torna impossvel. Para grandes bancos de dados, onde voc acessa dados
mais ou menos aleatoriamente, voc pode ter certeza de que precisar de pelo menos uma busca
em disco para ler e vrias para gravar os dados. Para minimizar este problema, utilize discos
com menor tempo de pesquisa.
Aumente o nmero de eixo de discos disponveis (e ento reduza a sobrecarga da pesquisa) ligando arquivos simbolicamente em diferentes discos ou utilizando striping de discos.
Otimizao do MySQL
Striping
Striping significa que voc possui vrios discos e coloca o primeiro bloco no primeiro disco,
o segundo bloco no segundo disco, e o N-simo no (N mdulo nmero_de_discos) disco, e
assim por diante. Isto significa que se o seu tamanho de dados normais menos que o tamanho do bloco (ou perfeitamente alinhado) voc ir obter um desempenho muito melhor. Striping muito dependente do SO e do tamanho do bloco. Portanto mea a performance de sua
aplicao com diferentes tamanhos de blocos. See Seco 5.1.5, Utilizando seus Prprios
Benchmarks.
Perceba que a diferena de velocidade para striping muito dependente dos parmetros. Dependendo de como voc configura os parmetros do striping e do nmero de discos voc pode obter uma diferena de vrias ordens de grandeza. Note que voc deve escolher a otimizao randmica ou pelo acesso sequencial.
Para confiabilidade voc pode desejar utilizar RAID 0+1 (striping + espelhamento) mas neste
caso voc ir precisar de 2*N discos para armazenar N discos de dados. Isto provavelmente a
melhor opo se voc possuir dinheiro! Voc pode tambm, entretanto, ter que investir em algum software gerenciador de volumes para lidar com isto eficientemente.
Uma boa opo variar os nveis de RAID de acordo com a importncia do dado. a Por exemplo, ter dados com alguma importncia que podem ser regenerados em um armazenamento
RAID 0 enquanto os dados realemtente importantes como informaes de mquinas e logs em
um sistema RAID 0+1 ou RAID de N discos. RAID N pode ser um problema se voc tem vrias
escritas devido ao tempo para atualizar os bits de paridade.
No Linux, voc pode obter um desempenho muito melhor (cerca de 100% sobre carga pode ser
comum) utilizando hdparm para configurar sua interface de disco! O exemplo a seguir deve ser
muito til para o MySQL (e provavelmente vrias outras aplicaes):
hdparm -m 16 -d 1
Perceba que o desempenho e confiana ao utilizar o exemplo acima depende de seu hardware,
portanto ns sugerimos que voc teste bem seu sistema depois de utilizar hdparm! Por favor
consulte a pgina do manual (man) do hdparm para maiores informaes! Se o hdparm no
for usado corretamente, poder resultar em corrupo do sistema de arquivos, assim realize backups de tudo antes de experimentar!
Voc pode tambm configurar os parmetros para o sistema de arquivos que o banco de dados
usa:
Se voc no precisa saber quando os arquivos foram acessados pela ltima vez (o que realmente til em um servidor de banco de dados), voc pode montar o seu sistema de arquivos
com a opo -o noatime. Isto faz com que ele evite a atualizao do ltimo tempo de
acesso no inode e com isto tambm evita algumas buscas em disco.
Em vrios sistemas operacionais os discos podem ser montados com a opo 'async' para
configurar o sistema de arquivos a ser atualizado de modo assncrono. Se o seu computador
razoavelmente estvel, isto deve fornecer mais desempenho sem sacrificar a segurana. (Esta
opo ligada por padro no Linux.)
Otimizao do MySQL
No diretrio de dados voc sempre ter o arquivo de definies das tabelas e os arquivos de ndice e o arquivo de dados. O arquivo de dados e o arquivo de ndice podem ser movidos para qualquer lugar e substituidos no diretorio de dados pelos links simblicos. O arquivo de definio
428
Otimizao do MySQL
no pode.
Voc pode ligar simbolicamente o arquivo ndice e o arquivo de dados para diretrios diferentes,
independente do outro arquivo.
A ligao pode ser feita partir do sistema operacional (se o mysqld no estiver em execuo)
ou usando as opes DATA DIRECTORY ou INDEX DIRECTORY em CREATE TABLE. See
Seco 6.5.3, Sintaxe CREATE TABLE.
Quando voc remove uma tabela que est usando links simblicos, o link e o arquivo para o qual
ela aponta so apagados. Esta uma boa razo pela qual voc no deve executar mysqld como
root e no deve permitir que pessoas tenham acesso de escrita ao diretrios de bancos de dados
do MySQL.
Se voc renomear uma tabela com ALTER TABLE RENAME e no deseja alterar o banco de
dados, o link simblico para o diretrio de banco de dados ser renomeada corretamente.
Se voc utiliza ALTER TABLE RENAME para mover uma tabela para outro banco de dados,
ento a tabela ser movida para outro diretrio de banco de dados e os links simblicos antigos e
os arquivos para os quais eles apontam sero removidos.
Se voc no utiliza links simblicos, voc deve usar a opo --skip-symlink do mysqld
para garantir que ningum pode usar mysqld para apagar ou renomear um arquivo fora do diretrio de dados.
ALTER TABLE ignora todas as opes de tabela DATA DIRECTORY e INDEX DIRECTORY.
SHOW CREATE TABLE no relata se a tabela possui links simblicos antes do MySQL 4.0.15.
Isto tambm verdade para mysqldump que usa SHOW CREATE TABLE para gerar instrues CREATE TABLE.
O arquivo frm nunca deve ser um link simblico (como dito anteriormente, apenas os dados e
ndices podem ser links simblicos). Fazer isto (por exemplo para fazer sinnimos), produzir
resultados errados. Suponha que voc tenha um banco de dados db1 sob o diretrio de dados do
MySQL, uma tabela tbl1 neste banco de dados e voc faa um link simblico tbl2 no diretrio db1 que aponmta para tbl1:
shell>
shell>
shell>
shell>
cd
ln
ln
ln
/path/to/datadir/db1
-s tbl1.frm tbl2.frm
-s tbl1.MYD tbl2.MYD
-s tbl1.MYI tbl2.MYI
Agora se uma thread l db1.tbl1 e outra thread atualiza db1.tbl2, haver problemas: a cache de consultas ser enganada (ela acreditar que tbl1 no foi atualizado e retornar resultados desatualizados), o comando ALTER em tbl2 tambm ir falhar.
Otimizao do MySQL
de banco de dados em discos diferentes adicionando um link simblico para ele. (Isto parecido
com o a com que links simblicos funcionam no Unix, embora o procedimento para configurar o
link seja diferente).
No Windows, voc cria um link simblico para um banco de dados MySQL criando um arquivo que
contem o caminho para o diretrio de destino. Salve o arquivo no diretrio de dados usando o nome
de arquivo nome_bd.sym, onde nome_bd o nome do banco de dados.
Por exemplo, se o diretrio de dados do MySQL C:\mysql\data e voc precisa ter o banco de
dados
foo
localizado
em
D:\data\foo,
voc
deve
criar
o
arquivo
C:\mysql\data\foo.sym que contm o caminho D:\data\foo\. Depois disto, todas tabelas criadas no banco de dados foo sero criadas no D:\data\foo. O diretrio D:\data\foo
deve existir para ele funcionar. Note tambm que o link simblico no ser usado se um diretrio
com o nome do banco de dados existe no diretrio de dados MySQL. Isto significa que se voc j
tem um diretrio de banco de dados chamado foo no direorio de dados, voc deve mov-lo para
D:\data antes do link simblico ser efetivado. (Para evitar problemas, o servidor no deve estar
executando quando voc mover o diretrio do banco de dados.)
Note que devido a penalidade que voc tem na velocidade quando abre todas as tabelas, ns no habilitamos esta opo por padro, mesmo se voc compilar o MySQL com suporte a isto. Para habilitar links simblicos voc deve colocar no seu arquivo my.cnf ou my.ini a seguinte entrada:
[mysqld]
symbolic-links
No MySQL 4.0 --simbolic-links est habilitado por padro. Se voc no precisa us-lo voc
pode usar a opo skip-symbolic-linkd.
430
6.1.1.1. Strings
Uma string uma sequncia de caracteres, cercada por caracteres de aspas simples (''') ou duplas
('"') (Se voc utiliza o modo ANSI deve utilizar somente as aspas simples). Exemplos:
'uma string'
"outra string"
Em uma string, certas sequncias tem um significado especial. Cada uma destas sequncias comeam com uma barra invertida ('\'), conhecida como caracter de escape. O MySQL reconhece a seguinte sequncia de escape:
\0
Um caracter ASCII 0 (NUL).
\'
Um caracter de aspas simples (''').
\"
Um caracter de aspas duplas ('"').
\b
Um caracter de backspace.
\n
Um caracter de nova linha.
\r
Um caracter de retorno de carro.
431
\t
Um caracter de tabulao.
\z
ASCII(26) (Control-Z). Este caracter pode ser codificado para permitir que voc contorne o problema que o ASCII(26) possui comoEND-OF-FILE ou EOF (Fim do arquivo) no Windows.
(ASCII(26) ir causar problemas se voc tentar usar mysql banco_dados < nome_arquivo).
\\
O caracter de barra invertida ('\') character.
\%
Um caracter '%'. Ele pode ser usado para pesquisar por instncias literais de '%' em contextos onde '%' deve, de outra maneira, ser interpretado como um meta caracter. See Seco 6.3.2.1,
Funes de Comparao de Strings.
\_
Um caracter '_'. Ele usado para pesquisar por instncias literais de '_' em contextos onde '_'
deve, de outra maneira, ser intrerpretado como um meta caracter. See Seco 6.3.2.1, Funes
de Comparao de Strings.
Note que se voc utilizar '\%' ou '\_' em alguns contextos de strings, eles retornaro as strings '\%' e
'\_' e no '%' e '_'.
Estas so as vrias maneiras de incluir aspas com uma string:
Um ''' dentro de uma string com ''' pode ser escrita como ''''.
Um '"' dentro de uma string com '"' pode ser escrita como '""'.
Um ''' dentro de uma string com '"' no precisa de tratamento especial e no precisa ser duplicada ou utilizada com caracter de escape. Da mesma maneira, '"' dentro de uma string com ''' no
necessita de tratamento especial.
lines |
+--------------------+
Se voc deseja inserir dados binrios em uma coluna BLOB, os caracteres a seguir devem ser representados por sequncias de espace:
NUL
ASCII 0. Voc deve represent-lo como '\0' (uma barra invertida e um caractere '0').
\
ASCII 92, barra invertida. Representado como '\\'.
'
ASCII 39, aspas simples. Representado como '\''.
"
ASCII 34, aspas duplas. Representado como '\"'.
Se voc escreve cdigo C, voc pode utilizar a funo da API C mysql_escape_string() para caracteres de escape para a instruo INSERT. See Seco 12.1.2, Viso Geral das Funo da
API C. No Perl, pode ser utilizado o mtodo quote do pacote DBI para converter caracteres especiais para as sequncias de escape corretas. See Seco 12.5.2, A interface DBI.
Deve ser utilizada uma funo de escape em qualquer string que contm qualquer um dos caracteres
especiais listados acima!
Alternativamente, muitas APIs do MySQL fornecem algumas da capacidades de placeholder que
permitem que voc insira marcadores especiais em um string de consulta e ento ligar os valores dos
dados a eles quando voc executa a consulta. Neste caso, a API inclui, automaticamente, os caracteres especiais de escape nos valores para voc.
6.1.1.2. Nmeros
Inteiros so representados como uma sequncia de dgitos. Nmeros de ponto flutuante utilizam '.'
como um separador decimal. Ambos os tipos devem ser precedidos por '-' para indicar um valor negativo.
Exemplos de inteiros vlidos:
1221
0
-32
Exemplo de nmeros de ponto flutuante vlidos:
294.42
-32032.6809e+10
148.00
Um inteiro pode ser usado em um contexto de ponto flutuante; ele interpretado como o de ponto
flutuante equivalente.
A partir da verso 4.1.0, a constante TRUE avaliada com 1 e FALSE avaliada com 0.
O MySQL suporta valores hexadecimais. No contexto numrico estes atuam como um inteiro
(preciso de 64-bits). No contexto de strings, atuam como uma string binria onde cada par de dgitos hexadecimais convertido para um caracter:
mysql> SELECT x'4D7953514C';
-> MySQL
mysql> SELECT 0xa+0;
-> 10
mysql> SELECT 0x5061756c;
-> Paul
No MySQL 4.1 (e no MySQL 4.0 quando usado com a opa --new) o tipo padro de um valor hexadecimal uma string. Se voc deseja estar certo que a string tratado como um nmero, voc pode usar CAST( ... AS UNSIGNED) no valor hexadecimal.
A sintaxe x'stringhexa' (nova na verso 4.0) baseada no padro SQL e a sintaxe 0x baseada no ODBC. Strings hexadecimeis so frequentemente usadas pelo ODBC para suprir valores para
colunas BLOB. Voc pode converter uma string ou um nmero no formato hexadecimal com a funo HEX().
Caracteres permitidos
Banco de da- 64
dos
Tabela
64
Coluna
64
Todos os caracteres.
Alias
255
Todos os caracteres.
Note que em adio ao mostrado acima, voc no pode ter ASCII(0) ou ASCII(255) ou o caracter de
citao (aspas) em um identificador.
Se o identificador uma palavra restrita ou contm caracteres especiais voc deve sempre coloc-lo
entre ` ao us-lo:
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
434
Um nome pode consistir de caracteres alfanumricos do conjunto atual de caractres e tambm '_'
e '$'. O conjunto de caracteres padro o ISO-8859-1 Latin1; e pode ser alterado com a opo -default-character-set no mysqld. See Seco 4.7.1, O Conjunto de Caracteres Utilizado para Dados e Ordenao.
Um nome pode iniciar com qualquer caractere que legal no nome. Em particular, pode iniciar
com um nmero (isto difere de vrios outros sistemas de bancos de dados!). Entretanto um nome
no pode consistir somente de nmeros.
O caractere '.' no pode ser utilizado em nomes porque ele usado para extender o formato pelo
qual voc pode fazer referncias a colunas (veja abaixo).
recomendado que voc no utilize nomes como 1e, porque uma expresso como 1e+1 ambgua. Ela pode ser interpretada como a expresso 1e + 1 ou como o nmero 1e+1.
No MySQL voc pode se referir a uma coluna utilizando uma das formas seguintes:
Coluna de referncia
Significado
nome_campo
lo-
437
Para definir o valor de uma varivel SESSION, voc pode usar uma das seguintes sintaxes:
SET SESSION sort_buffer_size=valor;
SET @@session.sort_buffer_size=valor;
SET sort_buffer_size=valor;
Se voc no especificar GLOBAL ou SESSION ento ser usado SESSION. See Seco 5.5.6,
Sintaxe de SET.
LOCAL um sinnimo para SESSION.
Para recuperar o valor de uma varivel GLOBAL voc pode usar um dos seguintes comandos:
SELECT @@global.sort_buffer_size;
SHOW GLOBAL VARIABLES like 'sort_buffer_size';
Para retornar o valor de uma varivel SESSION voc pode usar um dos seguintes comandos:
SELECT @@session.sort_buffer_size;
SHOW SESSION VARIABLES like 'sort_buffer_size';
Quando voc retorna o valor de uma carivel com a sintaxe @@nome_varivel e voc no especificar GLOBAL ou SESSION ento o MySQL retornar o valor especfico da thread (SESSION),
se ele existir. Se no, o MySQL retornar o valor global.
A razo da exigncia de GLOBAL apenas para definir a varivel GLOBAL, mas no para recuper-la
e assegurar que no criemos problemas posteriormente ao introduzirmos um varivel especfica da
thread com o mesmo nome ou remover uma varivel especfica da thread. Neste caso, voc pode
acidentalmente alterar o estado do servidor como um todo, e no apenas em sua conexo.
A seguir apresentamos uma lista completa de todas as variveis que altera e recupera se voc pode
usar GLOBAL ou SESSION com elas.
Nome Varivel
Tipo Valor
Tipo
autocommit
bool
SESSION
big_tables
bool
SESSION
binlog_cache_size
num
GLOBAL
bulk_insert_buffer_size
num
GLOBAL | SESSION
concurrent_insert
bool
GLOBAL
connect_timeout
num
GLOBAL
convert_character_set
string
SESSION
delay_key_write
OFF | ON | ALL
GLOBAL
delayed_insert_limit
num
GLOBAL
delayed_insert_timeout
num
GLOBAL
delayed_queue_size
num
GLOBAL
error_count
num
SESSION
flush
bool
GLOBAL
flush_time
num
GLOBAL
foreign_key_checks
bool
SESSION
identity
num
SESSION
insert_id
bool
SESSION
interactive_timeout
num
GLOBAL | SESSION
join_buffer_size
num
GLOBAL | SESSION
438
key_buffer_size
num
GLOBAL
last_insert_id
bool
SESSION
local_infile
bool
GLOBAL
log_warnings
bool
GLOBAL
long_query_time
num
GLOBAL | SESSION
low_priority_updates
bool
GLOBAL | SESSION
max_allowed_packet
num
GLOBAL | SESSION
max_binlog_cache_size
num
GLOBAL
max_binlog_size
num
GLOBAL
max_connect_errors
num
GLOBAL
max_connections
num
GLOBAL
max_error_count
num
GLOBAL | SESSION
max_delayed_threads
num
GLOBAL
max_heap_table_size
num
GLOBAL | SESSION
max_join_size
num
GLOBAL | SESSION
max_relay_log_size
num
GLOBAL
max_sort_length
num
GLOBAL | SESSION
max_tmp_tables
num
GLOBAL
max_user_connections
num
GLOBAL
max_write_lock_count
num
GLOBAL
myisam_max_extra_sort_file_size
num
GLOBAL | SESSION
myisam_repair_threads
num
GLOBAL | SESSION
myisam_max_sort_file_size
num
GLOBAL | SESSION
myisam_sort_buffer_size
num
GLOBAL | SESSION
net_buffer_length
num
GLOBAL | SESSION
net_read_timeout
num
GLOBAL | SESSION
net_retry_count
num
GLOBAL | SESSION
net_write_timeout
num
GLOBAL | SESSION
query_cache_limit
num
GLOBAL
query_cache_size
num
GLOBAL
query_cache_type
enum
GLOBAL
read_buffer_size
num
GLOBAL | SESSION
read_rnd_buffer_size
num
GLOBAL | SESSION
rpl_recovery_rank
num
GLOBAL
safe_show_database
bool
GLOBAL
server_id
num
GLOBAL
slave_compressed_protocol
bool
GLOBAL
slave_net_timeout
num
GLOBAL
slow_launch_time
num
GLOBAL
sort_buffer_size
num
GLOBAL | SESSION
sql_auto_is_null
bool
SESSION
sql_big_selects
bool
SESSION
sql_big_tables
bool
SESSION
sql_buffer_result
bool
SESSION
sql_log_binlog
bool
SESSION
439
sql_log_off
bool
SESSION
sql_log_update
bool
SESSION
sql_low_priority_updates
bool
GLOBAL | SESSION
sql_max_join_size
num
GLOBAL | SESSION
sql_quote_show_create
bool
SESSION
sql_safe_updates
bool
SESSION
sql_select_limit
bool
SESSION
sql_slave_skip_counter
num
GLOBAL
sql_warnings
bool
SESSION
table_cache
num
GLOBAL
table_type
enum
GLOBAL | SESSION
thread_cache_size
num
GLOBAL
timestamp
bool
SESSION
tmp_table_size
enum
GLOBAL | SESSION
tx_isolation
enum
GLOBAL | SESSION
wait_timeout
num
GLOBAL | SESSION
warning_count
num
SESSION
unique_checks
bool
SESSION
Variveis marcadas com num podem ter um valor numrico. Variveis marcadas com bool podem
ser definidas com 0, 1, ON ou OFF. Variveis do tipo enum devem, normalmente, ser atribudas
com um dos valores disponveis para a varivel, mas podem tambm ser definidas com o nmero
correspondente ao valor enum. (O primeiro valor enum 0).
Aqui est uma descrio de algumas das variveis:
Variveis
Descrio
identity
sql_low_priority_updates
sql_max_join_size
version
Uma descrio da outra definio de tabela pode ser encontrada na seo de opes de inicializao,
na descrio de SHOW VARIABLES e na seo SET. See Seco 4.1.1, Opes de Linha de Comando do mysqld. See Seco 4.6.8.4, SHOW VARIABLES. See Seco 5.5.6, Sintaxe de
SET.
440
Note que o estilo de comentrio -- requer que pelo menos um espao aps o cdigo --!
Embora o servidor entenda as sintaxes de comentrios aqui descritas, existem algumas limites no
modo que o cliente mysql analisa o comentrio /* ... */:
Caracteres de aspas simples e aspas duplas so utilizados para indicar o incio de uma string com
aspas, mesmo dentro de um comentrio. Se as aspas no coincidirem com uma segunda aspas
dentro do comentrio, o analisador no percebe que o comentrio tem um fim. Se voc estiver
executando o mysql interativamente, voc pode perceber a confuso ocorrida por causa da mudana do prompt de mysql> para '> ou ">.
Um ponto e vrgula utilizado para indicar o fim de uma instruo SQL e qualquer coisa que venha aps ele indica o incio da prxima instruo.
Estas limitaes se aplicam tanto a quando se executa mysql interativamente quanto quando se coloca oos comandos em um arquivo e pede para que mysql leia as entradas deste arquivo com o comando mysql < some-file.
MySQL suporta o estilo de comentrio SQL-99 '--' apenas se o segundo trao for seguido de espao See Seco 1.8.4.7, '--' como Incio de Comentrio.
Word
Word
ADD
ALL
ALTER
ANALYZE
AND
AS
ASC
ASENSITIVE
BEFORE
BETWEEN
BIGINT
BINARY
BLOB
BOTH
BY
CALL
CASCADE
CASE
CHANGE
CHAR
CHARACTER
CHECK
COLLATE
COLUMN
COLUMNS
CONDITION
CONNECTION
CONSTRAINT
CONTINUE
CONVERT
CREATE
CROSS
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_USER
CURSOR
DATABASE
DATABASES
DAY_HOUR
DAY_MICROSECOND
DAY_MINUTE
441
DAY_SECOND
DEC
DECIMAL
DECLARE
DEFAULT
DELAYED
DELETE
DESC
DESCRIBE
DETERMINISTIC
DISTINCT
DISTINCTROW
DIV
DOUBLE
DROP
DUAL
EACH
ELSE
ELSEIF
ENCLOSED
ESCAPED
EXISTS
EXIT
EXPLAIN
FALSE
FETCH
FIELDS
FLOAT
FOR
FORCE
FOREIGN
FOUND
FROM
FULLTEXT
GOTO
GRANT
GROUP
HAVING
HIGH_PRIORITY
HOUR_MICROSECOND
HOUR_MINUTE
HOUR_SECOND
IF
IGNORE
IN
INDEX
INFILE
INNER
INOUT
INSENSITIVE
INSERT
INT
INTEGER
INTERVAL
INTO
IS
ITERATE
JOIN
KEY
KEYS
KILL
LEADING
LEAVE
LEFT
LIKE
LIMIT
LINES
LOAD
LOCALTIME
LOCALTIMESTAMP
LOCK
LONG
LONGBLOB
LONGTEXT
LOOP
LOW_PRIORITY
MATCH
MEDIUMBLOB
MEDIUMINT
MEDIUMTEXT
MIDDLEINT
MINUTE_MICROSECOND
MINUTE_SECOND
MOD
MODIFIES
NATURAL
NOT
NO_WRITE_TO_BINLOG
NULL
NUMERIC
ON
OPTIMIZE
OPTION
OPTIONALLY
OR
ORDER
OUT
OUTER
OUTFILE
PRECISION
PRIMARY
PRIVILEGES
PROCEDURE
PURGE
READ
READS
REAL
REFERENCES
REGEXP
RENAME
REPEAT
REPLACE
REQUIRE
RESTRICT
RETURN
REVOKE
RIGHT
RLIKE
SCHEMA
SCHEMAS
SECOND_MICROSECOND
SELECT
SENSITIVE
SEPARATOR
SET
SHOW
SMALLINT
SONAME
SPATIAL
SPECIFIC
SQL
SQLEXCEPTION
SQLSTATE
SQLWARNING
SQL_BIG_RESULT
442
SQL_CALC_FOUND_ROWS
SQL_SMALL_RESULT
SSL
STARTING
STRAIGHT_JOIN
TABLE
TABLES
TERMINATED
THEN
TINYBLOB
TINYINT
TINYTEXT
TO
TRAILING
TRIGGER
TRUE
UNDO
UNION
UNIQUE
UNLOCK
UNSIGNED
UPDATE
USAGE
USE
USING
UTC_DATE
UTC_TIME
UTC_TIMESTAMP
VALUES
VARBINARY
VARCHAR
VARCHARACTER
VARYING
WHEN
WHERE
WHILE
WITH
WRITE
XOR
YEAR_MONTH
ZEROFILL
Os simbolos seguintes (da tabela acima) no so permitidos pelo SQL-99 mas permitidos pelo
MySQL como nome de campos/tabelas. Isto ocorre porque alguns destes nomes so muito naturais e
vrios pessoas j o utilizaram.
ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP
M
Indica o tamanho mximo do display. O tamanho mximo oficial do display 255.
D
443
Aplica aos tipos de ponto flutuante e indica o nmero de digitos aps o ponto decimal. O maior
valor possvel 30, mas no pode ser maior que M-2.
Colchetes ('[' and ']') indicam partes de tipos especficos que so opicionais
Note que se voc especificar ZEROFILL para um campo MySQL automaticamente ir adicionar o
atributo UNSIGNED ao campo.
Aviso: voc deve estar ciente de que quando fizer uma subtrao entre valores inteiros, onde um deles do tipo UNSIGNED, o resultado ser sem sinal! See Seco 6.3.5, Funes de Converso.
Existem algumas coisas sobre campos BIGINT sobre as quias voc deve estar ciente:
Todas as operaes aritimticas so feitas usando valores BIGINT ou DOUBLE com sinal,
no devemos utilizar inteiros sem sinal maiores que 9223372036854775807 (63 bits)
exceto com funes ded bit! Se voc fizer isto, alguns dos ltimos digitos no resultado podem estar errados por causa de erros de arredondamento na converso de BIGINT para
444
DOUBLE.
O MySQL 4.0 pode tratar BIGINT nos seguintes casos:
Usar inteiros para armazenar grandes valores sem sinais em uma coluna BIGINT.
Em MIN(big_int_column) e MAX(big_int_column).
Voc pode armazenar valores inteiro exatos em um campo BIGINT aramzenando-os como
string, como ocorre nestes casos no haver nenhuma representao intermediaria dupla.
'-', '+', e '*' sero utilizados em clculos aritimticos BIGINT quando ambos os argumentos
forem valores do tipo INTEGER! Isto significa que se voc multilicar dois inteiros grandes
(ou obter resultados de funes que retornam inteiros) voc pode obter resultados inesperados quando o resultado for maior que 9223372036854775807.
DOUBLE PRECISION[(M,D)]
[UNSIGNED] [ZEROFILL]
[UNSIGNED]
[ZEROFILL]
REAL[(M,D)]
Um nmero de ponto flutuante no empacotado. Se comporta como um campo CHAR: ``no empacotado'' significa que o nmero armazenado como uma string, usando um caracter para cada
digito do valor. O ponto decimal e, para nmeros negativos, o sinal de menos ('-'), no so contados em M (mas reservado espao para isto). Se D for 0, os valores no tero ponto decimal
ou parte fracionria. A faixa mxima do valor DECIMAL a mesma do DOUBLE, mas a faixa
atual para um campo DECIMAL dado pode ser limitado pela escolha de M e D. Se UNSIGNED
especificado, valores negativos no so permitidos.
Se D no for definido ser considerado como 0. Se M no for definido considerado como 10.
Note que antes da verso 3.23 do MySQL o argumento M deve incluir o espao necessrio para o
sinal o ponto decimal.
DATE
Uma data. A faixa suportada entre '1000-01-01' e '9999-12-31'. MySQL mostra valores DATE no formato 'AAAA-MM-DD', mas permite a voc a atribuir valores a campos DATE
utilizando tanto strings quanto nmeros. See Seco 6.2.2.2, Os Tipos DATETIME, DATE e
TIMESTAMP.
DATETIME
Um combinao de hora e data. A faixa suportada entre '1000-01-01 00:00:00' e
'9999-12-31 23:59:59'. MySQL mostra valores DATETIME no formato 'AAAAMM-DD HH:MM:SS', mas permite a voc que atribuir valores a campos DATETIME utilizado
strings ou nmeros. See Seco 6.2.2.2, Os Tipos DATETIME, DATE e TIMESTAMP.
TIMESTAMP[(M)]
Um timestamp. A faixa entre '1970-01-01 00:00:00' e algum momento no ano 2037.
No MySQL 4.0 ou anteriores, os valores TIMESTAMP so exibidos nos formatos
YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, ou YYMMDD, dependendo se M 14 (ou
no definido), 12, 8 ou 6, mas permite a voc atribuir valores ao campo TIMESTAMP usando
strings ou nmeros.
Um campo TIMESTAMP util para gravar a data e a hora em uma operao de INSERT or UPDATE porque automaticamente definido a data e a hora da operao mais recente se voc prprio no especificar um valor. Voc tambm pode definir a data e a hora atual atribuindo ao
campo um valor NULL. See Seco 6.2.2, Tipos de Data e Hora.
Desde o MySQL 4.1, TIMESTAMP retornado com um string com o formato 'YYYY-MM-DD
HH:MM:SS'. Se voc deseja t-lo como um nmero voc deve adcionar +0 a coluna timestamp.
Teimestamp de tamanhos diferentes no so supoortados. Desde a verso 4.0.12, a opo -new pode ser usada para fazer o servidor se comportar como na verso 4.1.
Um TIMESTAMP sempre armazenado em 4 bytes. O argumento M s afeta como a coluna TIMESTAMP exibida.
Note que colunas do tipo TIMESTAMP(M) columns onde M 8 ou 14 so apresentadas como
nmeros enquanto as outras colunas TIMESTAMP(M) so strings. Isto apenas para assegurar
que podemos eliminar e restaurar com segurana tabelas com estes tipos! See Seco 6.2.2.2,
446
TIME
Uma hora. A faixa entre '-838:59:59' e '838:59:59'. MySQL mostra valores TIME
no formato 'HH:MM:SS', mas permite a voc atribuir valores para as colunas TIME usando
strings ou nmeros. See Seco 6.2.2.3, O Tipo TIME.
YEAR[(2|4)]
Um ano no formato de 2 ou 4 digitos (padro so 4 digitos). Os valores permitidos esto entre
1901 e 2155, 0000 no formato de 4 digitos, e 1970-2069 se voc estiver usando o formato de
2 digitos (70-69). MySQL mostra valores YEAR no formato YYYY, mas permie atribuir valores
aos campos do tipo YEAR usando strings ou nmeros. (O tipo YEAR novo na verso 3.22 do
MySL). See Seco 6.2.2.4, O Tipo YEAR.
VARCHAR uma simplificao para CHARACTER VARYING. See Seco 6.2.3.1, Os Tipos
CHAR e VARCHAR.
TINYBLOB , TINYTEXT
Um campo BLOB ou TEXT com tamanho mximo de 255 (2^8 - 1) caracteres. See Seco 6.5.3.1, Alterao de Especificaes de Colunas. See Seco 6.2.3.2, Os Tipos BLOB e
TEXT.
BLOB , TEXT
Um campo BLOB ou TEXT com tamanho mximo de 65535 (2^16 - 1) caracteres. See Seco 6.5.3.1, Alterao de Especificaes de Colunas. See Seco 6.2.3.2, Os Tipos BLOB e
TEXT.
MEDIUMBLOB , MEDIUMTEXT
Um campo BLOB ou TEXT com tamanho mximo de 16777215 (2^24 - 1) caracteres. See Seco 6.5.3.1, Alterao de Especificaes de Colunas. See Seco 6.2.3.2, Os Tipos BLOB e
TEXT.
LONGBLOB , LONGTEXT
Um campo BLOB ou TEXT com tamanho mximo de 4294967295 ou 4G (2^32 - 1) caracteres.
See Seco 6.5.3.1, Alterao de Especificaes de Colunas. See Seco 6.2.3.2, Os Tipos
BLOB e TEXT. At a verso 3.23 o protocolo cliente/servidor e tabelas MyISAM tinham um limite de 16M por pacote de transmisso/registro de tabela, a partir da verso 4.x o tamanho mximo permitido das colunas LONGTEXT ou LONGBLOB depende do tamanho mximo configurado
para o pacote no protocolo cliente/servidor e da memria disponvel. See Seco 6.2.3.2, Os Tipos BLOB e TEXT.
ENUM('valor1','valor2',...)
Uma enumerao. Um objeto string que s pode ter um valor, selecionado da lista de valores
'valor1', 'valor2', ..., NULL ou valor especial de erro "". Um ENUM pode ter um mximo de 65535 valores diferentes. See Seco 6.2.3.3, O Tipo ENUM .
SET('valor1','valor2',...)
Um conjunto. Um objeto string que pode ter zero ou mais valores, cada um deve ser selecionado
da lista de valores 'valor1', 'valor2', .... Um SET pode ter at 64 membros. See Seco 6.2.3.4, O Tipo SET.
448
salario DECIMAL(5,2)
Neste exemplo, 5 (preciso) representa o nmero de digitos decimais significantes que sero armazenados no valor, e 2 (escala) representa o nmero de dgitos que sero armazenados aps o
ponto decimal. Neste caso, no entanto, a faixa de valores que podem ser armazendos na coluna salario de -99.99 a 99.99. (MySQL pode, na verdade, armazenar numeros acima de 999.99
neste campo porque ele no precisa armazenar o sinal para nmeros positivos).
Em ANSI/ISO SQL92, a sintaxe DECIMAL(p) equivalente a DECIMAL(p,0). Da mesma forma, a sintaxe DECIMAL equivalente a DECIMAL(p,0), onde a implementao permite decidir o
valor de p. MySQL ainda no suporta nenhuma dessas duas formas variantes dos tipos de dados
DECIMAL/NUMERIC. Este, geralmente, no um problema srio, j que os principais benefcios
destes tipos derivam da habilidade de controlar preciso e escala explicitamente.
Valores DECIMAL e NUMERIC so armazenados como strings, ao invs de um nmero de pontoflutuante binrio, para preservar o preciso decimal destes valores. Um caracter usado para cada
digito, para o ponto decimal (se escala > 0), e para o sinal '-' (para nmeros negativos). Se escala 0, valores DECIMAL e NUMERIC no contm ponto decimal ou parte fracionria.
A faixa mxima dos valores DECIMAL e NUMERIC o mesmo do DOUBLE, mas a faixa real para
um campo DECIMAL or NUMERIC pode ser limitado pela preciso ou pela escala para uma
dada coluna. Quando atribudo a uma coluna um valor com mais digitos aps o ponto decimal do
que o permitido especificado na escala, o valor arredondado para aquela escala. Quando
atribuido um valor a uma coluna DECIMAL ou NUMERIC o qual excede a faixa determinada pelas
preciso e escala especificada (ou padro), MySQL armazena o valor correspondente ao final
daquela faixa.
Como uma extenso do padro ANSI/ISO SQL92, MySQL tambm suporta os tipos integrais TINYINT, MEDIUMINT, e BIGINT como listado nas tabelas abaixo. Outra extenso suportada pelo
MySQL especificar, opcionalmente, o tamanho do display de um valor inteiro entre parenteses seguindo o nome do tipo (por exemplo, INT(4)). Esta especificao opcional do tamanho usada
para preenchimento a esquerda do display de valores cujo tamanho menor que o especificado para
a coluna, mas no limita a faixa de valores que podem ser armazendos na coluna, nem o nmero de
dgitos que sero mostrados para valores que excederem o tamanho especificado na coluna. Quando
usados em conjunto com o atributo opcional de extenso ZEROFILL, o padro do preenchimento de
espaos a substituio por zeros. Por exemplo, para uma coluna declarada com INT(5) ZEROFILL, o valor 4 retornado como 00004. Note que se voc armazenar valores maiores que a largura do display em um coluna do tipo inteiro, voc pode ter problemas quando o MySQL gerar tabelas temporrias para algum join complicado, j que nestes casos o MySQL acredita que os dados cabem na largura original da coluna.
Todos os tipos inteiros podem ter um atributo opcional (no-padro) UNSIGNED. Valores sem sinal
podem ser usados quando voc permite apenas nmeros positivos em uma coluna e voc precisa de
uma faixa de valores um pouco maior para a coluna.
Desde o MySQL 4.0.2, tipos de ponto flutuante tambm podem ser sem sinal (UNSIGNED). Como
no tipos inteiros, este atributoprevine que valores negativos sejam armazenados na coluna. Ao contrrio dos tipos negativos, o valor mximo da faixa permitida permanece o mesmo.
O tipo FLOAT usado para representar tipos de dados numricos aproximados. O padro SQL-92
permite uma especificao opcional da preciso (mas no da faixa do expoente) em bits, aps a a palavra FLOAT e entre parenteses. A implementao MySQL tambm suporta esta especificao opcional de preciso. Quando FLOAT usada para uma tipo de coluna sem especificao de preciso,
MySQL utiliza quatro bytes para armazenar os valores. Uma sintaxe variante tambm suportada,
com dois numeros entre parenteses aps a palavra FLOAT. Com esta opo, o primeiro nmero continua a representar a quantidade de bytes necessria para armazenar o valor, e o segundo nmero especifica o nmero de dgitos a serem armazenados e mostrados aps o ponto decimal (como com
DECIMAL e NUMERIC). Quando pedido ao MySQL para armazenar um nmero em uma coluna
com mais digitos decimais aps o ponto decimal que o especificado para esta coluna, o valor arredondado eliminando os digitos extras quando armazenado.
Os tipos REAL e DOUBLE PRECISION no aceitam especificaes de preciso. Como uma exten449
so do padro SQL-92, o MySQL reconhece DOUBLE como um sinnimo para o tipo DOUBLE
PRECISION. Em constraste com a exigencia do padro de que a preciso do tipo REAL seja menor
que aquele usado pelo DOUBLE PRECISION, MySQL implementa ambos como valores de ponto
flutuante de 8 bits de dupla preciso (quando no estiver executando em ``modo ANSI''). Para uma
portabilidade mxima, cdigos que requerem armazenamento de valores de dados numricos aproximados usam FLOAT ou DOUBLE PRECISION sem especificao de preciso ou de numeros decimais.
Quando solicitado a armazenar um valor em uma coluna numrica que est fora da faixa permitida
pelo tipo da coluna, o MySQL ajusta o valor ao limite da faixa permitida mais apropriado e armazena este valor.
Por exemplo, a faixa de uma coluna INT de -2147483648 a 2147483647. Se voc tentar inserir -9999999999 em uma coluna INT, o valor ajustado para o limite mais baixo da faixa de
valores e -2147483648 armazenado. Da mesma forma, se voc tentar inserir 9999999999,
2147483647 ser armazenado.
Se o campo INT UNSIGNED, o tamanho da faixa do campo o mesmo mas o limite passa a ser de
0 a 4294967295. Se voc tentar armazenar -9999999999 e 9999999999, os valores armazenados na coluna sero 0 e 4294967296.
Converses que ocorrem devido a ajustes so relatados como ``avisos'' para ALTER TABLE, LOAD
DATA INFILE, UPDATE, e instrues INSERT multi-registros.
Tipo
Bytes
De
At
TINYINT
-128
127
SMALLINT
-32768
32767
MEDIUMINT
-8388608
8388607
INT
-2147483648
2147483647
BIGINT
-9223372036854775808
9223372036854775807
MySQL recupera valores para um tipo de data ou hora dado em um formato padro, mas ele tenta interpretar uma variedade de formatos para os valores fornecidos (por exemplo, quando voc
especifica um valor a ser atribuido ou comparado a um tipo de data ou hora). No entanto, s os
formatos descritos na seo seguinte so suportados. esperado que voc fornea valores permitidos. Resultados imprevisiveis podem ocorrer se voc usar outros formatos.
Embora o MySQL tente interpretar valores em diversos formatos, ele sempre espera que a parte
da data referente ao ano esteja mais a esquerda do valor. Datas devem ser dadas na ordem anoms-dia (por exemplo, '98-09-04'), ao invs das ordens mais usadas ms-dia-ano ou diams-ano (por exemplo: '09-04-98', '04-09-98').
450
Quando o MySQL encontra um valor para um tipo de data ou hora que est fora da faixa permitida ou ilegal neste tipo (veja o incio desta seo), ele converte o valor para ``zero''. (A exceo ocorre no campo TIME, onde o valor fora da faixa ajustado para o valor limite apropriado
na faixa de valores deste tipo.) A tabela abaixo mostra o formato do valor ``zero'' para cada tipo:
Tipo de Coluna
Valor ``Zero''
DATETIME
'0000-00-00 00:00:00'
DATE
'0000-00-00'
TIMESTAMP
TIME
'00:00:00'
YEAR
0000
Os valores ``zero'' so especiais, mas voc pode armazenar ou fazer referncia a eles explicitamente usando os valores mostrados na tabela. Voc tambm pode fazer into usando '0' ou 0, o
que mais fcil de escrever.
Valores ``zero'' para data ou hora usados em MyODBC so convertidos automaticamente para
NULL na verso 2.50.12 MyODBC e acima, porque ODBC no pode tratar tais valores.
Lembre-se de que essas regras fornecem apenas palpites razoveis sobre o que a sua data significa.
Se a heurstica usada pelo MySQL no produz o valor voc deve fornecer entre sem ambiguidade
contendo valores de ano de 4 digitos.
ORDER BY ir ordenar tipos YEAR/DATE/DATETIME de 2 digitos apropriadamente.
Note tembm que algumas funes com MIN() e MAX() iro converter TIMESTAMP/DATE para
um nmero. Isto significa que um timestamp com ano de 2 digitos no ir funcionar corretamente
com estas funes. A soluo neste caso converter o TIMESTAMP/DATE para um formato de ano
de 4 digitos ou usar algo como MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)).
disto.)
O tipo DATA usado quando se necessita apenas do valor da data, sem a parte da hora. MySQL recupera e mostra valores do tipo DATA no formato 'YYYY-MM-DD'. A faixa suportada de
'1000-01-01' at '9999-12-31'.
A coluna do tipo TIMESTAMP possui comportamento e propriedade variado, dependendo da verso
do MySQL e do modo SQL que o servidor est executando.
Comportamento do TIMESTAMP ao executar no modo MAXDB
Quando o MySQL est executando no modo SQPDB, o TIMESTAMP comporta como DATETIME.
Nenhuma atualizao automtica da coluna TIMESTAMP ocorre, como descrito no pargrafo seguinte. O MySQL pode ser executado no modo MAXDB a partir da verso 4.1.1. See Seco 4.1.1,
Opes de Linha de Comando do mysqld.
Comportamento do TIMESTAMP quando no est executando no modo MAXDB
O tipo de campo TIMESTAMP fornece um tipo que pode ser usado para, automaticamente, marcar
operaes INSERT or UPDATE com a data e hora atual. Se voc tiver multiplas colunas TIMESTAMP, s a primeira atualizada automaticamente.
Atualizaes automaticas da primeira coluna TIMESTAMP ocorrem sob qualquer uma das seguintes
condies:
Outras colunas TIMESTAMP, alm da primeira podem ser definidas com a data e hora atuais. Basta
defini-las com NULL ou NOW()
Voc pode definir colunas TIMESTAMP com um valor diferente da data e hora atuais colocando explicitamente o valor desejado. Isto verdade mesmo para a primeira coluna TIMESTAMP. Voc pode usar esta propriedade se, por exemplo, voc quiser que um TIMESTAMP tenha seu valor definido
como a data e hora atuais na criao de registros, mas no quer alter-los quando o registro for atualizado mais tarde:
Deixe o MySQL definir a coluna quando o registro criado. Isto ir inicializa-la com a data e
hora atuais.
Quando voc realizar subsequentes atualizaes em outras colunas do registro, defina explicitamente a coluna TIMESTAMP com o valor atual.
Por outro lado, voc pode achar que mais fcil usar uma coluan DATETIME que voc inicializa
com NOW() quando o registro for criado e deixa como est em atualizaes subsequentes.
Propriedades TIMESTAMP quando executando no modo MAXDB
Quando o MySQL est executando no modo MAXDB, TIMESTAMP idntico ao DATETIME. Ele
usa o mesmo formato para armazenar e mostrar valores, e ele tem a mesma faixa. O MySQL pode
ser executado no modo MAXDB a partir da verso 4.1.1. See Seco 4.1.1, Opes de Linha de Comando do mysqld.
Propriedades TIMESTAMP a partir do MySQL 4.1 quando no executado no modo MAXDB
452
No MySQL 4.1.0, colunas TIMESTAMP so armazenadas e mostradas no mesmo formato que colunas DATETIME. Isto tambm significa que ele no podem ser estreitados ou alargados nos modos
descritos no pargrafo seguinte. Em outras palavras, voc no pode usar TIMESTAMP(2), TIMESTAMP(4), etc. Em outros casos, as propriedades so as mesmas de verses MySQL anteriores.
Propriedades TIMESTAMP antes do MySQL 4.1
Valores TIMESTAMP podem ter valores do incio de 1970 at algum momento do ano 2037, com a
resoluo de um segundo. Valores so mostrados como nmeros
O formato no qual o MySQL recupera e mostra valores TIMESTAMP depende do tamanho do display, como ilustrado pela tabela que se segue: O formato `cheio' TIMESTAMP de 14 digitos, mas
colunas TIMESTAMP podem ser criadas com tamanho de display menores:
Tipo da Coluna
Formato do Display
TIMESTAMP(14)
YYYYMMDDHHMMSS
TIMESTAMP(12)
YYMMDDHHMMSS
TIMESTAMP(10)
YYMMDDHHMM
TIMESTAMP(8)
YYYYMMDD
TIMESTAMP(6)
YYMMDD
TIMESTAMP(4)
YYMM
TIMESTAMP(2)
YY
Todas as colunas TIMESTAMP tem o mesmo tamanho de armazenamento, independente do tamanho de display. Os tamanhos de display mais comuns so 6, 8, 12, e 14. Voc pode especificar um
tamanho de display arbitrario na hora da criao da tabela, mas valores de 0 ou maiores que 14 so
mudados para 14. Valores mpares de tamanho na faixa de 1 a 13 so mudados para o maior nmero
par mais prximo.
Nota: Na verso 4.1, TIMESTAMP retornado com uma string com o formato 'YYYY-MM-DD
HH:MM:SS', e timestamp de diferentes tamamnhos no so mais suportados.
Voc pode especificar calores DATETIME, DATE e TIMESTAMP usando qualquer conjunto de formatos comum:
Como uma string nos formatos 'YYYY-MM-DD' ou 'YY-MM-DD'. Uma sintaxe ``relaxada''
permitida aqui tambm. Por exemplo, '98-12-31', '98.12.31', '98/12/31', e
'98@12@31' so equivalentes.
Como uma string sem delimitadores nos formatos 'YYYYMMDD' ou 'YYMMDD', desde que a
string tenha sentido com data. Por exemplo, '19970523' e '970523' so interpretedas como '1997-05-23', mas '971332' ilegal (tem uma parte de ms sem sentido) e se torna
'0000-00-00'.
Como um nmero nos formatos YYYYMMDD ou YYMMDD, desde que o nmero faa sentido como data. Por exemplo, 19830905 e 830905 so interpretedos como '1983-09-05'.
Como o resultado de uma funo que retorne uma valor aceitavel em um contexto DATETIME,
DATE ou TIMESTAMP, tal como NOW() ou CURRENT_DATE.
Valores DATETIME, DATE, ou TIMESTAMP ilegais so convertidos para o valor ``zero'' do tipo
apropriado ('0000-00-00 00:00:00', '0000-00-00', ou 00000000000000).
Para valores especificados com strings que incluem delimitadores de data, no necessrio especificar dois digitos para valores de ms ou dia qua so menores que 10. '1979-6-9' o mesmo que
'1979-06-09'. Similarmente, para valores especificados como strings que incluem delimitadores de hora, no necessrio especificar dois digitos para valores de hora, minutos ou segundo que
so menores que 10. '1979-10-30 1:2:3' R o mesmo que '1979-10-30 01:02:03'.
Valores especificados como nmeros devem ter 6, 8, 12, ou 14 digitos. Se o nmero de 8 ou 14 digitos, ele assume estar no formato YYYYMMDD ou YYYYMMDDHHMMSS e que o ano dado pelos 4
primeiros dgitos. Se o de 6 ou 12 dgitos, ele assume estar no formato YYMMDD or
YYMMDDHHMMSS e que o ano dado pelos 2 primeiros digitos. Nmeros que no possua estes tamanho so interpretados como calores preenchidos com zero at o tamanho mais prximo.
Valores especificados como strings no delimitadas so interpretados usando o seu tamanho como
dado. Se a string possui 8 ou 14 caracteres, o ano assumido como os 4 primeiros caracteres. De outra forma o assume-se que o ano so os 2 primeiros caracteres. A string interpretadada esquerda
para direita para encontrar os valores do ano, ms, dia, hora, minute e segundo, para as partes da
string. Isto significa que voc no deve utilizar strings com menos de 6 caracteres. Por exemplo, se
voc especificar '9903', pensando em representar Maro de 1999, voc perceber que o MySQL
insere uma data ``zero'' em sua tabela. Isto ocorre porque os valores do ano e ms so 99 e 03, mas
a parte contendo o dia no existe (zero), ento o valor no uma data legal. No entanto, a partir do
MySQL 3.23, voc pode especificar explicitamente um valor de zero para representar dia ou ms
faltantes. Por exemplo, voc pode usar '990300' para inserir o valor '1999-03-00'.
Colunas TIMESTAMP armazena valores legais utilizando preciso total com a qual os valores foram
especificados, independente do tamanho do display. Isto tem diversas implicaes:
Se voc usa ALTER TABLE para aumentar uma coluna TIMESTAMP, informaes sero mostradas como se antes estivessem ``escondidas''.
De forma similar, reduzindo o tamanho de uma coluna TIMESTAMP no causa perda de informao, exceto no sentido de que menos informao aparece quando os valores so mostrados.
Embora os valores TIMESTAMP sejam armazenados com preciso total, a nica funo que opera diretamente com o valor armazenado UNIX_TIMESTAMP(). OUtras funes operam com
o formato do valor recuperado Isto significa que no se pode usar funes como HOUR() or
SECOND() a menos que a parte relevante do valor TIMESTAMP esteja includo no valor formatado. POr exemplo, a parte HH de uma coluna TIMESTAMP no mostrada a menos que o tamanho do display seja de pelo menos 10, logo tentar usar HOUR() em um valor TIMESTAMP menor produz um resultado sem significado.
Voc pode, algumas vezes, atribuir valores de um tipo de data para um objeto de um diferente tipo
de data. No entanto pode haver algumas alteraes de valores ou perda de informao
hora do valor resultante definido como '00:00:00', porque o vlaor DATE no contm informaes de hora.
Se voc atribuir um valor DATETIME ou TIMESTAMP para um objeto DATE, a parte da hora do
valor resultante deletado, pois o tipo DATE no armazena informaes de hora.
Lembre-se de que embora todos os valores DATETIME, DATE, e TIMESTAMP possam ser especificados usando o mesmo conjunto de formatos, os tipos no tem a mesa faixa de valores. Por
exemplo, valores TIMESTAMP no podem ser anteriores a 1970 ou posteriores a 2037. Isto
significia que datas como '1968-01-01', so permitidas como valores DATETIME ou DATE,
mas no so vlidas para valores TIMESTAMP e sero covertidas para 0 se atribuidas para tais
objetos.
A forma ``relaxada'' permitida em valores especificados com strings podem causar certas confuses. Por exemplo, um valor como '10:11:12' pode parecer com um valor de hora devido ao
limitador ':', mas se usado em um contexto de data ser interpretado como o ano
'2010-11-12'. O valor '10:45:15' ser convertido para '0000-00-00' pois '45'
no um valor de ms permitido.
O servidor MySQL funciona basicamente checando a validade da data: dias entre 00-31, ms
entre 00-12, anos entre 1000-9999. Qualquer data que no esteja nesta faixa ser revetida
para 0000-00-00. Por favor, note que isto ainda lhe permite armazenar datas invalidas tais como 2002-04-31. Isto permite a aplicaes web armazenar dados de um formulrio sem verificaes adicionais. Para assegurar que a data valida, faa a checagem em sua aplicao.
Como uma string no formato 'D HH:MM:SS.frao' . (Note que o MySQL no armazena
ainda fraes para a coluna time.) Pode-se tambm utilizar uma das seguintes sintaxes
``relaxadas'':
HH:MM:SS.frao, HH:MM:SS, HH:MM, D HH:MM:SS, D HH:MM, D HH ou SS. Aqui D
um dia entre 0-33.
Como uma string sem delimitadores no formato 'HHMMSS', desde que ela tenha sentido como
uma hora. Por exemplo, '101112' esntendido como '10:11:12', mas '109712' ilegal (a parte dos minutos no tem nenhum sentido) e se torna '00:00:00'.
Como um nmero no formato HHMMSS , desde que tenha sentido como uma hora. Por exemplo,
101112 entendido com '10:11:12'. Os formatos alternativos seguintes tambm so entendidos: SS, MMSS, HHMMSS e HHMMSS.frao. Note que o MySQL ainda no armazena fra455
es.
Como o resultado de uma funo que retorne um valor que aceitvel em um contexto do tipo
TIME, tal como CURRENT_TIME.
Para valores TIME especificados como uma string que incluem delimitadores de hora, no necessrio especificar dois dgitos para valores de hora, minutos ou segundos que sejam menores que 10.
'8:3:2' o mesmo que '08:03:02'.
Seja cuidadoso ao atribuir valores TIME ``pequenos'' para uma coluna TIME. Sem dois pontos, o
MySQL interprete valores assumindo que os digitos mais a direita representam segundos. (MySQL
interpreta valores TIME como tempo decorrido ao invs de hora do dia.) Por exemplo, voc poderia
pensar em '1112' e 1112 significam '11:12:00' (11 horas e 12 minutos), mas o MySQL o intepreta como '00:11:12' (onze minutos e 12 segundos). De forma similar, '12' e 12 so interpretados como '00:00:12'. Valores TIME com dois pontos, em contrapartida, so tratados como
hora do dia. Isto , '11:12' significar '11:12:00', no '00:11:12'.
Valores que so legais mas que esto fora da faixa permitidas so ajustados para o valor limita da
faixa mais apropriado. Por exemplo, '-850:00:00' e '850:00:00' so convertidos para '838:59:59' e '838:59:59', respectivmente.
Valores TIME ilegais so convertidos para '00:00:00'. Note que como '00:00:00' um valor TIME, no temos com dizer, a partir de um valor '00:00:00' armazenado na tabela, se o valor original armazenado foi especificado como '00:00:00' ou se foi ilegal.
Como uma string de dis dgitos na faixa '00' at '99'. Valores na faixa de '00' at '69' e
'70' at '99' so convetidas para valores YEAR na faixa de 2000 at 2069 e 1970 at
1999.
Como o resultado de uma funo que retorna um valor que aceitvel em um contexto do tipo
YEAR, tal como NOW().
Tam.maxmo
456
Bytes
TINYTEXT ou TINYBLOB
2^8-1
255
TEXT ou BLOB
2^16-1 (64K-1)
65535
MEDIUMTEXT ou MEDIUMBLOB
2^24-1 (16M-1)
16777215
LONGBLOB
2^32-1 (4G-1)
4294967295
CHAR(4)
Exigncia p/ armazenamento
''
'
'
4 bytes
''
1 byte
'ab'
'ab
'
4 bytes
'ab'
3 bytes
'abcd'
'abcd'
4 bytes
'abcd'
5 bytes
'abcdefgh'
'abcd'
4 bytes
'abcd'
5 bytes
Os valores recuperados para as colunas CHAR(4) e VARCHAR(4) sero os mesmos em cada caso,
j que espaos ectras so removidos das colunas CHAR quando recuperados.
Valores nas colunas CHAR e VARCHAR so ordenados e comparadaos no modo caso-insensitivo, a
menos que o atributo BINARY seja especificado quando a tabela for criada. O atributo BINARY significa que os valores das colunas so ordenados e comparados no modo caso-sensitivo de acordo
com a ordem ASCII da maquina onde o servidor MySQL est sesndo executado. BINARY no afeta
como as colunas so armazenadas e recuperadas.
A partir da verso 4.1.0, o tipo de coluna CHAR BYTE um alias para CHAR BINARY. Thite um
recurso para compatibilidade.
O atributo BINARY pegajoso. Isto significa que se uma coluna definida com BINARY usada na
expresso, toda a expresso comparada como um valor BINARY.
MySQL pode alterar sem aviso o tipo de uma coluna CHAR ou VARCHAR na hora de criar a tabela.
See Seco 6.5.3.1, Alterao de Especificaes de Colunas.
dos valores que eles podem guradar. See Seco 6.2.6, Exigncias de Armazenamento dos Tipos de
Coluna.
Os quatro tipos TEXT: TINYTEXT, TEXT, MEDIUMTEXT, e LONGTEXT correspondem aos quatro
tipos BLOB e tm o mesmo tamanho mximo e necessidade de tamanho para armazenamento. A
nica diferena entre os tipos BLOB e TEXT que ordenao e comparao so realizadas no modo
caso-sensitivo para valores BLOB e no modo caso-insensitivo para valores TEXT. Em outras palavras, um TEXT um BLOB no modo caso-insensitivo. Nenhum caso de converso feito durante
um o armazenamento ou recuperao.
Se voc atribuir um valor a uma coluna BLOB ou TEXT que exceda o tamanho mximo do tipo da
coluna, o valor truncado para servir ao campo.
Em muitos casos, podemos considerar um campo TEXT como um campo VARCHAR que pode ser
to grande quando desejamos. Da mesma forma podemos considerar um campo BLOB como um
campo VARCHAR BINARY. As diferenas so:
Voc pode ter indices em um campo BLOB e TEXT no MySQL Verso 3.23.2 e mais novas.
Verses antigas do MySQL no suportam isto.
No h remoo de espaos extras para campos BLOB e TEXT quando os valores so armazenados, como h em campos VARCHAR.
Se voc quiser utilizar GROUP BY ou ORDER BY em um campo BLOB ou TEXT, voc deve
converte-los em objetos de tamanho fixo. O modo padro de se fazer isto com a funo SUBSTRING. Por exemplo:
mysql> SELECT comentario FROM nome_tabela,SUBSTRING(comentario,20) AS substr
->
ORDER BY substr;
Se voc no fizer isto, s os primeiros max_sort_length bytes de uma coluna sero utilizados na ordenao. O valor padro de max_sort_length 1024; este calor pode ser alterado
utilizando-se a opo -O quando o servidor inicializado. Voc pode agrupar uma expresso
envolvendo valores BLOB ou TEXT especificando a posio da coluna ou utilizando apelidos
(alias):
mysql> SELECT id,SUBSTRING(col_blob,1,100) FROM nome_tabela GROUP BY 2;
mysql> SELECT id,SUBSTRING(col_blob,1,100) AS b FROM nome_tabela GROUP BY b;
O tamanho mximo de uma objeto BLOB ou TEXT determinado pelo seu tipo, mas o maior valor que voc pode, atualmente, transmitir entre o cliente e o servidor determinado pela quantidade de memria disponvel e o tamanho dos buffers de comunicao. Voc pode mudar o tamanho do buffer de mensagem (max_allowed_packet), mas voc deve faze-lo no servidor e
no cliente. See Seco 5.5.2, Parmetros de Sintonia do Servidor.
Note que cada valor BLOB ou TEXT representado internamente por um objeto alocado searadamente. Est uma diferena com todos os outros tipos de colunas, para o qual o armazenamento
alocado um por coluna quando a tabela aberta.
458
Se voc inserir um valor invlido em um ENUM (isto , uma string que no est presente na lista
de valores permitidos), a string vazia inserida no lugar como um valor especial de erro. Esta
string pode se diferenciar de um string vazia 'norma' pelo fato de que esta string tem uo valor numrico 0. Veremos mais sobre este assunto mais tarde.
Se um ENUM declarado NULL, NULL tambm um valor permitido para a coluna, e o valor padrao NULL. Se um ENUM decalarado NOT NULL, o valor padro o primeiro elemento da
lista de valores permitidos.
O valor de ndice de uma string vazia que indique erro 0. Isto significa que voc pode usar a
seguinte instruo SELECT para encontrar linhas nas quais valores ENUM invlidos forma atribuidos:
mysql> SELECT * FROM nome_tabela WHERE col_enum=0;
Por exemplo, uma coluna especificada como ENUM("um", "dois", "trs") pode ter quqlquer um dos valores mostrados aqui. O ndice de cada valor tambm mostrado:
Valor
Indice
NULL
NULL
""
"um"
"dois"
"trs"
nado o membro da enumerao com este ndice. (No entanto, este no ir funcionar com LOAD
DATA, o qual trata todas as entradas como strings.) No aconselhvel armazenar nmeros em uma
string ENUM pois pode tornar as coisas um pouco confusas.
Valores ENUM so armazenados de acordo com a ordem na qual os membros da enumerao foram
listados na especificao da coluna. (Em outras palavras, valores ENUM so ordenados de acordo
com o seus nmeros de ndice.) Por exemplo, "a" vem antes de "b" para ENUM("a", "b"),
mas "b" vem antes de "a" para ENUM("b", "a"). A string vazia vem antes de strings novazias, e valores NULL vem antes de todos os outros valores de enumerao. Para evitar resultados
inesperados, especifique a lista ENUM em ordem alfabtica. Voc tambm pode usar GROUP BY
CONCAT(col) para ter certeza de que as colunas esto ordenadas alfabeticamente e no pelo ndice numrico.
Se voc quiser obter todos os valores possveis para uma coluna ENUM, voc deve usar: SHOW COLUMNS FROM nome_tabela LIKE nome_coluna_enum e analizar a definio de ENUM na
segunda coluna.
Valor decimal
Valor binrio
0001
0010
0100
1000
Se voc atribuir um valor 9 a esta coluna, que 1001 em binrio, o primeiro e o quarto valores
membros do SET "a" e "d" so selecionados e o valor resultante "a,d".
Para um valor contendo mais que um elemento de SET, no importa em qual ordem os elementos
460
so listados quando foram inseridos seus valores. Tambm no importa quantas vezes um dado elemento e listado no valor. Quando o valor recuperado posteriormente, cada elemento aparecer uma
vez, listados de acordo com a ordem em que eles foram especificados na crio da tabela. Por exemplo, se uma coluna especificada como SET("a","b","c","d"), ento "a,d", "d,a" e
"d,a,a,d,d" iro todos aparecer como "a,d" quando recuperados.
Se voc define um valor que no suportado pela coluna SET, o valor ser ignorado.
Valores SET so ordenados numricamente. Valores NULL vm antes de valores SET no NULL.
Normalmente, voc realiza um SELECT em uma coluna SET usando o operador LIKE ou a funo
FIND_IN_SET():
mysql> SELECT * FROM nome_tabela WHERE col_set LIKE '%valor%';
mysql> SELECT * FROM nome_tabela WHERE FIND_IN_SET('valor',col_set)>0;
Mas o seguinte tambm funciona:
mysql> SELECT * FROM nome_tabela 2 WHERE col_set = 'val1,val2';
mysql> SELECT * FROM nome_tabela 3 WHERE col_set & 1;
A primeira desta instrues procura por uma correpondencia exata. A segunda por valores contendo
o primeiro membro.
Se voc quer obter todos os valores possveis para uma coluna SET, voc deve usar: SHOW COLUMNS FROM nome_tabela LIKE nome_coluna_set e analizar a definio do SET na
segunda coluna.
Tipo MySQL
BINARY(NUM)
CHAR(NUM) BINARY
CHAR VARYING(NUM)
VARCHAR(NUM)
FLOAT4
FLOAT
FLOAT8
DOUBLE
INT1
TINYINT
INT2
SMALLINT
INT3
MEDIUMINT
461
INT4
INT
INT8
BIGINT
LONG VARBINARY
MEDIUMBLOB
LONG VARCHAR
MEDIUMTEXT
MIDDLEINT
MEDIUMINT
VARBINARY(NUM)
VARCHAR(NUM) BINARY
O mapeamento do tipo de campo ocorre na criao da tabela. Se voc cria uma tabela com tipos usador por outras empresas e ento executa uma instruo DESCRIBE nome_tabela, MySQL relaciona a estrutura de tabela utilizando os tipos equivalentes do MySQL.
Tamanho exigido
TINYINT
1 byte
SMALLINT
2 bytes
MEDIUMINT
3 bytes
INT
4 bytes
INTEGER
4 bytes
BIGINT
8 bytes
FLOAT(X)
FLOAT
4 bytes
DOUBLE
8 bytes
DOUBLE PRECISION
8 bytes
REAL
8 bytes
DECIMAL(M,D)
NUMERIC(M,D)
Tamanho exigido
DATE
3 bytes
DATETIME
8 bytes
TIMESTAMP
4 bytes
TIME
3 bytes
YEAR
1 byte
Tamanho exigido
CHAR(M)
462
VARCHAR(M)
TINYBLOB, TINYTEXT
BLOB, TEXT
MEDIUMBLOB, MEDIUMTEXT
LONGBLOB, LONGTEXT
Se uma dos argumentos uma coluna TIMESTAMP ou DATETIME e o outro argumento uma
constante, a constante convertida para um timestamp antes da comparao ser realizada. Isto
ocorre para ser mais amigvel ao ODBC.
Em todos os outros casos, os argumentos so coparados como nmeros de ponto flutuante (real).
Por padro, comparaes de string so feita de modo independente do caso, usando o conjunto de
caracteres atual (ISO-8859-1 Latin1 por padro, o qual tambm funciona de forma excelente para o
Ingls).
Se voc est comparando strings em caso insensitivo com qualquer dos operadores padres (=,
<>..., mas no o LIKE) espaos em branco no fim da string (espaos, tabs e quebra de linha) sero
ignorados.
464
1 > '6x';
7 > '6x';
0 > 'x6';
0 = 'x6';
Note que quando voc est comparando uma coluna string com um nmero, o MySQL no pode
usar ndices para encontrar o valor rapidamente:
SELECT * FROM table_name WHERE string_key=1
A razo para isto que existem muitas strings diferentes que podem retornar o valor 1: "1", " 1",
"1a" ...
=
Igual:
mysql> SELECT
-> 0
mysql> SELECT
-> 1
mysql> SELECT
-> 1
mysql> SELECT
-> 0
mysql> SELECT
-> 1
1 = 0;
'0' = 0;
'0.0' = 0;
'0.01' = 0;
'.01' = 0.01;
<> , !=
Diferente:
mysql> SELECT '.01' <> '0.01';
-> 1
mysql> SELECT .01 <> '0.01';
-> 0
mysql> SELECT 'zapp' <> 'zappp';
-> 1
<=
Menor que ou igual:
mysql> SELECT 0.1 <= 2;
-> 1
<
465
Menor que:
mysql> SELECT 2 < 2;
-> 0
>=
Maior que ou igual:
mysql> SELECT 2 >= 2;
-> 1
>
Maior que:
mysql> SELECT 2 > 2;
-> 0
<=>
Igual para NULL:
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1 1 0
Para colunas DATE e DATETIME NOT NULL voc pode encontrar a data especial
0000-00-00 utilizando:
SELECT * FROM nome_tabela WHERE coluna_data IS NULL
Isto necessrio para que algums aplicaes ODBC funcionem (j que ODBC no tem suporte a data 0000-00-00)
466
1 BETWEEN 2 AND 3;
'b' BETWEEN 'a' AND 'c';
2 BETWEEN 2 AND '3';
2 BETWEEN 2 AND 'x-3';
expr IN (valor,...)
Retorna 1 se expr qualquer dos valores na lista IN, seno retorna 0. Se todos os valores so
constantes, ento os valores so avaliados de acordo com o tipo da expr e ordenado. A busca
do item ento feita usando pesquisa binria. Isto significa que IN muito rpido se os valores
da lista IN forem todos contantes. Se expr uma expresso strig em caso-sensitivo, a comparao realizadas no modo caso-sensitvo:
mysql> SELECT 2 IN (0,3,5,'wefwf');
-> 0
mysql> SELECT 'wefwf' IN (0,3,5,'wefwf');
-> 1
O nmero de valores na lista IN limitada apenas pelo valor max_allowed_packet.
Na verso 4.1 (para se adequar ao padro SQL-99), IN returna NULL no apeans se a expresso
a sua esquerda NULL, mas tambm se nenhuma correspondncia encontrada na lista e uma
de suas expresses NULL.
A partir do MySQL verso 4.1, uma clusula IN() tambm pode conter uma subquery. See Seco 6.4.2.3, Subqueries with ANY, IN, and SOME.
ISNULL(expr)
Se expr NULL, ISNULL() retorna 1, seno retorna 0:
mysql> SELECT ISNULL(1+1);
-> 0
mysql> SELECT ISNULL(1/0);
-> 1
467
COALESCE(lista)
Retorna o primeiro elemento no NULL na lista:
mysql> SELECT COALESCE(NULL,1);
-> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
-> NULL
INTERVAL(N,N1,N2,N3,...)
Retorna 0 se N < N1, 1 se N < N2 e assim por diante ou -1 se N NULL. Todos os argumentos
so tratados como inteiros. Isto exige que N1 < N2 < N3 < ... < Nn para que esta funo funcione corretamente. Isto ocorre devido a utilizao pesquisa binria (muito rpida):
mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
-> 3
mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);
-> 2
mysql> SELECT INTERVAL(22, 23, 30, 44, 200);
-> 0
NOT , !
NOT logico. Avalia como 1 se o operador 0, como 0 se o operador diferente de zero, e NOT
NULL retorna NULL.
mysql> SELECT NOT 10;
-> 0
mysql> SELECT NOT 0;
-> 1
mysql> SELECT NOT NULL;
-> NULL
mysql> SELECT ! (1+1);
-> 0
mysql> SELECT ! 1+1;
-> 1
O ltimo exemplo produz 1 pois a a expresso avaliada como (!1)+1.
AND , &&
AND lgico. Avalia como 1 se todos os operandos so diferentes de zero e no NULL, como 0
se um ou mais operandos so 0, seno retorna NULL.
mysql> SELECT 1 && 1;
-> 1
468
0;
NULL;
NULL;
&& 0;
Por favor note que as verses do MySQL anteriores a verso 4.0.5 param a avaliao quando um
valor NULL encontrado, e no continua o processo buscando por possveis 0s. Isto significa
que nessa verso, SELECT (NULL AND 0) retorna NULL ao invs de 0. Na verso 4.0.5 o
cdigo tem sido re-elaborado para que o resultado sempre seja como prescrito pelo padro SQL
utilizando a otimizao sempre que possvel.
OR , ||
OR lgico. Avalia como 1 se algum operando diferente de zero e como NULL se algum operando for NULL, seno 0 retornado.
mysql> SELECT 1
-> 1
mysql> SELECT 1
-> 1
mysql> SELECT 0
-> 0
mysql> SELECT 0
-> NULL
mysql> SELECT 1
-> 1
|| 1;
|| 0;
|| 0;
|| NULL;
|| NULL;
XOR
XOR lgico. Retorna NULL se o operando tambm NULL. Para operandos no NULL, avalia
como 1 se um nmero mpar de operandos diferente de zero, seno 0 retornado.
mysql> SELECT 1
-> 0
mysql> SELECT 1
-> 1
mysql> SELECT 1
-> NULL
mysql> SELECT 1
-> 1
XOR 1;
XOR 0;
XOR NULL;
XOR 1 XOR 1;
IF(expr1,expr2,expr3)
Se expr1 VERDADEIRA (expr1 <> 0 e expr1 <> NULL) ento IF() retorna
expr2, seno ela retorna expr3. IF() returna um valor numrico ou string, dependendo do
contexto no qual usado.
mysql> SELECT IF(1>2,2,3);
-> 3
mysql> SELECT IF(1<2,'sim','no');
-> 'sim'
mysql> SELECT IF(STRCMP('teste','teste1'),'no','sim');
-> 'no'
Se expr2 ou expr3 explicitamente NULL ento o tipo resultante da funo IF() o tipo da
coluna no NULL. (Este comportamento novo na verso 4.0.3 do MySQL).
expr1 avaliada como um valor inteiro, o qual significa que se voc est testando valores de
ponto flutuante ou strings, voc de faz-lo usando um operando de comparao:
mysql> SELECT IF(0.1,1,0);
-> 0
mysql> SELECT IF(0.1<>0,1,0);
-> 1
No primeiro caso acima, IF(0.1) retorna 0 porque 0.1 convertido para um valor inteiro, resultando um um teste IF(0). Isto pode no ser o que voc esperava. No segundo caso, a comparao testa se o valor de ponto flutuante no zero. O resultado da comparao converte o termo em um interiro.
O tipo de retorno padro de IF() (o que pode importar quando ele armazenado em uma tabela
temporria) calculado na verso 3.23 do MySQL de seguinte forma:
Expresso
Valor de retorno
string
ponto flutuante
inteiro
Se expr2 e expr3 so strings, ento o resultado caso-insensitivo se ambas strings so caso insensitivo. (A patir da verso 3.23.51)
IFNULL(expr1,expr2)
470
Se expr1 no NULL, IFNULL() retorna expr1, seno retorna expr2. IFNULL() retorna
um valor numrico ou string, dependendo do contexto no qual usado:
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
mysql> SELECT IFNULL(1/0,10);
-> 10
mysql> SELECT IFNULL(1/0,'yes');
-> 'yes'
Na verso 4.0.6 e acima o valor resultante padro de IFNULL(expr1,expr2) o mais geral
das duas expresses, na seguinte ordem: STRING, REAL ou INTEGER. A diferena das verses
anteriores mais notvel quando se cria uma tabela baseada em uma expresso ou o MySQL
tem que armazenar internamente um valor de IFNULL() em uma tabela temporria.
CREATE TABLE foo SELECT IFNULL(1,"teste") as teste;
Na verso 4.0.6 do MySQL o tipo da coluna 'teste' CHAR(4) enquanto nas verses anteriores
ela seria do tipo BIGINT.
NULLIF(expr1,expr2)
Se expr1 = expr2 for verdadeiro, retornado NULL seno retornado expr1. Isto o
mesmo que CASE WHEN x = y THEN NULL ELSE x END:
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
Note que expr1 avaliada duas vezes no MySQL se os argumentos no so iguais.
ASCII(str)
Retorna o valor do cdigo ASCII do caracter mais a esquerda da string str. Retorna 0 se str
uma string vazia. Retorna NULL se str NULL:
mysql> SELECT ASCII('2');
-> 50
mysql> SELECT ASCII(2);
-> 50
mysql> SELECT ASCII('dx');
-> 100
Veja tambm a funo ORD().
471
BIN(N)
Retorna um representao string do valor binrio de N, onde N um nmero muito grande (BIGINT). Isto equivalente a CONV(N,10,2). Retorna NULL se N NULL:
mysql> SELECT BIN(12);
-> '1100'
BIT_LENGTH(str)
Retorna o tamanho da string str em bits:
mysql> SELECT BIT_LENGTH('text');
-> 32
CHAR(N,...)
CHAR() interpretia os argumentos como inteiros e retorna uma string com caracteres dados pelo
valor do cdigo ASCII referentes a estes inteiros. Valores NULL so desconsiderados:
mysql> SELECT CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> SELECT CHAR(77,77.3,'77.3');
-> 'MMM'
CONCAT(str1,str2,...)
Retorna a string resultante da concatenao dos argumentos. Retorna NULL se qualquer dos argumentos for NULL. Pode ter mais de 2 argumentos. Um argumento numrico convertido para
sua forma string equivalente:
mysql> SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL');
-> NULL
mysql> SELECT CONCAT(14.3);
-> '14.3'
NULL.
CONV(N,da_base,para_base)
Converte nmeros entre diferentes bases. Retorna uma representao string do nmero N, convertido da base da_base para base para_base. Retorna NULL se qualquer argumento
NULL. O argumento N interpretado como um inteiro, mas pode ser especificado como um inteiro ou uma string. A base mnima 2 e a mxima 36. Se para_base um nmero negativo, N considerado como um nmero com sinal. Caso contrrio, N tratado como um nmero
sem sinal. CONV funciona com preciso de 64-bit:
mysql> SELECT CONV("a",16,2);
-> '1010'
mysql> SELECT CONV("6E",18,8);
-> '172'
mysql> SELECT CONV(-17,10,-18);
-> '-H'
mysql> SELECT CONV(10+"10"+'10'+0xa,10,10);
-> '40'
ELT(N,str1,str2,str3,...)
Retorna str1 se N = 1, str2 se N = 2, e assim por diante. Retorna NULL se N menor que 1
ou maior que o nmero de argumentos. ELT() o complemento de FIELD():
mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
-> 'ej'
mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
-> 'foo'
EXPORT_SET(bits,on,off,[separador,[numero_de_bits]])
Retorna uma string onde para todo bit 1 em 'bit', voc obtm uma string 'on' e para cada bit 0 voc obtem uma string 'off', Cada string separada com 'separador' (padro,',') e s 'nmero_de_bits' (padro 64) de 'bits' usado:
mysql> SELECT EXPORT_SET(5,'S','N',',',4)
-> S,N,S,N
FIELD(str,str1,str2,str3,...)
Retorna o ndice de str na lista str1, str2, str3, .... Retorns 0 se str no for encontrada. FIELD() o complemento de ELT():
mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 2
mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 0
FIND_IN_SET(str,strlista)
Retorna um valor 1 para N se a string str est na lista strlist contendo N substrings. A lista
de string composta de substrings separadas pelo caracter ','. Se o primeiro argumento uma
473
string constante e o segundo uma coluna do tipo SET, a funo FIND_IN_SET() otimizada para usar aritmtica binria! Retorna 0 se str no est na strlista ou se strlista
uma string vazia. Retorna NULL se os argumentos so NULL. Esta funo no ir funcionar adequadamente se o primeiro argumento contm uma vrgula (','):
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
HEX(N_ou_S)
Se N_OU_S um nmero, retornado um representao string do valor hexadecimal de N, onde
N um nmero muito grande (BIGINT). Isto equivalente a CONV(N,10,16).
Se N_OU_S uma string, retornado uma string hexadecimal de N_OU_S onde cada caracter
de N_OU_S convertido para 2 dgitos hexadecimais. Isto o inverso da string 0xff.
mysql> SELECT HEX(255);
-> 'FF'
mysql> SELECT HEX("abc");
-> 616263
mysql> SELECT 0x616263;
-> "abc"
INSTR(str,substr)
Retorna a posio da primeira ocorrncia da substring substr na string str. o mesmo que
as o LOCATE() com dois argumentos, exceto pelo fato de que os argumentos esto tracados:
mysql> SELECT INSTR('foobarbar', 'bar');
-> 4
mysql> SELECT INSTR('xbar', 'foobar');
-> 0
Esta funo multi-byte. Na verso 3.23 do MySQL esta funo caso sensitivo, enquanto na
verso 4.0 ela s caso-sensitivo se os argumentos so uma string binria.
INSERT(str,pos,tam,novastr)
Retorna a string str, com a a substring comeando na posio pos e contendo tam caracteres
substituida pela string novastr:
mysql> SELECT INSERT('Quadratico', 3, 4, 'Onde');
-> 'QuOndetico'
Esta funo multi-byte.
LCASE(str) , LOWER(str)
Retorna a string str com todos caracteres alterados para letra minsculas de acordo com o conjunto de caracteres atual (o padro ISO-8859-1 Latin1):
mysql> SELECT LCASE('MYSQL');
-> 'mysql'
474
LEFT(str,tam)
Retorna os tam caracteres mais a esquerda da string str:
mysql> SELECT LEFT('foobarbar', 5);
-> 'fooba'
Esta funo multi-byte.
LOAD_FILE(nome_arquivo)
Lb o arquivo e retona o conteudo do arquivo como uma string. O arquivo beve estar no servidor, voc deve especificar o caminho completo para o arquivo, e voc deve ter o privilgio FILE. O arquivo deve ser legvel para todos e ser menor que o especificado em
max_allowed_packet.
Se o arquivo no existe ou no pode ser lido devido a alguma das razes acima, a funo retornar NULL:
mysql> UPDATE nome_tabela
SET coluna_blob=LOAD_FILE("/tmp/picture")
WHERE id=1;
Se voc no est usando a verso 3.23 MySQL, voc tem que fazer a leitura do arquivo dentro
do seu aplicativo e criar uma instruo INSERT para atualizar o banco de dados com a informao do arquivo. Um modo de se fazer isto, se voc estiver usando a biblioteca MySQL++, pode
ser encontrada em http://www.mysql.com/documentation/mysql++/mysql++-examples.html.
LOCATE(substr,str) , LOCATE(substr,str,pos)
A primeira sintaxe retorna a posio da primeira ocorrncia da substring substr na string str.
A segunda sintaxe retorna a posio da primeira ocorrncia da substring substr na string str,
iniciando na posio pos. Retornam 0 se substr no est em str:
mysql> SELECT LOCATE('bar', 'foobarbar');
-> 4
mysql> SELECT LOCATE('xbar', 'foobar');
-> 0
mysql> SELECT LPAD('hi',4,'??');
-> '??hi'
LTRIM(str)
Retorna a string str com caracteres de espaos extras iniciais removidos:
mysql> SELECT LTRIM('
-> 'barbar'
barbar');
475
MAKE_SET(bits,str1,str2,...)
Retorna um conjunto (uma string contendo substrings separadas por ',') contendo as strings que
tem o bit correspondente em bits definido . str1 corresponde ao bit 1, str2 ao bit 2, etc.
Strings NULL em str1, str2, ... no so adicionadas ao resultado:
mysql> SELECT MAKE_SET(1,'a','b','c');
-> 'a'
mysql> SELECT MAKE_SET(1 | 4,'Oi','meu','mundo');
-> 'Oi,mundo'
mysql> SELECT MAKE_SET(0,'a','b','c');
-> ''
OCT(N)
Retorna uma representao string do valor octal de N, onde N um nmero muito grande. Isto
equivalente a CONV(N,10,8). Retorna NULL se N NULL:
mysql> SELECT OCT(12);
-> '14'
ORD(str)
Se o caracter mais a esquerda da string str um caracter multi-byte, retornado o cdigo para
este caracter, calculado a partir dos valores do cdigo ASCII dos seus caracteres contituintes utizando-se a seguinte frmula: ((primeiro byte do cdigo ASCII)*256+(segundo
byte do cdigo ASCII))[*256+terceiro byte do cdigo ASCII...]. Se
o caracter mais a esquerda no multi-byte, retornado o mesmo valor que a funo ASCII()
retorna:
mysql> SELECT ORD('2');
-> 50
LENGTH(str) , OCTET_LENGTH(str)
TER_LENGTH(str)
CHAR_LENGTH(str)
CHARAC-
MID(str,pos,len)
MID(str,pos,len) um sinnimo para SUBSTRING(str,pos,len).
476
POSITION(substr IN str)
POSITION(substr IN str) um sinnimo para LOCATE(substr,str).
QUOTE(str)
Coloca uma string entre aspas para produzir um resultado que possa ser usada em uma intruo
SQL como um valor de dados com o caracter de escape correto. A string retornada entre aspas
simples e cada instqncia de aspas simples ('''), barra invertida ('\'), ASCII NUL, e Control-Z
precedida por uma barra invertida. Se o argumento NULL, o valor retornado a palavra
``NULL'' sem aspas simples.
A funo QUOTE() foi adicionada na verso 4.0.3 do MySQL.
mysql> SELECT QUOTE("Don't");
-> 'Don\'t!'
mysql> SELECT QUOTE(NULL);
-> NULL
REPEAT(str,cont)
Retorna uma string consistindo da string str repetida cont vezes. Se cont <= 0, retornado uma string vazia. retornado NULL se str ou cont so NULL:
mysql> SELECT REPEAT('MySQL', 3);
-> 'MySQLMySQLMySQL'
REPLACE(str,da_str,para_str)
Retorna a string str com todas ocorrncias da string da_str substituida pela string para_str:
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
-> 'WwWwWw.mysql.com'
Esta funo multi-byte.
REVERSE(str)
Returns the string str with the order of the characters reversed:
mysql> SELECT REVERSE('abc');
-> 'cba'
Esta funo multi-byte.
RIGHT(str,tem)
mysql> SELECT RIGHT('foobarbar', 4);
-> 'rbar'
477
RPAD(str,tam,strpreech)
Retorna a string str, preenchida a direita com a string strpreench para um tamanho de tam
caracteres. Se str maior que tam, o valor retornado reduzido para tam caracteres.
mysql> SELECT RPAD('hi',5,'?');
-> 'hi???'
RTRIM(str)
Retourna a string str com caracteres de espaos extras finais removidos:
mysql> SELECT RTRIM('barbar
-> 'barbar'
');
SOUNDEX(str)
Retorna uma string 'soundex' de str. Duas strings que parecidas fonticamentea devem ter
strings 'soundex' iguais. Uma string soundex padro possui 4 caracteres, mas a funo SOUNDEX() retorna uma string de tamanho arbitrrio. Voc posde usar SUBSTRING() no resultado
para obter uma string 'soundex' padro. Todos os caracteres no alfanumricos so ignorados na
string dada. Todas caracteres internacionais fora da faixa A-Z so tratados como vogais:
mysql> SELECT SOUNDEX('Hello');
-> 'H400'
mysql> SELECT SOUNDEX('Quadratically');
-> 'Q36324'
SPACE(N)
Retorna uma string contendo N caracteres de espao:
mysql> SELECT SPACE(6);
-> '
'
SUBSTRING(str,pos)
,
SUBSTRING(str
FROM
pos)
TRING(str,pos,tam) , SUBSTRING(str FROM pos FOR tam)
SUBS-
A forma sem um argumento tam retorna uma substring da string str iniciando na posio
pos. A forma com um argumento tam retorna a substring com tam caracteres da string str,
iniciando da posio pos. A forma variante que utiliza FROM a sintaxe SQL-92:
mysql> SELECT SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> SELECT SUBSTRING('foobarbar' FROM 4);
-> 'barbar'
mysql> SELECT SUBSTRING('Quadratically',5,6);
478
-> 'ratica'
Esta funo multi-byte.
SUBSTRING_INDEX(str,delim,cont)
Retorna a substring da string str antes de cont ocorrencias do delimitador delim. Se cont
positivo, tudo a esquerda do delimitador final (contando a partir da esquerda) retornado. Se
cont negativo, tudo a direita do delimitador final (contando a partir da direita) retornado.
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'
Esta funo multi-byte.
UCASE(str) , UPPER(str)
Retorna a string str com todos caracteres alterados para letra maisculas de acordo com o conjunto de caracteres atual (o padro ISO-8859-1 Latin1):
mysql> SELECT UCASE('Hej');
-> 'HEJ'
Esta uma funo multi-byte.
479
Se voc quiser converter um nmero em uma string de forma explicita, passe-o como um argumento
de CONCAT().
Se uma funo de string tem uma string binria como argumento, a string resultante tambm um
string binria. Um nmero convertido para uma string tratado como um string binria. Isto afeta
apenas a comparao.
Normalmente, se qualquer expresso em uma string caso-sensitivo, a comparao realizada no
modo caso sensitivo.
Descrio
Description
\%
Correponde a um caracter %
\_
Correponde a um caracter _
REGEXP e RLIKE usam o conjunto de caracteres atual (ISO-8859-1 Latin1 por padro) para decidir o tipo de caracter.
STRCMP(expr1,expr2)
STRCMP() retorna 0 se as string so a mesma, -1 se o primeiro argumento menor que o segundo de acordo com a ordenao atual e 1 em caso contrrio:
mysql> SELECT STRCMP('texto', 'texto2');
481
-> -1
mysql> SELECT STRCMP('texto2', 'texto');
-> 1
mysql> SELECT STRCMP('texto', 'texto');
-> 0
MATCH (col1,col2,...)
QUERY EXPANSION] )
AGAINST
(expr
[IN
BOOLEAN
MODE
WITH
MATCH ... AGAINST() usado para busca de textos completos e retorna a relvncia - similaridade medidad entre o texto nas colunas (col1,col2,...) e a consulta expr. Relevncia um nmero de ponto flutuante. Relevncia zero significa que no houve nenhuma similaridade. MATCH ... AGAINST() est disponvel na verso 3.23.23 ou posterior do MySQL. A
extenso IN BOOLEAN MODE foi adicionada na verso 4.0.1, WITH QUERY EXPANSION
foi adicionado na verso 4.1.1. Para detalhes e exemplos de uso, veja Seco 6.8, Pesquisa
Full-text no MySQL.
BINARY
O operador BINARY transforma uma string em uma string binria. Este um modo fcil de forar a comparao para se caso-sensitivo mesmo se a coluna no seja definida como BINARY ou
BLOB:
mysql> SELECT "a" = "A";
-> 1
mysql> SELECT BINARY "a" = "A";
-> 0
BINARY string um atalho para CAST(string AS BINARY). See Seco 6.3.5,
Funes de Converso. BINARY foi introduzida na verso 3.23.0 do MySQL.
Note que em alguns contextos MySQL no estar apto a usar o ndice de forma eficiente quando
se transformar uma coluna ndice em BINARY.
Se voc quiser compara um blob caso-insensitivo voc pode sempre convert-lo para letras maisculas antes de faer a comparao:
SELECT 'A' LIKE UPPER(col_blobl) FROM nome_tabela;
No planejamos introduzir em breve coero (casting) entre diferentes conjuntos de caracteres para
tornar compares de strings mais flexvel.
+
482
Adio:
mysql> SELECT 3+5;
-> 8
Subtrao:
mysql> SELECT 3-5;
-> -2
*
Multiplicao:
mysql> SELECT 3*5;
-> 15
mysql> SELECT 18014398509481984*18014398509481984.0;
-> 324518553658426726783156020576256.0
mysql> SELECT 18014398509481984*18014398509481984;
-> 0
O resultado da ltima expresso incorreta porque o resultado da multiplicao de inteiros excede a faixa de 64-bits dos clculos BIGINT.
/
Diviso:
mysql> SELECT 3/5;
-> 0.60
Divises por zero produz um resultado NULL:
mysql> SELECT 102/(1-1);
-> NULL
Uma diviso ser calculada com aritimtica BIGINT somente se executada em um contexto no
qual o resultado convertido para um interiro!
significa que voc deve evitar usar - em inteiros que pode ter o valor de -2^63!
ABS(X)
Retorna o valor absoluto de X:
mysql> SELECT ABS(2);
-> 2
mysql> SELECT ABS(-32);
-> 32
O uso desta funo seguro com valores BIGINT.
SIGN(X)
Retorna o sinal do argumento como -1, 0, ou 1, dependendo de quando X negativo, zero, ou
positivo:
mysql> SELECT SIGN(-32);
-> -1
mysql> SELECT SIGN(0);
-> 0
mysql> SELECT SIGN(234);
-> 1
MOD(N,M) , %
Modulo (como o operador % em C). Retorna o resto de N dividido por M:
mysql> SELECT
-> 4
mysql> SELECT
-> 1
mysql> SELECT
-> 2
mysql> SELECT
-> 2
MOD(234, 10);
253 % 7;
MOD(29,9);
29 MOD 9;
O uso desta funo seguro com valores BIGINT. O ltimo exemplo s funciona no MySQL
4.1
FLOOR(X)
Retorna o maior valor inteiro no maior que X:
mysql> SELECT FLOOR(1.23);
-> 1
mysql> SELECT FLOOR(-1.23);
-> -2
Note que o valor retornado convertido para um BIGINT!
CEILING(X) , CEIL(X)
Retorna o menor valor inteiro no menor que X:
mysql> SELECT CEILING(1.23);
-> 2
484
ROUND(X) , ROUND(X,D)
Retorna o argumeto X, arredondado para o inteiro mais prximo. Com dois argumentos o arredandamento feito para um nmero com D decimais.
mysql> SELECT ROUND(-1.23);
-> -1
mysql> SELECT ROUND(-1.58);
-> -2
mysql> SELECT ROUND(1.58);
-> 2
mysql> SELECT ROUND(1.298, 1);
-> 1.3
mysql> SELECT ROUND(1.298, 0);
-> 1
mysql> SELECT ROUND(23.298, -1);
-> 20
Note que o comportamento de ROUND() quando o argumento est no meio do caminho entre
dois inteiros depende da implementao da biblioteca C. Alguns arredondamentos para o nmero mais prximo, so sempre para baixo, para cima ou so zero. Se voc precisa de um tipo de
arredondamento, voc deve usar uma funo bem definida como TRUNCATE() ou FLOOR().
DIV
Diviso de inteiros. Similar ao FLOOR() mas seguro com valores BIGINT.
mysql> SELECT 5 DIV 2
-> 2
DIV novo no MySQL 4.1.0.
EXP(X)
Retorna o valor de e (the base of natural logarithms) raised to the power of X:
mysql> SELECT EXP(2);
-> 7.389056
mysql> SELECT EXP(-2);
-> 0.135335
LN(X)
Retorna o logaritmo natural de X:
mysql> SELECT LN(2);
-> 0.693147
mysql> SELECT LN(-2);
-> NULL
485
Esta funo foi adicionada na verso 4.0.3 do MySQL. sinnimo de LOG(X) no MySQL.
LOG(X) , LOG(B,X)
Se chamado com um parmetro, esta funo retorna o logartmo natural de X:
mysql> SELECT LOG(2);
-> 0.693147
mysql> SELECT LOG(-2);
-> NULL
Se chamado com dois parmetros, esta funo retorna o logartmo natural de X para uma base
arbitraria B:
mysql> SELECT LOG(2,65536);
-> 16.000000
mysql> SELECT LOG(1,100);
-> NULL
A opo de base arbitrria foi adicionada na verso 4.0.3 do MySQL. LOG(B,X) equivalente
a LOG(X)/LOG(B).
LOG2(X)
Returna o logartmo na base 2 de X:
mysql> SELECT LOG2(65536);
-> 16.000000
mysql> SELECT LOG2(-100);
-> NULL
LOG2() til para descobrir quantos bits um nmero necessitaria para ser armazenado. Esta
funo foi adicionada na verso 4.0.3 do MySQL. Em verses anteriores, voc pode usar
LOG(X)/LOG(2).
LOG10(X)
Returna o logartmo na base 10 de X:
mysql> SELECT LOG10(2);
-> 0.301030
mysql> SELECT LOG10(100);
-> 2.000000
mysql> SELECT LOG10(-100);
-> NULL
POW(X,Y) , POWER(X,Y)
Retorna o valor de X elevado a potncia de Y:
mysql> SELECT POW(2,2);
-> 4.000000
mysql> SELECT POW(2,-2);
-> 0.250000
SQRT(X)
486
PI()
Retorna o valor de PI. A quantidade de nmeros decimais padro 5, mas o MySQL usa internamente a preciso dupla completa para PI.
mysql> SELECT PI();
-> 3.141593
mysql> SELECT PI()+0.000000000000000000;
-> 3.141592653589793116
COS(X)
Retorna o cosseno de X, onde X dado em radianos:
mysql> SELECT COS(PI());
-> -1.000000
SIN(X)
Retorna o seno de X, onde X dado em radianos:
mysql> SELECT SIN(PI());
-> 0.000000
TAN(X)
Retorna a tangente de X, onde X dado em radianos:
mysql> SELECT TAN(PI()+1);
-> 1.557408
ACOS(X)
Retorna o arco cosseno X, isto , o valor cujo cosseno X. Retorna NULL se X no est na faixa
de -1 a 1:
mysql> SELECT ACOS(1);
-> 0.000000
mysql> SELECT ACOS(1.0001);
-> NULL
mysql> SELECT ACOS(0);
-> 1.570796
ASIN(X)
Retorna o arco seno X, isto , o valor cujo seno X. Retorna NULL se X no est na faixa de -1
a 1:
487
ATAN(X)
Retorna o arco tangente X, isto , o valor cuja tangente X. X:
mysql> SELECT ATAN(2);
-> 1.107149
mysql> SELECT ATAN(-2);
-> -1.107149
ATAN(Y,X) , ATAN2(Y,X)
Retorna o arco tangente de duas variaveis X e Y. similar ao caclculo do arco tengente de Y /
X, exceto que os sinais de ambos argumentos so usados para determinas o quadrante do resultado:
mysql> SELECT ATAN(-2,2);
-> -0.785398
mysql> SELECT ATAN2(PI(),0);
-> 1.570796
COT(X)
Returns a cotangente de X:
mysql> SELECT COT(12);
-> -1.57267341
mysql> SELECT COT(0);
-> NULL
CRC32(expr)
Calcula um valor de verificao de redundncia cclica e retorna um valor unsigned de 32 bits. O
resultado NULL se o argumento NULL. O argumento esperado uma string e ser tratado como tal se no for.
RAND() , RAND(N)
Retorna um valor de ponto flutuante aleatrio na faixa de 0 a 1.0. Se um argumento inteiro N
especificado, ele usado como uma semente (produzindo uma sequncia repetitiva):
mysql> SELECT RAND();
-> 0.9233482386203
mysql> SELECT RAND(20);
-> 0.15888261251047
488
LEAST(X,Y,...)
Com dois ou mais argumentos, retorna o menor (valor-mnimo) argumento. Os argumentos so
comparados usando as seguintes regras:
GREATEST(X,Y,...)
Retorna o maior (valor mximo) argumento. Os argumentos so comparados usando as mesmas
regras do LEAST:
mysql> SELECT GREATEST(2,0);
-> 2
mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);
-> 767.0
mysql> SELECT GREATEST("B","A","C");
-> "C"
Em verses do MySQL anteriores a verso 3.22.5, voc pode usar MAX() no lugar de GRATEST.
489
DEGREES(X)
Retorna o argumento X, convertido de radianos para graus:
mysql> SELECT DEGREES(PI());
-> 180.000000
RADIANS(X)
Retorna o argumento X, convertido de graus para radianos:
mysql> SELECT RADIANS(90);
-> 1.570796
TRUNCATE(X,D)
Retiorna o nmero X, truncado para D casas decimais. Se D 0, o resultado no ter ponto deciaml ou prate fracionria:
mysql> SELECT TRUNCATE(1.223,1);
-> 1.2
mysql> SELECT TRUNCATE(1.999,1);
-> 1.9
mysql> SELECT TRUNCATE(1.999,0);
-> 1
mysql> SELECT TRUNCATE(-1.999,1);
-> -1.9
A partir do MySQL 3.23.51 todos o nmeros so arredondados para zero.
Se D negativo, ento D numeros da parte inteira so zerados:
mysql> SELECT TRUNCATE(122,-2);
-> 100
Note que como os nmeros decimais no so normalmente armazenados como nmeros exatos,
mas como valores de dupla preciso, voc pode obter o seguinte resultado:
mysql> SELECT TRUNCATE(10.28*100,0);
-> 1027
O resultado acima acontece
10.2799999999999999.
porque
10.28
na
verdade,
armazenado
como
490
DATE(expr)
Extrai a parte da data da expresso date ou datetime em expr.
TIME(expr)
Extrai a parte da hora da expresso time ou datetime em expr.
TIMESTAMP(expr) , TIMESTAMP(expr,expr2)
Com um argumento, retorna a expresso date ou datetime em expr como um valor datetime.
Com dois argumentos, adiciona a expresso time e expr2 expresso date ou datetime em
expr e retorna um valor datetime.
491
DAYOFWEEK(data)
Retorna o ndice do dia da semana para data (1 = Domingo, 2 = Segunda, ... 7 = Sbado). Estes valores de ndices correspondem ao padro ODBC.
mysql> SELECT DAYOFWEEK('1998-02-03');
-> 3
WEEKDAY(data)
Retorna o ndice do dia das semana para data (0 = Segunda, 1 = Tera, ... 6 = Domingo):
mysql> SELECT WEEKDAY('1998-02-03 22:23:00');
-> 1
mysql> SELECT WEEKDAY('1997-11-05');
-> 2
DAYOFMONTH(data)
Retorna o dia do ms para data, na faixa de 1 at 31:
mysql> SELECT DAYOFMONTH('1998-02-03');
-> 3
DAY(date)
DAY() um sinnimo para DAYOFMONTH(). Est disponvel a partir do MySQL 4.1.1.
DAYOFYEAR(data)
Retorna o dia do ano para data, na faixa de 1 at 366:
mysql> SELECT DAYOFYEAR('1998-02-03');
-> 34
MONTH(data)
Retorna o ms para data, na faixa de 1 at 12:
mysql> SELECT MONTH('1998-02-03');
-> 2
DAYNAME(data)
Retorna o nome do dia da semana para data:
492
MONTHNAME(data)
Retorna o nome do ms para data:
mysql> SELECT MONTHNAME('1998-02-05');
-> 'February'
QUARTER(data)
Retorna o trimaster para data, na faixa de 1 at 4:
mysql> SELECT QUARTER('98-04-01');
-> 2
WEEK(data [,modo])
A funo retorna o nmero da semana para date. A forma de dois argumentos de WEEK() permite que voc especifique se a semana comea no Domingo ou na Segunda e se o valor de retorno deve estar na faixa de 0-53 ou 1-5. Quando o argumento modo omitido, o valor de uma varivel de servidor default_week_format (ou 0 no MySQL 4.0 e mais novo) assumido.
See Seco 5.5.6, Sintaxe de SET.
A seguinte tabela demonstra como o argumento modo funciona:
Valor
Significado
Semana comea no Domingo; retorna o valor na faixa de 0 a 53; semana 1 a primeira semana neste ano.
Semana comea na Segunda; retorna o valor na faixa de 0 a 53; semana 1 a primeira semana com mais de 3 dias neste ano
Semana comea no Domingo; retorna o valor na faixa de 1 a 53; semana 1 a primeira semana neste ano.
Semana comea na Segunda; retorna o valor na faixa de 1 a 53; semana 1 a primeira semana com mais de 3 dias neste ano.
Semana comea no Domingo; retorna o valor na faixa de 0 a 53; semana 1 a primeira semana com mais de 3 dias neste ano.
Semana comea na Segunda; retorna o valor na faixa de 0 a 53; semana 1 a primeira semana neste ano.
Semana comea no Domingo; retorna o valor na faixa de 0 a 53; semana 1 a primeira semana que tenha mais de 3 dias neste ano.
Semana comea na Segunda; retorna o valor na faixa de 1 a 53; semana 1 a primeira semana neste ano.
O valor mode de 3 pode ser usado a partir do MySQL 4.0.5. O valor mode de 4 e acima pode
ser usado a partir do MySQL 4.0.17.
mysql> SELECT WEEK('1998-02-20');
-> 7
493
WEEKOFYEAR(data)
Retorna a semana da data como um nmero na faixa de 1 a 53.
YEAR(data)
Retorna o ano para data na faixa de 1000 a 9999:
mysql> SELECT YEAR('98-02-03');
-> 1998
494
YEARWEEK(data) , YEARWEEK(data,inicio)
Retorna o ano e a semana para a data. O argumento inicio funciona exatamente como o argumento inicio de WEEK(). Note que o ano pode ser diferente do ano no argumento data para a
primeira e a ltima semana do ano:
mysql> SELECT YEARWEEK('1987-01-01');
-> 198653
Note que o nmero da semana diferente do que seria retornado pela funo WEEK() (0) para
os argumentos opcionais 0 ou 1, j que WEEK() retorna a semana no centexto de um ano dado.
HOUR(hora)
Retorna a hora para hora. A faixa do valor retornado ser de 0 a 23 para o valor hora do dia.
mysql> SELECT HOUR('10:05:03');
-> 10
No entanto, a faixa dos valores TIME atualmente so muito grandes, assim HOUR pode retornar
valores maior que 23:
mysql> SELECT HOUR('272:59:59');
-> 272
MINUTE(hora)
Retorna o minuto para hora, na faixa de 0 a 59:
mysql> SELECT MINUTE('98-02-03 10:05:03');
-> 5
SECOND(hora)
Retorna o segundo para hora, na faixa de 0 a 59:
mysql> SELECT SECOND('10:05:03');
-> 3
MICROSECOND(expr)
Retorna os microsegundos da expresso time ou datetime em expr como um nmero na faixa
de 0 a 999999.
PERIOD_ADD(P,N)
Adiciona N meses ao perodo P (no formato AAMM ou AAAAMM). Retorna um valor no formato
AAAAMM.
Note que o argumento de perodo P no um valor de data:
mysql> SELECT PERIOD_ADD(9801,2);
-> 199803
PERIOD_DIFF(P1,P2)
Retorna o nmero de meses entre os perodos P1 e P2. P1 e P2 devem estar no formato AAMM
ou AAAAMM.
Note que os argumentos de perodo P1 e P2 no so valores de data:
mysql> SELECT PERIOD_DIFF(9802,199703);
-> 11
DATE_ADD(data,INTERVAL
expr)
tipo
expr) , DATE_SUB(data,INTERVAL
tipo
SECOND
SECONDS
MINUTE
MINUTES
HOUR
HOURS
DAY
DAYS
MONTH
MONTHS
YEAR
YEARS
MINUTE_SECOND
'MINUTES:SECONDS'
HOUR_MINUTE
'HOURS:MINUTES'
DAY_HOUR
'DAYS HOURS'
YEAR_MONTH
'YEARS-MONTHS'
HOUR_SECOND
'HOURS:MINUTES:SECONDS'
DAY_MINUTE
'DAYS HOURS:MINUTES'
DAY_SECOND
'DAYS HOURS:MINUTES:SECONDS'
496
DAY_MICROSECOND
'DAYS.MICROSECONDS'
HOUR_MICROSECOND
'HOURS.MICROSECONDS'
MINUTE_MICROSECOND
'MINUTES.MICROSECONDS'
SECOND_MICROSECOND
'SECONDS.MICROSECONDS'
MICROSECOND
'MICROSECONDS'
Os
valores
do
tipo
DAY_MICROSECOND,
HOUR_MICROSECOND,
MINUTE_MICROSECOND, SECOND_MICROSECOND e MICROSECOND so permitidos aps o
MySQL 4.1.1.
O MySQL permite qualquer delimitador de pontuao no formato de expr. Os delimitadores
mostrados na tabela so apenas sugeridos. Se o argumento date um valor de DATA e seus clculos envolvem apenas as partes ANO, MS, e DIA (into , nenhuma parte de hora), o resultado
um valor do tipo DATE. Seno, o resultado um valor do tipo DATETIME:
mysql> SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND;
-> '1998-01-01 00:00:00'
mysql> SELECT INTERVAL 1 DAY + '1997-12-31';
-> '1998-01-01'
mysql> SELECT '1998-01-01' - INTERVAL 1 SECOND;
-> '1997-12-31 23:59:59'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
->
INTERVAL 1 SECOND);
-> '1998-01-01 00:00:00'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
->
INTERVAL 1 DAY);
-> '1998-01-01 23:59:59'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
->
INTERVAL '1:1' MINUTE_SECOND);
-> '1998-01-01 00:01:00'
mysql> SELECT DATE_SUB('1998-01-01 00:00:00',
->
INTERVAL '1 1:1:1' DAY_SECOND);
-> '1997-12-30 22:58:59'
mysql> SELECT DATE_ADD('1998-01-01 00:00:00',
->
INTERVAL '-1 10' DAY_HOUR);
-> '1997-12-30 14:00:00'
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
-> '1997-12-02'
mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002',
->
INTERVAL '1.999999' SECOND_MICROSECOND);
-> '1993-01-01 00:00:01.000001'
Se voc especificado um intervalo muito curto (no inclue todas as partes que seriam esperadas
pelo intervalo para aquele tipo), MySQL assume que voc no especificou a parte mais a esquerda do valor do intervalo. Por exemplo, se voc especifica um tipo DAY_SECOND, o valor
esperado de expr dever ter as partes de dias, horas, minutos e segundos. Se voc especifica
um valor como '1:10', MySQL assume que as partes do dia e da hora foram esquecidas e o
valor representa minutos e segundos. Em outras palavras, '1:10' DAY_SECOND interpretado de forma equivalente a '1:10' MINUTE_SECOND. Isto anlogo a forma que o MySQL
interpreta valores TIME representado tempo decorrido no lugar de hora do dia.
Note que se voc adicionar ou subtrair de uma data algo contendo uma parte de hora, o resultado
automaticamente convertido para um valor datetime:
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY);
-> '1999-01-02'
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR);
-> '1999-01-01 01:00:00'
497
Se voc utilizar datas mal formadas, o valor retornado NULL. S voc adicionar MONTH, YEAR_MONTH, ou YEAR e a data resultante tiver um dia maior que o dia mximo para aquele ms,
o dia ajustado para o dia mximo no ms.
mysql> SELECT DATE_ADD('1998-01-30', interval 1 month);
-> '1998-02-28'
Note pelo exemplo anterior que a palavra-chave INTERVAL e o especificador tipo no so caso sensitivo.
ADDTIME(expr,expr2)
ADDTIME() adiciona expr2 a expr e retorna o resultado. expr uma expresso date ou datetime, e expr2 uma expresso time.
DATEDIFF(expr,expr2) , TIMEDIFF(expr,expr2)
DATEDIFF() retorna o nmero de dias entre a data inicial expr e a data final expr2. expr e
expr2 so expresses de datas ou data e hora. Apenas a parte da data dos valores s usados no
clculo.
TIMEDIFF() retorna o tempo entre a hora inicial expr e a hora final expr2. expr e expr2
so expresses de hora ou data e hora, mas ambas devem ser do mesmo tipo.
23:59:59','1997-12-30');
23:59:59','1997-12-31');
00:00:00', '2000:01:01 00:00:00.000001');
23:59:59.000001','1997-12-30 01:01:01.0000
TO_DAYS(data)
Dada uma data data, retorna o nmero do dia (o nmero de dias desde o ano 0);
mysql> SELECT TO_DAYS(950501);
-> 728779
mysql> SELECT TO_DAYS('1997-10-07');
-> 729669
TO_DAYS() no pode ser usado com valores que orecedem o advento do calendario Gregoriano (1582), porque ele no leva em conta os dias perdidos quando o calendrio foi mudado.
FROM_DAYS(N)
Dado um nmero de dia N, retorna um valor DATE:
mysql> SELECT FROM_DAYS(729669);
-> '1997-10-07'
FROM_DAYS() no pode ser usado com valores que orecedem o advento do calendario Gregoriano (1582), porque ele no leva em conta os dias perdidos quando o calendrio foi mudado.
DATE_FORMAT(data,formato)
Formata o valor de data de acordo com a string formato string. Os seguintes identificadores
podem ser utilizados na string formato:
Specifi-
Description
499
er
%M
Nome do ms (January..December)
%W
%D
%Y
%y
%X
Ano para a semana onde o Domingo o primeiro dia da semana, numerico, 4 digitos; usado com %V
%x
Ano para a semana onde a segunda o primeiro dia da semana, numerico, 4 digitos; usado com %v
%a
%d
%e
%m
%c
%b
%j
%H
Hora (00..23)
%k
Hora (0..23)
%h
Hora (01..12)
%I
Hora (01..12)
%l
Hora (1..12)
%i
%r
%T
%S
Segundos (00..59)
%s
Segundos (00..59)
%f
Microsegundos (000000..999999)
%p
AM ou PM
%w
%U
%u
%V
%v
%%
Um literal '%'.
STR_TO_DATE(str,format)
Esta a funo reversa da funo DATE_FORMAT(). Ela pega uma string str, e um formato
format, e retorna uma valor DATETIME.
Os valores date, time, ou datetime contidos em str devem ser dados no formato indicado por
format. Para o especificadores que podem ser usados em format, veja a tabela na descrio
da funo DATE_FORMAT(). Todos os outros caracteres sero apenas exibidos, no sendo interpretados. Se str contm um valor date, time, ou datetime ilegal, STR_TO_DATE() retorna
NULL.
Resultado
GET_FORMAT(DATE,'USA')
'%m.%d.%Y'
GET_FORMAT(DATE,'JIS')
'%Y-%m-%d'
GET_FORMAT(DATE,'ISO')
'%Y-%m-%d'
GET_FORMAT(DATE,'EUR')
'%d.%m.%Y'
501
GET_FORMAT(DATE,'INTERNAL')
'%Y%m%d'
GET_FORMAT(TIMESTAMP,'USA')
'%Y-%m-%d-%H.%i.%s'
GET_FORMAT(TIMESTAMP,'JIS')
'%Y-%m-%d %H:%i:%s'
GET_FORMAT(TIMESTAMP,'ISO')
'%Y-%m-%d %H:%i:%s'
GET_FORMAT(TIMESTAMP,'EUR')
'%Y-%m-%d-%H.%i.%s'
GET_FORMAT(TIMESTAMP,'INTERNAL
')
'%Y%m%d%H%i%s'
GET_FORMAT(TIME,'USA')
'%h:%i:%s %p'
GET_FORMAT(TIME,'JIS')
'%H:%i:%s'
GET_FORMAT(TIME,'ISO')
'%H:%i:%s'
GET_FORMAT(TIME,'EUR')
'%H.%i.%S'
GET_FORMAT(TIME,'INTERNAL')
'%H%i%s'
A partir do MySQL 4.1.1, a segunda sintaxe permitida, onde expr uma expresso date ou
datetime e days o nmero de dias a ser subtrado de expr.
mysql> SELECT SUBDATE('1998-01-02 12:00:00', 31);
-> '1997-12-02 12:00:00'
SUBTIME(expr,expr2)
SUBTIME() subtrai expr2 de expr e retorna o resultado. expr uma expresso date ou datetime, e expr2 uma expresso time.
502
TIME_FORMAT(hora,formato)
usado como a funo DATE_FORMAT() acima, mas a string de formato pode conter apenas os especificadores de formato que tratam de horas, minutos e segundos. Outros especificadores produzem um valor NULL ou 0.
Se o valor time contm uma hora que maior que 23, os especificadores de formato de hora
%H e %k produzem um valor maior que a faixa como de 0..23. O outro especificador do formato de hora produz o valor da hora mdulo 12:
mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l');
-> '100 100 04 04 4'
LAST_DAY(data)
Pega um valor date ou datetime e retorna o valor correspondente para o ltimo dia do ms. Retorna NULL se o argumento invalido.
MAKEDATE(ano,diadoano)
Retorna uma data, dado os valores da ano e dia do ano. diadoano deve ser maior que 0 ou o
resultado ser NULL.
503
MAKETIME(hora,minuto,segundo)
Retorna um valor time calculado a partir dos argmentos hora, minuto e segundo.
UNIX_TIMESTAMP() , UNIX_TIMESTAMP(data)
Se chamado sem argumento, retorna um tipo timestamp do Unix (segundos desde
'1970-01-01 00:00:00' GMT) como um inteiro sem sinal. Se UNIX_TIMESTAMP()
chamada com um argumento data, retornado o valor do argumento como segundo desde
'1970-01-01 00:00:00' GMT. data pode ser um string DATE, uma string DATETIME,
um TIMESTAMP, ou um nmero no formato YYMMDD ou YYYYMMDD na hora local:
mysql> SELECT UNIX_TIMESTAMP();
-> 882226357
mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
504
-> 875996580
Qaundo UNIX_TIMESTAMP usado em uma coluna TIMESTAMP, a funo retorna o valor timestamp interno diretamente, sem nenhuma converso ``string-para-unix-timestamp'' implicita.
Se voc passar uma data fora da faixa para UNIX_TIMESTAMP(), a funo ir retornar 0, mas
por favor note que s verificaes bsicas so realizadas. (ano 1970-2037, ms 01-12, dia
01-31).
Se voc subtrair colunas UNIX_TIMESTAMP(), voc pode querer mudar o resultado para inteiro com sinal. See Seco 6.3.5, Funes de Converso.
FROM_UNIXTIME(unix_timestamp)
FROM_UNIXTIME(unix_timestamp,format)
Retorna a representao do argumento unix_timestamp como um valor no formato 'YYYYMM-DD HH:MM:SS' ou YYYYMMDDHHMMSS, dependendo de do contexto em que a fun
utilizada:
mysql> SELECT FROM_UNIXTIME(875996580);
-> '1997-10-04 22:23:00'
mysql> SELECT FROM_UNIXTIME(875996580) + 0;
-> 19971004222300
Se o formato dado o resultado formatado de acordo com a string formato. formato
pode conter os especificadores listados acima para a funo DATE_FORMAT()
mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
->
'%Y %D %M %h:%i:%s %x');
-> '2003 6th August 06:22:58 2003'
SEC_TO_TIME(seconds)
Retorna o argumento segundos, convertido em horas, minutos e segundos como um valor no
formato 'HH:MM:SS' ou HHMMSS, dependendo do contexto em que a funo utilizada:
mysql> SELECT SEC_TO_TIME(2378);
-> '00:39:38'
mysql> SELECT SEC_TO_TIME(2378) + 0;
-> 3938
TIME_TO_SEC(time)
Retorna o argumento time, convertido em segundos:
mysql> SELECT TIME_TO_SEC('22:23:00');
-> 80580
mysql> SELECT TIME_TO_SEC('00:39:38');
-> 2378
UTC_DATE , UTC_DATE()
Retorna a data UTC atual como um valor no formato 'YYYY-MM-DD' ou YYYYMMDD, depen505
UTC_TIME , UTC_TIME()
Retorna a hora UTC atual como um valor no formato 'HH:MM:SS' ou HHMMSS, dependendo
se a funo usada em um contexto string ou numrico:
UTC_TIMESTAMP , UTC_TIMESTAMP()
Retorna a data e hora UTC atual como um valor no formato 'YYYY-MM-DD HH:MM:SS' ou
YYYYMMDDHHMMSS, dependendo se a funo usada em um contexto string ou numrico:
BINARY
CHAR
DATE
DATETIME
SIGNED {INTEGER}
506
TIME
UNSIGNED {INTEGER}
CAST() e CONVERT() esto disponveis a partir do MySQL 4.0.2. O tipo de converso CHAR est
disponvel a partir do verso 4.0.6. A forma USING de CONVERT() est disponvel a partir da verso 4.1.0.
CAST() e CONVERT(... USING ...) so da sintaxe SQL-99. A forma no-USING de CONVERT() da sintaxe ODBC.
CAST() da sintaxe SQL-99 syntax e CONVERT() da sintaxe ODBC.
As funes de converso so principalmente teis quando voc deseja criar uma coluna com um tipo
especfico em uma CREATE ... SELECT:
CREATE TABLE nova_tabela SELECT CAST('2000-01-01' AS DATE);
As funes tambm podem ser teis para ordenar colunas ENUM na ordem lexicogrfica. Normalmente a ordenao das colunas ENUM ocorrem usando os valores numricos internos. Converter os
valores para CHAR resultam em uma ordenao lexicogrfica:
SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);
CAST(string AS BINARY) a mesma coisa que BINARY string. CAST(expr AS
CHAR) trata a expresso como uma string com o conjunto de caracteres padro.
NOTA: No MysQL 4.0 o CAST() para DATE, DATETIME ou TIME s marca a coluna para ser um
tipo especfico mas no altera o valor da coluna.
No MySQL 4.1.0 o valor ser convertido para a coluna correta quando for enviado para o usurio
(este um recurso de como o novo protocolo na verso 4.1 envia as informaes de data para o cliente):
mysql> SELECT CAST(NOW() AS DATE);
-> 2003-05-26
Em verses futuras do MySQL (provavelmente 4.1.2 ou 5.0) iremos corrigir o fato de que CAST
tambm altera o resultado se voc us-lo como parte de uma expresso mais complexa, como CONCAT("Data: ",CAST(NOW() AS DATE)).
Voc no deve utilizar CAST() para extrair dados em formatos diferentes, mas sim para usar funes strins como LEFT ou EXTRACT(). See Seco 6.3.4, Funes de Data e Hora.
Para converter uma string para um valor numrico, normalmente no necessrio se fazer nada;
apenas use a string como se fosse um nmero:
mysql> SELECT 1+'1';
-> 2
Se voc usar um nmero em um contexto string, o nmero ser convertido automaticamente para
uma string BINARY.
mysql> SELECT CONCAT("hello you ",2);
-> "hello you 2"
O MySQL suporta aritimtico com valores de 64 bits com sinal e sem sinal. Se voc est usando
operaes numricas (como +) e um dos operandos unsigned integer (inteiro sem sinal), o
resultado tambm ser sem sinal (unsigned). Voc pode forar o tipo usando os operadores de con507
verso SIGNED e UNSIGNED para converter a operao para um inteiro de 64 bits com sinal e sem
sinal, respectivamente.
mysql> SELECT CAST(1-2 AS UNSIGNED)
-> 18446744073709551615
mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);
-> -1
Note que se um dos operandos for um valor de ponto flutuante o resultado um valor de ponto flutuante e no afetado pela regra acima. (Neste contexto DECIMAL() considerado um valor de
ponto flutuante).
mysql> SELECT CAST(1 AS UNSIGNED) -2.0;
-> -1.0
Se voc estiver utilizando uma string em uma operao aritimtica, ela convertida para um nmero
de ponto flutuante.
O tratamento de valores sem sinais foi mudado no MySQL 4.0 para suportar valores BIGINT apropriadamente. Se voc tiver algum cdigo que deseja executar no MySQL 4.0 e 3.23 (casos em que
voc provavelmente no poder usar a funo CAST()), voc pode utilizar o seguinte truque para
conseguir um resultado com sinal quando subtraindo duas colunas do tipo unsigned integer (inteiro
sem sinal):
SELECT (coluna_sem_sinal_1+0.0)-(coluna_sem_sinal_2+0.0);
A idia que as colunas sejam convertidas para valores de ponto flutuante antes da subtrao ocorrer.
Se voc tiver algum problema com colunas UNSIGNED no seu aplicao MySQL antiga ao portar
para o MySQL 4.0, voc pode usar a opo --sql-mode=NO_UNSIGNED_SUBTRACTION ao
iniciar mysqld. Note, no entanto, que enquanto voc utilizar esta opo, no ser possvel conseguir um uso efetivo do tipo de coluna BIGINT UNSIGNED.
CONVERT() com USING usado para converter dados entre diferentes conjuntos de caracteres. No
MySQL, nomes trancodificados so o mesmo que o nome do conjunto de caracteres correspondentes. Por exemplo, esta instruo converte a string 'abc' no conjunto de caracteres padro do servidor na string correspondente no conjunto de caracteres utf8:
SELECT CONVERT('abc' USING utf8);
|
Operador binrio OR
mysql> SELECT 29 | 15;
-> 31
O resultado um inteiro sem sinal de 64 bits.
&
508
^
Operado binrio XOR
mysql> SELECT 1 ^ 1;
-> 0
mysql> SELECT 1 ^ 0;
-> 1
mysql> SELECT 11 ^ 3;
-> 8
O resultado um inteiro sem sinal de 64 bits.
XOR foi adicionado na verso 4.0.2.
<<
Desloca um nmero BIGINT (muito grande) a esquerda:
mysql> SELECT 1 << 2;
-> 4
O resultado um inteiro sem sinal de 64 bits.
>>
Desloca um nmero BIGINT (muito grande) a direita:
mysql> SELECT 4 >> 2;
-> 1
O resultado um inteiro sem sinal de 64 bits.
~
Inverte todos os bits:
mysql> SELECT 5 & ~1;
-> 4
O resultado um inteiro sem sinal de 64 bits.
BIT_COUNT(N)
Retorna o nmero de bits que so passados no argumento N:
mysql> SELECT BIT_COUNT(29);
-> 4
509
DATABASE()
Retorna o nome do banco de dados atual:
mysql> SELECT DATABASE();
-> 'test'
Se nenhum banco de dados estiver selecionado, DATABASE() retorna NULL a partir do
MySQL 4.1.1, e uma string vazia em verses anteriores.
CURRENT_USER()
Retorna o nome do usurio e o nome de mquina com os quais a sesso atual foi autenticada. Este valor corresponde a conta que usada para acessar seu privilgio de acessos. Ela pode ser diferente do valor de USER().
PASSWORD(str) , OLD_PASSWORD(str)
Calcula a senha a partir de senha str em texto puro. Est a funo que utilizada para cripto510
ENCRYPT(str[,salt])
Criptografa str utilizando a chamada de sistema crypt() do Unix. O argumento salt deve
ser uma string com dois caracteres. (Na verso 3.22.16 do MySQL, salt deve ser maior que
dois caracteres.)
mysql> SELECT ENCRYPT("hello");
-> 'VxuFAJXVARROc'
ENCRYPT() ignora tudo depois dos primeiros 8 caracteres de str, pelo menos em alguns sistemas. Este comportamento determinado pela implementao da chamada de sistema
crypt().
Se crypt() no estiver disponvel no seu sistema, ENCRYPT() sempre retorna NULL. Devido
a isto recomendamos que voc use MD5() ou SHA1() em vez dos existentes em sua plataforma.
ENCODE(str,senha_str)
Criptografa str usando senha_str como a senha. Para descriptografar o resultado, utilize
DECODE().
O resultado uma string binria do mesmo tamanho de str. Se voc deseja salv-la em uma
coluna, use uma coluna do tipo BLOB.
DECODE(cript_str,senha_str)
Descriptografa o string criptografada cript_str usando senha_str como a senha.
cript_str deve ser uma string retornada de ENCODE().
MD5(string)
Calcula um checksum MD5 de 128 bits para a string. O valor retornado como um nmero hexadecimal de 32 digitos que pode, por exemplo, ser usado como uma chave hash:
mysql> SELECT MD5("testing");
-> 'ae2b1fca515949e5d54fb22b8ed95575'
Este o "RSA Data Security, Inc. MD5 Message-Digest Algorithm".
511
SHA1(string) , SHA(string)
Calcula um checksum SHA1 de 160 bit para a string, como descrito no RFC 3174 (Algoritmo
Hash de Segurana). O valor retornado como um nmero hexadecial de 40 digitos, or NULL no
caso do argumento ser NULL . Uma das possibilidades para o uso desta funo a chave hash.
Voc tambm pode us-lo como uma funo segura de criptografia para armazenar senhas.
mysql> SELECT SHA1("abc");
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1() foi adicionado na verso 4.0.2, e pode ser considerada um equivalente ao MD5() com
criptografia mais segura. SHA() um sinnimo para SHA1().
AES_ENCRYPT(string,string_chave)
AES_DECRYPT(string,string_chave)
DES_ENCRYPT(string_para_ciptografar
ve_string) ] )
[,
(numero_chave
cha-
Descrio
512
Somente um argumento
Nmero da chave
string
O string retornada ser uma string binria onde o primeiro caracter ser CHAR(128 | nmero_chave).
O 128 adicionado para facilitar o reconhecimento da chave de criptografia. Se voc usar uma
chave string, numro_chave ser 127.
Havendo erro, esta funo retorna NULL.
O tamanho da string para o resultado ser novo_tamanho=
(8-(tamanho_orig % 8))+1.
tamanho_orig
DES_DECRYPT(string_para_descriptografar [, chave_string])
Derscritogra uma string criptografada com DES_ENCRYPT().
Note que esta funo s funciona se o MySQL tiver sido configurado com suporte SSL. See
Seco 4.4.10, Usando Conexes Seguras.
Se nenhum argumento chave_string for dado, DES_DECRYPT() examina o primeiro byte
da string criptografada para determinar o nmero de chave DES que foi usado para criptografar
a string original, e ento l a chave de des-key-file para descriptografar a mensagem. Para
isto funcionar o usurio deve ter o privilgio SUPER.
Se voc passar para esta funo um argumento chave_string, aquela string usada como a
chave para descriptografar a mensagem.
Se a string_para_descriptografar no se paracer com uma string criptografada, o
MySQL retornar a string_para_descriptografar dada.
513
COMPRESS(string_para_compactar)
Compacta uma string
UNCOMPRESS(string_para_descompactar)
Descompacta uma string compactado pela funo COMPRESS()
UNCOMPRESSED_LENGTH(string_compactada)
Retorna o tamanho da string compactada antes da compactao
LAST_INSERT_ID([expr])
Retorna o ltimo valor gerado automaticamente que tenha sido inserido em um coluna AUTO_INCREMENT.
mysql> SELECT LAST_INSERT_ID();
-> 195
O ltimo ID que foi gerado e mantido no servidor em uma base por conexo. Isto significa que o
valor que a funo retona para um dado cliente o valor AUTO_INCREMENT gerado mais recentemente por aquele cliente. O valor no pode ser afetado pelos outros clientes, mesmo se eles
gerarem um valor AUTO_INCREMENT deles mesmos. Este comportamento assegura que voc
pode recuperar seu prprio ID sem se preocupar com a atividade de outros clientes e sem precisar de locks ou transaes.
O valor de LAST_INSERT_ID() no alterado se voc atualizar uma coluna AUTO_INCREMENT de uma linha com um valor no-mgico (Isto , um valor que no seja NULL e
nem 0).
Se voc inserir muitos registros ao mesmo tempo com uma instruo insert,
LAST_INSERT_ID() retorna o valor da primeira linha inserida. A razo para isto tornar
possvel reproduzir facilmente a mesma intruo INSERT em algum outro servidor.
Se expr dado com um argumento para LAST_INSERT_ID(), ento o valor do argumento
retornado pela funo e configurado como o prximo valor para ser retornado pela
LAST_INSERT_ID(). Isto pode ser til para simular sequncias:
Primeiro crie a tabela:
mysql> CREATE TABLE sequencia (id INT NOT NULL);
mysql> INSERT INTO sequencia VALUES (0);
Ento a tabela pode ser usada para gerar sequncia de nmeros como estes:
mysql> UPDATE sequencia SET id=LAST_INSERT_ID(id+1);
Voc pode gerar sequncias sem chamar LAST_INSERT_ID(), mas a utilidade de se usar a
funo deste modo que o valor ID mantido no servidor como o ltimo valor gerado automaticamente (seguro para multi-usurrio). Voc pode recuperar a nova ID como voc leria qualquer
valor AUTO_INCREMENT normal no MySQL. Por exemplo, LAST_INSERT_ID() (sem um
argmento) retornar a nova ID. A funo mysql_insert_id() da API C tambm pode ser
usada para obter o valor.
Note que como mysql_insert_id() s atualizado depois de instrues INSERT e UPDATE, voc no pode utilizar a funo da API C para recuperar o valor para
LAST_INSERT_ID(expr) depois de executar outra instruo SQL como SELECT ou SET.
See Seco 12.1.3.32, mysql_insert_id().
FORMAT(X,D)
Formata o nmero X com um format como '#,###,###.##', arredondado para D casas decimais, e retorna o resultado como uma string. Se D 0, o resultado no ter nehum ponto decimal
ou parte fracionria:
mysql> SELECT FORMAT(12332.123456, 4);
515
-> '12,332.1235'
mysql> SELECT FORMAT(12332.1,4);
-> '12,332.1000'
mysql> SELECT FORMAT(12332.2,0);
-> '12,332'
VERSION()
Retorna uma string indicando a verso do servidro MySQL:
mysql> SELECT VERSION();
-> '3.23.13-log'
Note que se seu verso finalizar com -log, significa que o log est habilitado.
CONNECTION_ID()
Retorna a identificao (ID da thread) desta conexo. Cada conexo tem seu prprio ID nico:
mysql> SELECT CONNECTION_ID();
-> 23786
GET_LOCK(str,temo_limite)
Tenta conseguir uma trava com o nome dado pela string str, com um tempo limite de timeout segundos. Retorna 1 se o bloqueio foi obtido com sucesso, 0 se o tempo esgotou (por
exemplo, porque outro cliente ja bloqueou o nome), ou NULL se uma erro ocorreu (tal como estouro de memria ou a threado tiver sido finalizada com mysqladmin kill). Uma trava liberada quando voc executa RELEASE_LOCK(), executa uma nova GET_LOCK(), ou a thread termina. (tanto de forma normal quanto anormal) Esta funo pode ser usada para implementar bloqueio de aplicao ou para simular registros travados. Nomes so bloqueados em uma base ampla do servidor. Se um nome foi bloqueado por um cliente, GET_LOCK() trava qualquer
pedido de bloqueio de outro cliente com o mesmo nome. Isto permite que clientes que concordam com um dado nome da trava possam usar a string para realizar travamento de consultas cooperativas:
mysql> SELECT GET_LOCK("lock1",10);
-> 1
mysql> SELECT IS_FREE_LOCK("lock2");
-> 1
mysql> SELECT GET_LOCK("lock2",10);
-> 1
mysql> SELECT RELEASE_LOCK("lock2");
-> 1
mysql> SELECT RELEASE_LOCK("lock1");
-> NULL
Note que a segunda chamada de RELEASE_LOCK() retorna NULL porque a trava "lock1"
foi liberada automaticamente pela segunda chamada GET_LOCK().
RELEASE_LOCK(str)
Libera a trava nomeada pela string str que foi obtida com GET_LOCK(). Retorna 1 se a trava
foi liberada, 0 se a trava no foi bloquada pela thread (caso onde a trava no liberada), e NULL
516
se o nome da trava no existe. (A trava nunca exitir se ela nunca for obtida pela chamada de
GET_LOCK() ou se ela ja tiver sido liberada).
A instruo DO conveniente para ser utilizada com RELEASE_LOCK(). See Seco 6.4.10,
Sintaxe DO.
IS_FREE_LOCK(str)
Verifica se a trava chamada str est livre para ser utilizada (ex. no est bloqueada). Retorna 1
se a trava est liver (ningum a esta usando), 0 se a trava est em uso, e NULL caso ocorra erro
(como argumentos incorretos).
BENCHMARK(cont,expr)
A funo BENCHMARK() executa a expresso expr repetidamente cont vezes. Ela pode ser
usada para medir a velocidade em que o MySQL processa a expresso. O valor resultante sempre 0. A inteno us-la no clientei mysql, relatando o tempo de execuo da consulta:
mysql> SELECT BENCHMARK(1000000,ENCODE("hello","goodbye"));
+----------------------------------------------+
| BENCHMARK(1000000,ENCODE("hello","goodbye")) |
+----------------------------------------------+
|
0 |
+----------------------------------------------+
1 row in set (4.74 sec)
O tempo relatado o tempo decorrido no cliente, no o tempo de CPU no servidor. Pode ser
aconselhvel executar BENCHMARK() diversas vezes e interpretar o resultado cosiderado o peso da carga da maquina servidora.
INET_NTOA(expr)
Dado um endereo numrico de rede (4 ou 8 bytes), retorna a representaco no formato com
pontos do endereo como uma string:
mysql> SELECT INET_NTOA(3520061480);
-> "209.207.224.40"
INET_ATON(expr)
Dada a represenao com pontos de um endereo de rede como uma string, retorna um inteiro
que representa o valor numrico deste endereo. Endereos podem ter 4 ou 8 bytes de endereamento:
mysql> SELECT INET_ATON("209.207.224.40");
-> 3520061480
O nmero gerado sempre na ordem de bytes da rede; por exemplo o nmero acima calculado
como 209*256^3 + 207*256^2 + 224*256 +40.
iniciado e v para (ou passe por) a posio especificada. Se o slave j passou pela posio especificada, retorna imediatamente.
Se tempo_limite (novo na verso 4.0.10) especificado, ir esperar at que tempo_limite segundos tenham se passado. tempo_limite deve ser maior que 0; zero ou um
tempo_limite negativo significa sem tempo_limite. O valor de retorno o nmero de eventos de log que ele tem que esperar para obter a posio especificada, NULL no caso de erro, ou 1 se o tempo_limite tiver sido excedido.
O comando til para controle de sincronizao mo master/slave.
FOUND_ROWS()
Uma instruo SELECT pode incluir uma clusula LIMIT para restringir o nmero de linhas
que o servidor retorna para um cliente. Em alguns casos, desejvel saber quantas linhas a instruo teria retornado sem o LIMIT, mas sem executar a instruo novamente. Para obter esta
contagem de linhas, inclua uma opo SQL_CALC_FOUND_ROWS na instruo SELECT, ento
chame FOUND_ROWS() loga depois:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM nome_tabela
WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
O segundo SELECT ir retornar um nmero indicando quantas linhas o primeiro SELECT teria
retornado se ele fosse escrito sem a clusula LIMIT. (Se o instruo SELECT anterior no inclui
a opo SQL_CALC_FOUND_ROWS, ento FOUND_ROWS() pode retornar um resultado diferente quando LIMIT usado daquele que no usado).
Note que se voc estiver usando SELECT SQL_CALC_FOUND_ROWS ..., o MySQL tem
que calcular quantos registros existem em todo o conjunto de resultados. No entanto, isto mais
rpido que se voc no utilizar LIMIT, j que o resultado precisa ser enviado ao cliente.
SQL_CALC_FOUND_ROWS e FOUND_ROWS() podem ser teis em situaes em que voc
queira restringir o nmero de registros que uma consulta retorna, mas tambm determinar o nmero de linhas em todo o resultado sem executar a consulta novamente. Um exemplo um
script web que apresenta um display paginado contendo links para as pginas que mostram outras sees de um resultado de busca. Usar FOUND_ROWS() lhe permite determinar quantos outras pginas so necessrias para o resto do resultado.
O uso de SQL_CALC_FOUND_ROWS e FOUND_ROWS() mais complexa para consultas
UNION que para instrues SELECT simples, porque LIMIT pode ocorrer em vrios lugares em
um UNION. Ele pode ser aplicado a instrues SELECT individuais no UNION, ou globais ao
resultado UNION como um todo.
A inteno de SQL_CALC_FOUND_ROWS para UNION que ele deve retornar a contagem das
linhas que seriam retornadas sem um LIMIT global. As consies para uso de
SQL_CALC_FOUND_ROWS com UNION so:
O valor de FOUND_ROWS() exato apenas se UNION ALL for usado. Se UNION sem ALL
for usado, as duplicatas so removidas e o valor de FOUND_ROWS() apenas aproximado.
Se nenhum LIMIT est presente no UNION, SQL_CALC_FOUND_ROWS ignorado e retorna o nmero de linhas na tabela temporria que criada para processar o UNION.
518
COUNT(expr)
Retorna a quantidade de valores no-NULL nos registros recuperados por uma instrucao SELECT:
mysql> SELECT estudante.nome_estudente,COUNT(*)
->
FROM estudante,curso
->
WHERE estudante.id_estudante=curso.id_estudante
->
GROUP BY nome_estudante;
COUNT(*) difere um pouco ao retornar o nmero de registros recuperados, se eles possurem
ou no valores NULL.
COUNT(*) otimizado para retornar muito rpido se SELECT recuoperar registros de uma tabela, nenhuma outra coluna for retornada, e no houver nenhuma clusula WHERE. Por exemplo:
mysql> SELECT COUNT(*) FROM estudente;
Esta otimizaco se aplica apenas a tabelas MyISAM e ISAM, porque uma contagem exata de registros armazenada para estes tipos de tabelas e podem ser acessadas muito rapidamente. Para
mecanismos de armazenamentos transacionais (InnodB, BDB), armazenar um contagem de registros exatos mais problemtico porque mltiplas transaes podem estar ocorrendo, e cada
uma pode afetar a contagem.
COUNT(DISTINCT expr,[expr...])
Retorna a quantidade de regiastros com valores no-NULL diferentes:
mysql> SELECT COUNT(DISTINCT resultados) FROM estudente;
No MySQL voc pode obter o nmero de combinao de expresses distintas que no contm
NULL fornecendo uma lista de expresses. No SQL-99 voc teria que concatenar todas as expresso utilizando COUNT(DISTINCT ...).
AVG(expr)
Retorna o valor mdio de expr:
mysql> SELECT nome_estudante, AVG(nota_teste)
->
FROM estudante
->
GROUP BY nome_estudante;
MIN(expr) , MAX(expr)
Retorna o valor mnimo o u mximo de expr. MIN() e MAX() poder usar uma string como ar519
gumento; nestes casos eles retornam o a string de valor mnimo ou mximo. See Seco 5.4.3,
Como o MySQL Utiliza ndices.
mysql> SELECT nome_estudante, MIN(nota_teste), MAX(nota_teste)
->
FROM estudante
->
GROUP BY nome_estudante;
Em MIN(), MAX() e outras funes de agrupamento o MySQL, atualmente, compara colunas
ENUM e SET pelo seu valor string em vez de faz-lo pela sua posio relativa de string no conjunto. Isto ser retificado.
SUM(expr)
Retorna a soma de expr. Note que se o conjunto de retorno no possuir registros ele retornar
NULL!
GROUP_CONCAT(expr)
Sintaxe completa:
VARIANCE(expr)
520
Retorna a varincia padro de expr (considerando linha como toda a populao, no com uma
amostra; assim ele tem o nmero de linhas como denominador). Esta uma extenso do SQL-99
(disponvel somente a partir da verso 4.1).
STD(expr) , STDDEV(expr)
Retorna o desvio padro de expr (a raiz quadrada de VARIANCE()). Esta uma extenso do
SQL-99. O formato STDDEV() desta funo fornecida para compatibilidade com Oracle.
BIT_OR(expr)
Retorna o resultado da operao binria OR de todos os bits em expr. O calcululo relizado
com preciso de 64 bits (BIGINT).
A funo retortna 0 se no houver registros coincidentes.
BIT_XOR(expr)
Retorna o bitwise XOR de todos os bits em expr. O calculo relizado com preciso de 64-bits
(BIGINT).
A funo retorna 0 se no houver linhas coincidentes.
Esta funo est disponvel a partir do MySQL 4.1.1.
BIT_AND(expr)
Retorna o resultado da operao binria AND de todos os bits em expr. O calcululo relizado
com preciso de 64 bits (BIGINT).
A funo retortna 1 se no houver registros coincidentes.
| 2001 |
3010 |
+------+-------------+
Esta sada mostra o lucro total para cada ano, mas se voc tambm quiser determinar o lucro total
somado em todos os anos, voc deve adicionar os valores adicionais ou executar uma consulta adicional.
Ou voc pode usar o ROLLUP, que fornece os dois nveis de anlise com uma nica consulta. Adicionando um modificador WITH ROLLUP a clusula GROUP BY faz com que a consulta produza outra linha que mostra o total geral de todos os anos:
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 |
4525 |
| 2001 |
3010 |
| NULL |
7535 |
+------+-------------+
A linha de total super-agrupada identificada pelo valor NULL na coluna year.
ROLLUP tem um efeito mais complexo quando h mltiplas colunas GROUP BY. Neste caso, cada
vez que houver um ``break'' (alterao no valor) em qualquer agrupamento, com exceo da ltima
coluna, a consulta produz um linha resumo super-agrupada extra.
Por exemplo, sem ROLLUP, um resumo na tabela sales baseada no year, country e product
pode se parecer com isto:
mysql> SELECT year, country, product, SUM(profit)
-> FROM sales
-> GROUP BY year, country, product;
+------+---------+------------+-------------+
| year | country | product
| SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer
|
1500 |
| 2000 | Finland | Phone
|
100 |
| 2000 | India
| Calculator |
150 |
| 2000 | India
| Computer
|
1200 |
| 2000 | USA
| Calculator |
75 |
| 2000 | USA
| Computer
|
1500 |
| 2001 | Finland | Phone
|
10 |
| 2001 | USA
| Calculator |
50 |
| 2001 | USA
| Computer
|
2700 |
| 2001 | USA
| TV
|
250 |
+------+---------+------------+-------------+
A sada indica os valores resumidos apenas no nvel year/country/product da anlise. Quando ROLLUP adicionado, a consulta produz diversas linhas extras:
mysql> SELECT year, country, product, SUM(profit)
-> FROM sales
-> GROUP BY year, country, product WITH ROLLUP;
+------+---------+------------+-------------+
| year | country | product
| SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer
|
1500 |
| 2000 | Finland | Phone
|
100 |
| 2000 | Finland | NULL
|
1600 |
| 2000 | India
| Calculator |
150 |
| 2000 | India
| Computer
|
1200 |
| 2000 | India
| NULL
|
1350 |
| 2000 | USA
| Calculator |
75 |
| 2000 | USA
| Computer
|
1500 |
522
| 2000 | USA
| NULL
|
1575 |
| 2000 | NULL
| NULL
|
4525 |
| 2001 | Finland | Phone
|
10 |
| 2001 | Finland | NULL
|
10 |
| 2001 | USA
| Calculator |
50 |
| 2001 | USA
| Computer
|
2700 |
| 2001 | USA
| TV
|
250 |
| 2001 | USA
| NULL
|
3000 |
| 2001 | NULL
| NULL
|
3010 |
| NULL | NULL
| NULL
|
7535 |
+------+---------+------------+-------------+
Para esta consulta, adicionar ROLLUP faz com que a sada inclua uma informao resumida nos
qualtro nveis de anlise, no s em um. Aqui est como interpretar a sada ROLLUP:
Seguindo cada conjunto de produtos para um dado ano e pas, um linha de resumo extra produzida mostrando o total para todos os produtos. Estas linhas tm a coluna product atribuda
com NULL.
Seguindo cada conjunto de linhas para um dado ano, uma l;inha resumo extra produzida mostrando o total para todos os pases e produtos. Estas linhas tm as colunas country e products atribudas com NULL.
Finalmente, seguindo todas as outras linhas, um linha resumo extra produzida mostrando o total geral para todos os anos, pases e produtos. Esta linha tem as colunas year, country e
products atribudas com NULL.
cliente. O servidor olha por cada coluna chamada na clusula GROUP BY seguindo aquela mais a
esquerda que tem o valor alterado. Para qualquer coluna no resultado com o nome que uma combinao lxica de qualquer daqueles nomes, seu valor definido com NULL. (Se voc especifica o
agrupamento de colunas pelo nmero da coluna, o servidor identifica quais colunas definir com
NULL pelo nmero.)
Como os valores NULL em linhas super agrupadas so colocadas dentro do resultado como um estgio posterior no processamento da consulta, voc no pode test-los com valores NULL dentro da
prpria consulta. Por exemplo, voc no pode adicionar HAVING product IS NULL a consulta
para eliminar da sada todas as linhas com exceo das agrupadas.
Por outro lado, o valor NULL aparece como NULL no lado do cliente e pode ser testado usando qualquer interface de programao do cliente MySQL.
Uma expresso SELECT pode utilizar um alias usando AS nome_alias. O alias usado como o nome da coluna da expresso e pode ser usado com clusulas ORDER BY ou HAVING. Por
exemplo:
mysql> SELECT CONCAT(primeiro_nome,' ',ultimo_nome) AS nome_completo
FROM minha_tabela ORDER BY nome_completo;
A palavra chave AS opcional quando se utiliza alias em uma expresso SELECT. O exemplo
anterior poderia ser escrito assim:
mysql> SELECT CONCAT(last_name,', ',first_name) full_name
FROM mytable ORDER BY full_name;
Como AS opcional, pode ocorrer um problema se voc esquecer a vrgula entre duas expresses SELECT: O MySQL interpretar o segundo como um nome de alias. Por exemplo, na seguinte instruo, columnb tratada como um nome de alias:
mysql> SELECT columna columnb FROM mytable;
No permitido utilizar um alias de coluna em uma clusula WHERE, pois o valor da coluna pode ainda no ter sido determinado quando a clusula WHERE for executada. See Seco A.5.4,
Problemas com alias.
Voc pode se referir a uma tabela como nome_tabela (dentro do banco de dados atual) ou
como nomebd.nome_tabela para especificar um banco de dados. Voc pode se referir a um
coluna
como
nome_coluna,
nome_tabela.nome_coluna
ou
nomebd.nome_tabela.nome_coluna. Voc no precisa especificar um prefixo nome_tabla ou nomebd.nome_tabela para referncia a uma coluna em uma instruo SELECT a menos a referncia seja ambgua. Veja Seco 6.1.2, Nomes de Banco de dados, Tabela, ndice, Coluna e Alias, para exemplos de ambiguidade que exigem a forma mais explicita de
referncia a coluna.
A partir da verso 4.1.0, voc pode especificar DUAL como um nome de tabela dummy, em situaes onde nenhuma tabela for refernciada. Este um recurso puramente para compatibilidade,
alguns outros servidores exijem esta sintaxe.
mysql> SELECT 1 + 1 FROM DUAL;
-> 2
Pode se definir um alias fazendo referncia a uma tabela utilizando nome_tabela [AS]
nome_alias:
mysql> SELECT t1.nome, t2.salario FROM funcionarios AS t1, info AS t2
->
WHERE t1.nome = t2.nome;
mysql> SELECT t1.nome, t2.salario FROM funcionarios t1, info t2
->
WHERE t1.nome = t2.nome;
Colunas selecionadas para sada podem ser referidas em clusulas ORCER BY e GROUP BY
usando nomes de colunas, alias de colunas ou posies de colunas. As posies de colunas comeam com 1:
mysql> SELECT college, region, seed FROM tournament
->
ORDER BY region, seed;
mysql> SELECT college, region AS r, seed AS s FROM tournament
->
ORDER BY r, s;
mysql> SELECT college, region, seed FROM tournament
->
ORDER BY 2, 3;
Para ordenar inversamente, adicione a palavra-chave DESC (descendente) ao nome da coluna na
clusula ORDER BY na qual voc est ordenando. A ordem padro ascedente; ela pode ser especificada explicitamente usando a palavra-chave ASC.
Na clusula WHERE, voc pode usar qualquer uma das funes suportadas pelo MySQL. Exceto
para funes de agruopamento (resumo) See Seco 6.3, Funes para Uso em Clusulas SE526
LECT e WHERE.
A clusula HAVING pode se referir a qualquer coluna ou alias definido na expresso_select. Ele aplicado no final, pouco antes dos itens serem enviados ao cliente, sem
otimizao. LIMIT aplicada depois de HAVING.) estar na clusula WHERE. Por exemplo, no
escreva isto:
mysql> SELECT nome_col FROM nome_tabela HAVING nome_col > 0;
Escreva assim:
mysql> SELECT nome_col FROM nome_tabela WHERE nome_col > 0;
Na verso 3.22.5 ou posterior, voc tambm pode escrever consultar desta forma:
mysql> SELECT usuario,MAX(salario) FROM usuarios
->
GROUP BY usuario HAVING MAX(salario)>10;
Em verses mais antigas, voc pode escrever desta forma:
mysql> SELECT usuario,MAX(salario) AS soma FROM usuarios
->
group by usuario HAVING soma>10;
No MySQL 4.1.1, GROUP BY permite um modificador WITH ROLLUP. See Seco 6.3.7.2, Modificadores GROUP BY.
HIGH_PRIORITY dar uma prioridade maior ao SELECT do que para uma instruo que
atualizam uma tabela. Voc s deve isto para consultas que sejam rpidas e devam ser feitas
imediatamente. Uma consulta SELECT HIGH_PRIORITY retornar se a tabela est bloqueada para leitura memsmo se houver uma instruo de atualizao que estiver esperando a
liberao da tabela.
SQL_BIG_RESULT pode ser usado com GROUP BY ou DISTINCT para dizer ao otimizador que o conjunto de resultados ter muitas linhas. Neste caso, o MySQL usar diretamente
tabelas temporarias em disco se necessrio. O MySQL tambm ir, neste caso, preferir ordenar fazendo uma tabela temporria com um cahve nos elementos GROUP BY.
SQL_BUFFER_RESULT fora para que o resultado seja colocado em uma tabela temporria. Isto ajuda o MySQL a liberar as travas de tabelas mais cedo e ajudar nos casos onde ele
lev muito tempo para enviar o conjunto de resultado ao cliente.
SQL_SMALL_RESULT, uma opo especifica do MySQL, pode ser usada com GROUP BY
ou DISTINCT para dizer ao otimizador que o conjunto de resultados ser pequeno. Neste
caso, o MySQL usa tabelas temporrias rpidas para armazenar a tabela resultante em vez de
usar ordenao. Na verso 3.23 do MySQL isto no necessrio normalmente.
SQL_CALC_FOUND_ROWS (verso 4.0.0 e acima) diz ao MySQL para calcular quantas linhas haveriam no conjunto de resultados, desconsiderando qualquer clusula LIMIT. O nmero de linhas pode ser recuperado com SELECT FOUND_ROWS(). See Seco 6.3.6.2,
Funes Diversas.
Por favor, note que em nverses anteriores a 4.1.0 isto no funciona com LIMIT 0, o qual
527
SQL_CACHE diz ao MySQL para armazenar o resultado da consulta em um cache de consultas se voc estiver utilizando QUERY_CACHE_TYPE=2 (DEMAND). See Seco 6.9,
Cache de Consultas do MySQL. No caso da consulta com UNIONs e/ou subqueries esta
opo ter efeito se usada em qualquer SELECT da consulta.
Se voc utiliza GROUP BY, os registros de sada sero ordenados de acordo com o GROUP BY
como se voc tivesse um ORDER BY sobre todos os campos no GROUP BY. O MySQL tem expandido a clusula GROUP BY para que voc tambm possa especificar ASC e DESC depois das
colunas chamadas na clusula:
SELECT a,COUNT(b) FROM tabela_teste GROUP BY a DESC
O MySQL tem extendido o uso do GROUP BY para lhe permitir selecionar campos que no esto mencionados na clusula GROUP BY. Se voc no est conseguindo os resultados esperados
ara a sua consulta, leia a descrio de GROUP BY. See Seco 6.3.7, Funes e Modificadores
para Usar com Clusulas GROUP BY.
A partir do MySQL 4.1.1, GROUP BY permite um modificador WITH ROLLUP. See Seco 6.3.7.2, Modificadores GROUP BY.
A clusula LIMIT pode ser usada para restringir o nmero de linhas retornadas pela instruo
SELECT. LIMIT utiliza um ou dois agumebntos numricos, que devem ser constants inteiras.
Com um argumento. o valor especifca o nmero de linhas para retornar do incio do resultado.
Com dois argumentos, o primeiro especifica a posio do primeiro registro a ser retornado e o
segundo especifica o nmero mximo de linhas a retornar. A posio do registro inicial 0 (no
1):
Para ser compatvel com o PostgreeSQL, o MySQL suporta a sintaxe: LIMIT row_count
OFFSET offset.
mysql> SELECT * FROM tabela LIMIT 5,10;
Para recuperar todos os registros de um determinado offset at um fim do resultado voc pode
usar um nmero grande como segundo parmetro:
mysql> SELECT * FROM tabela LIMIT 95,18446744073709551615; # Recupera linhas
Se um dos argumentos dado, ele indica o nmero mximo de linhas a retornar:
mysql> SELECT * FROM tabela LIMIT 5;
rapidamente um tabela de uma mquina servidora. Se voc quiser criar o arquivo resultante em
outra mquina, diferente do servidor, voc no deve usar SELECT ... INTO OUTFILE.
Neste caso voc deve usar algum programa cliente como mysqldump --tab ou mysql -e
"SELECT..." > outfile para gerar o arquivo.
SELECT ... INTO OUTFILE o complemento de LOAD DATA INFILE; a sintaxe para a
parte opes_exportao de uma instruo consiste das mesmas clusulas CAMPOS e LINHAS que so usadas com a instruo LOAD DATA INFILE. See Seco 6.4.8, Sintaxe LOAD DATA INFILE.
No arquivo texto resultante, somente os seguintes coracteres so escritos com o caracter ESCAPE BY:
O caracter ESCAPE BY
Note que qualuqer arquivo criado por INTO OUTFILE e INTO DUMPFILE sero escritos por
todos os usurios no servidor! A razo que o servidor MySQL no pode criar um arquivo que
pertence a qualquer um alm do usurio que o est executando (voc nunca deve executar
mysqld como root). Assim o arquivo tem que poder ser gravado por todos para que voc possa manipular o seu contedo.
Uma clusula PROCEDURE chama um procedimento que devia processar os dados em um resultado. Para um exemplo, veja Seco 14.3.1, Anlise de Procedimento.
A condicional ON qualquer condio da forma que pode ser usada em uma clusula WHERE.
A clusula USING (lista_colunas) nomeia uma lista de colunas que devem existir em
ambas as tabelas. As seguintes duas clusulas so semanticamente idnticas:
a LEFT JOIN b USING (c1,c2,c3)
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
Um NATURAL [LEFT] JOIN de duas tabelas definido para ser semanticamente equivalente
a um INNER JOIN ou um LEFT JOIN com uma clusula USING que nomeia todas as colunas que exitem em ambas as tabelas.
INNER JOIN e , (vrgula) so semanticamente equivalentes na ausncia da condio join: ambos produziro um produto Cartesiano entre as tabelas especificadas. (isto , todos os registros
530
RIGHT JOIN funciona de forma anloga a um LEFT JOIN. Para manter o cdigo portvel
entre banco de dados, recomendado usar LEFT JOIN em vez de RIGHT JOIN.
STRAIGHT_JOIN identico a JOIN, exceto pelo fato de que a tabela de esquerda sempre lida antes da tabela da direita. Ele pode ser usado para aqueles casos (poucos) onde o otimizador
join coloca as tabelas na ordem errada.
Como na verso 3.23.12, voc pode dar sugestes sobre qual ndice o MySQL deve us quando
retornar informaes de uma tabela. Isto til se EXPLAIN mostar que o MySQL est utilizando o ndice errado da lista de ndices possveis. Especificando USE INDEX
(lista_indice), voc pode dizer ao MySQL para usar somente um dos ndices possveis
para encontrar registros em uma tabela. A sintaxe alternativa IGNORE INDEX
(lista_indice) pode ser usado para dizer ao MySQL para no utilizar ndices particulares.
Na verso 4.0.9 do MySQL voc tambm pode utilizar FORCE INDEX. Ele funciona como
USE INDEX (key_list) mas com assume que uma varredura na tabela MUITO cara. Em
outras palavras, uma varredura na tabela s ser feita se no houver modo de uitlizar um dos ndices fornecidos para se enecontrar registros no tabela.
USE/IGNORE KEY so sinnimos de USE/IGNORE INDEX.
Nota: USE/IGNORE/FORCE INDEX afeta apenas os ndices usados quando o MySQL decide como encontrar registros na tabela e como fazer a ligao. Ele no tem efeito se um ndice ser usado
ao resolver um ORDER BY ou GROUP BY.
Alguns exemplos:
mysql>
mysql>
mysql>
mysql>
->
mysql>
->
mysql>
->
SELECT
SELECT
SELECT
SELECT
*
*
*
*
See Seco 5.2.7, Como o MySQL Otimiza LEFT JOIN e RIGHT JOIN.
531
Se voc no utilzar a palavra-chave ALL para o UNION, todas as linhas retornadas sero nicas, como se voc tivesse utilizado um DISTINCT para o resultado final. Se voc especificar ALL, voc
obter todos os regitros encontrados em todas as instrues SELECT.
Se voc quiser usar um ORDER BY para o resultado UNION final, voc deve utilizar parenteses:
(SELECT a FROM nome_tabela WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM nome_tabela WHERE a=11 AND B=2 ORDER BY a LIMIT 10)
ORDER BY a;
elas permitem consultas que esto estruturadas assim possvel isolar cada parte de uma instruo,
elas fornecem modos alternativos de realizar operaes que, de outra forma, exigiriam joins e
unions complexos,
elas so, na opinio de muitas pessoas, legveis. De fato, foi a inovao das subqueries que deu
s pessoas a idia original do nome SQL ``Structured Query Language''.
Com verses MySQL anteriores era necessrio evitar ou contornar as subqueries, mas as pessoas
que comeam a escrever cdigo agora descobriro que subqueries so uma parte muito til do pacote de ferramentas.
Aqui est uma instruo exemplo que mostra o ponto principal sobre a sintaxe de subquery como especificado pelo SQL padro e suportado no MySQL.
DELETE FROM t1
WHERE s11 > ANY
(SELECT COUNT(*) /* no hint */ FROM t2
WHERE NOT EXISTS
(SELECT * FROM t3
WHERE ROW(5*t2.s1,77)=
(SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM
(SELECT * FROM t5) AS t5)));
Para as verses do MySQL anteriores a 4.1, a maioria da subqueries podem ser reescritas com sucesso usando join e outros mtodos. See Seco 6.4.2.11, Rewriting Subqueries for Earlier MySQL
Versions.
Na sua forma mais simples (a subquery scalar o oposto das subqueries de row ou table que ser
discutido posteriormente), uma subqquery um opernado simples. Assim voc pode us-la se um
valor de uma coluna ou literal permitido, e voc pode esperar que eles tenham certas caractersticas que todos os operandos possuem: um tipo de dados, um tamanho, um indicador para informar se
ele pode ser NULL, etc. Por exemplo:
CREATE TABLE t1 (s1 INT, s2 CHAR(5) NOT NULL);
SELECT (SELECT s2 FROM t1);
The subquery in the above SELECT has a data type of CHAR, a length of 5, a character set and collation equal to the defaults in effect at CREATE TABLE time, and an indication that the value in the
column can be NULL. In fact almost all subqueries can be NULL, because if the table is empty -- as
in the example -- then the value of the subquery will be NULL. There are few restrictions.
A subquery's outer statement can be any one of: SELECT, INSERT, UPDATE, DELETE, SET,
or DO.
A subquery can contain any of the keywords or clauses that an ordinary SELECT can contain:
DISTINCT, GROUP BY, ORDER BY, LIMIT, joins, hints, UNIONs, comments, functions, and
so on.
So, when you see examples in the following sections that contain the rather Spartan construct
(SELECT column1 FROM t1), imagine that your own code will contain much more diverse
and complex constructions.
For example, suppose we make two tables:
CREATE
INSERT
CREATE
INSERT
533
At one time the only legal place for a subquery was on the right side of a comparison, and you might
still find some old DBMSs which insist on that.
Here is an example of a common-form subquery comparison which you can't do with a join: find all
the values in table t1 which are equal to a maximum value in table t2.
SELECT column1 FROM t1
WHERE column1 = (SELECT MAX(column2) FROM t2);
Here is another example, which again is impossible with a join because it involves aggregating for
one of the tables: find all rows in table t1 which contain a value which occurs twice.
SELECT * FROM t1
WHERE 2 = (SELECT COUNT(column1) FROM t1);
Suppose that there is a row in table t1 containing {10}. The expression is TRUE if table t2 contains {-5,0,+5} because all three values in t2 are less than 10. The expression is FALSE if table t2
contains {12,6,NULL,-100} because there is a single value in table t2 -- 12 -- which is greater than
10. The expression is UNKNOWN if table t2 contains {0,NULL,1}.
Finally, if table t2 is empty, the result is TRUE. You might think the result should be UNKNOWN,
but sorry, it's TRUE. So, rather oddly,
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);
is TRUE when table t2 is empty, but
SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2);
is UNKNOWN when table t2 is empty. In addition,
SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);
is UNKNOWN when table t2 is empty. In general, tables with NULLs and empty tables are edge cases -- when writing subquery code, always consider whether you have taken those two possibilities
into account.
If a subquery returns any values at all, then EXISTS <subquery> is TRUE, and NOT EXISTS
<subquery> is FALSE. For example:
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
Traditionally an EXISTS subquery starts with SELECT * but it could begin with SELECT 5 or
SELECT column1 or anything at all -- MySQL ignores the SELECT list in such a subquery, so it
doesn't matter.
For the above example, if t2 contains any rows, even rows with nothing but NULL values, then the
EXISTS condition is TRUE. This is actually an unlikely example, since almost always a [NOT]
EXISTS subquery will contain correlations. Here are some more realistic examples.
Example: What kind of store is present in one or more cities?
SELECT DISTINCT store_type FROM Stores
WHERE EXISTS (SELECT * FROM Cities_Stores
WHERE Cities_Stores.store_type = Stores.store_type);
Example: What kind of store is present in no cities?
SELECT DISTINCT store_type FROM Stores
WHERE NOT EXISTS (SELECT * FROM Cities_Stores
WHERE Cities_Stores.store_type = Stores.store_type);
Example: What kind of store is present in all cities?
SELECT DISTINCT store_type FROM Stores S1
WHERE NOT EXISTS (
SELECT * FROM Cities WHERE NOT EXISTS (
SELECT * FROM Cities_Stores
WHERE Cities_Stores.city = Cities.city
AND Cities_Stores.store_type = Stores.store_type));
The last example is a double-nested NOT EXISTS query -- it has a NOT EXISTS clause within a
NOT EXISTS clause. Formally, it answers the question ``does a city exist with a store which is not
in Stores?''. But it's easier to say that a nested NOT EXISTS answers the question ``is x TRUE for
all y?''.
The normal use of row constructors, though, is for comparisons with subqueries that return two or
more columns. For example, this query answers the request: ``find all rows in table t1 which are duplicated in table t2'':
SELECT column1,column2,column3
FROM t1
WHERE (column1,column2,column3) IN
(SELECT column1,column2,column3 FROM t2);
SQLSTATE = 42000
Message = "This version of MySQL doesn't yet support
'LIMIT & IN/ALL/ANY/SOME subquery'"
This means that
SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)
will not work, but only in some early versions, such as MySQL 4.1.1.
It's okay to use a subquery for assignment within an UPDATE statement, since subqueries are legal
in UPDATE and in DELETE statements as well as in SELECT statements. However, you cannot use
the same table, in this case table t1, for both the subquery's FROM clause and the update target.
Usually, failure of the subquery causes the entire statement to fail.
Development is ongoing, so no optimization tip is reliable for the long term. Some interesting tricks
that you might want to play with are:
Using subquery clauses which affect the number or order of the rows in the subquery, for example
SELECT * FROM t1 WHERE t1.column1 IN
(SELECT column1 FROM t2 ORDER BY column1);
SELECT * FROM t1 WHERE t1.column1 IN
(SELECT DISTINCT column1 FROM t2);
SELECT * FROM t1 WHERE EXISTS
(SELECT * FROM t2 LIMIT 1);
The above tricks may cause programs to go faster or slower. Using MySQL facilities like the
BENCHMARK() function, you can get an idea about what helps in your own situation. Don't worry
too much about transforming to joins except for compatibility with older versions.
Some optimizations that MySQL itself will make are:
1.
MySQL will execute non-correlated subqueries only once, (use EXPLAIN to make sure that a
given subquery really is non-correlated),
2.
MySQL will rewrite IN/ALL/ANY/SOME subqueries in an attempt to take advantage of the possibility that the select-list columns in the subquery are indexed,
3.
4.
There is a chapter titled ``How MySQL Transforms Subqueries'' in the MySQL Internals Manual,
which you can find by downloading the MySQL source package and looking for a file named internals.texi.
The second option is to use a procedural programming language (such as Perl or PHP) to submit
a SELECT query to obtain the primary keys for the records to be deleted, and then use these values to construct the DELETE statement (DELETE FROM ... WHERE ... IN (key1,
key2, ...)).
The third option is to use interactive SQL to construct a set of DELETE statements automatically, using the MySQL extension CONCAT() (in lieu of the standard || operator). For example:
SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', "'", tab1.pkid, "'", ';')
FROM tab1, tab2
WHERE tab1.col1 = tab2.col2;
You can place this query in a script file and redirect input from it to the mysql command-line
interpreter, piping its output back to a second instance of the interpreter:
shell> mysql --skip-column-names mydb < myscript.sql | mysql mydb
MySQL Server 4.0 supports multiple-table DELETEs that can be used to efficiently delete rows based on information from one table or even from many tables at the same time. Multiple-table UPDATEs are also supported from version 4.0.
or
or
INSERT insere novos registros em uma tabela existente. A forma INSERT ... VALUES da instruo insere registros baseado em valores especificados explicitamente. A forma INSERT ...
SELECT insere linhas selecionadas de outra(s) tabela(s). A forma INSERT ... VALUES com listas de mltiplos valores suportado a partir da verso 3.22.5. A sintaxe nome_coluna=expresso suportada a partir da vero 3.22.10 do MySQL.
nome_tabela a tabela na qual as linhas sero inseridas. A lista de nome das colunas ou a clusula SET indica para quais colunas a instruo especifica valor:
541
Se voc no especificar a lista de colunas para INSERT ... VALUES ou INSERT ...
SELECT, os valores para todas as colunas na tabela devem ser fornecidos na lista VALUES()
ou pelo SELECT. Se voc no souber a ordem das colunas nas tabelas, use DESCRIBE nome_tabela para descobrir.
Qualquer coluna que no tiver o valor fornecido explicitamente assumir o seu valor padro. Por
exemplo, se voc especificar uma lista de colunas que no definem todas as coolunas na tabela,
s colunas no definidas sero atribudos o seu valor padro. Atribuio de valor padro definido em Seco 6.5.3, Sintaxe CREATE TABLE.
Voc tambm pode utilizar a palavra-chave DEFAULT para atribuir o valor padro a uma coluna
(Novo na verso 4.0.3. do MySQL). Fica mais fcil de se escrever instrues INSERT que atribuem valor a apenas algumas colunas porque ele permite que voc evite escrever uma lista VALUES() incompleta (uma lista que no inclu um valor para cada coluna da tabela). De outa forma, voc teria que escrever a lista de nomes de colunas correspondentes a cada valor na lista
VALUES().
MySQL sempre tem uma valor padro para todos os campos. Isto algo imposto pelo MySQL
para estar apto a funcionar com tabelas transacionais e no transcaionais.
Nossa viso que a verificao do contedo dos campos deve ser feita pela application and not
in the database server.
Uma expresso pode se referir a qualquer coluna que tenha sida definaida anteriormente na
lista de valores. Por exemplo, voc pode dizer:
mysql> INSERT INTO nome_tabela (col1,col2) VALUES(15,col1*2);
Mas no:
mysql> INSERT INTO nome_tabela (col1,col2) VALUES(col2*2,15);
Se voc especificar a palavra chave DELAYED, o servidor coloca a linha ou linhas a serem inseridas em um buffer, e o cliente que envia a instruo INSERT DELAYED ento pode contiuar.
Se a tabela est ocupada, o servidor guarda a linha. Quando a tabela fica livre, ele comea a inserir linhas, verificando peridicamente para ver se h novos pedidos de leitura para a tabela. Se
houver, a fila de linhas atrasadas suspensa at que a tabela fique livre de novo.
Se voc especificar a palavra-chave IGNORE em um INSERT com muitas linhas, quqlquer linha
que duplicar uma chave PRIMARY ou UNIQUE existente em uma tabela so ignorados e no so
inseridos. Se voc no especificar IGNORE, a insero abortada se houver quqlquer linhq que
duplique um valor de uma chave existente. Voc pode determinar com funo mysql_info()
da API C quantas linhas foram inseridas nas tabelas.
Se voc especificar se uma clusula ON DUPLICATE KEY UPDATE (noca no MySQL 4.1.0),
e uma linha que causasse a duplicao de um valor fosse inserida em uma chave PRIMARY ou
UNIQUE, um UPDATE da linha antiga seria realizado. Por exemplo, o comando:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
542
no caso da coluna a ser declarada como UNIQUE e ja existir o valor 1, o exemplo acima seria
idntico a
mysql> UPDATE table SET c=c+1 WHERE a=1;
Nota: se a coluna b tambm for nica, o comando UPDATE seria escrito como
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
e se a=1 OR b=2 casasse com diversas linhas, somente uma linha ser atualizada! em geral,
deve-se tentar evitar utilizar a clusula ON DUPLICATE KEY em tabelas com mltiplas chaves
UNIQUE.
Desde o MySQL 4.1.1 pode-se utilizar a funo VALUES(nome_coluna) para se referir ao
valor da coluna na parte INSERT do comando INSERT ... UPDATE - que o valor que seria inserido se no houvesse conflitos de chaves duplicadas. Esta funo especialmente til em
inseres de mltiplas linhas. Naturalmente a funo VALUES() s tem sentido em um comando INSERT ... UPDATE e retorna NULL no caso de outros comandos.
Exemplo:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
O camondo acima e idntico a
mysql>
->
mysql>
->
Se MySQL foi configurado usando a opo DONT_USE_DEFAULT_FIELDS, instrues INSERT geram um erro a menos que voc especifique valores explicitamete para todas as colunas
que exigem um valor no-NULL. See Seco 2.3.3, Opes tpicas do configure .
Voc pode encontrar o valor usado por uma coluna AUTO_INCREMENT com a funo
mysql_insert_id. See Seco 12.1.3.32, mysql_insert_id().
Se voc utilizar instrues INSERT ... SELECT ou INSERT ... VALUES com lista de valores mltiplos, voc pode utilizar a funo mysql_info() da API C para obter informao sobre a
consulta. O formato da string de informao mostrado aqui:
Records: 100 Duplicates: 0 Warnings: 0
Duplicates indica o nmero de linhas que no puderam ser inseridas porque duplicariam alguns
valores de ndices nicos existentes. Warnings indica o nmero de tentativas de insero de um
valor em uma coluna que de alguma forma estava problematico. Avisos (Warnings) podem ocorrer
sob qualquer uma das seguintes condies:
Inserir NULL em uma coluna declarada com NOT NULL. A coluna definida com o seu valor
padro.
Definir uma coluna numrica com um valor que esteja fora da faixa permitida. O valor revertido para final apropriado da faixa.
543
Definir uma coluna numrica com um valor como '10.34 a'. O lixo no final eliminado e a
parte numrica restante inserida. Se o valor no fizer sentido como um nmero, atribuido 0 a
coluna.
Inserir uma string em uma coluna CHAR, VARCHAR, TEXT, ou BLOB e que exceda o tamanho
mximo da coluna. O valor truncado para o tamanho mximo da coluna.
Inserir um valor em uma coluna date ou time e que seja invlido para o tipo da coluna. A coluna
preenchida com o valor de zero apropriado para o tipo.
Antes do MySQL 4.0.1, INSERT ... SELECT operava implicitamente em modo IGNORE. A
partir do MySQL 4.0.1, voc deve especificar IGNORE explicitamente para ignorar registros que
causaria violao de chave duplicada.
Antes do MySQL 4.0.14, a tabela alvo da instruo INSERT no pode aparecer na clusula
FROM da parte SELECT da consulta. Esta limitao deixada na verso 4.0.14.
Em programas C, Voc pode usar a funo mysql_info() da API C para obter informao
sobre a consulta. See Seco 6.4.3, Sintaxe INSERT.
Para assegurar que o log binrio possa ser usado para re-criar a tabela original, MySQL no permitir inseres concorrentes em um INSERT ... SELECT.
Voc tambm pode utilizar REPLACE em vez de INSERT para sobrescrever linhas antigas. REPLACE a contra parte para INSERT IGNORE no tratamento de novas linhas contendo valores de
chave nicos que duplicam linhas antigas: As novas linhas so usadas para substituir as linhas antigas em vez de descart-las.
Quando uma thread executa uma instruo DELAYED em uma tabela, uma thread handler criada para processar todas as instrues DELAYED para a tabela, se tal handler ainda no existir.
A thread verifica se o handler j adquiriu uma trava DELAYED; se no, ele diz a thread handler
para faz-lo. A trava DELAYED pode ser obtida mesmo se outras threads tiver uma trava de
LEITURA ou ESCRITA na tabela. De qualquer forma, o handler ir esperar por todas as travas
ALTER TABLE ou FLUSH TABLES para se assegurar que a estrutura da tabela est atualizada.
A thread executa a instruo INSERT, mas em vez de escrever a linha na tabela, ela pe uma
cpia da linha final na fila que gerenciada pela thread handler. Quaisquer erros de sintaxe so
notificados pela thread e relatadas ao programa cliente.
O log binrio atualizado pela thread handler quando a linha inserida na tabela. No caso de insero de mltiplas linhas, o log binrio atualizado quando a primeira linha inserida.
Quando o handler no tiver mais linhas na fila, a tabela destravada. Se nunhum comando INSERT DELAYED novo recebido dentro de delayed_insert_timeout segundos, o handler termina.
Se mais que delayed_queue_size esto pendentes em uma fila handler especfica, a thread
requisitando INSERT DELAYED espera at que haja espa na fila. Isto feito para assegurar
que o servidor mysqld no utilize toda a memria rea de memria de atraso.
A thread handler ir aparecer na lista de processos do MySQL process list com delayed_insert na coluna Command. Ela ser finalizada se voc executar um comando FLUSH
TABLES ou mat-la com KILL thread_id. No entanto, primeiro ela armazenar todas as linhas enfileiradas na tabela antes de sair. Durante este tempo ela no aceitar nenhum comando
INSERT novo da outra thread. Se voc executar um comando INSERT DELAYED depois disto,
uma nova thread handler ser criada.
Note que o mostrado acima significa que o comando INSERT DELAYED tem prioridade maior
que um comando INSERT normal se j houver um handler INSERT DELAYED em execuo!
Outro comando de atualizao ter que esperar at que a fila INSERT DELAYED esteja vazia,
algum finalize a thread handler (com KILL thread_id), ou algum execute FLUSH TABLES.
Significado
545
Delayed_insert_threads
Delayed_writes
Not_flushed_delayed_
rows
Voc pode visualizar estas variveis com a instruo SHOW STATUS ou executando um comando mysqladmin extended-status.
Note que INSERT DELAYED mais lento que um INSERT normal se a tabela no estiver em uso.
Tambm h uma sobrecarga adicional para o servidor tratar um thread separada para cada tabela na
qual voc utiliza INSERT DELAYED. Isto significa que voc s deve usar INSERT DELAYED
quando voc estiver certo de necessita dele!
546
Antes do MySQL 4.0.13, LIMIT uma restrio que afeta as linhas. A instruo para assim que
altera row_count linhas que satisfaam a clusula WHERE.
Da verso 4.0.13 em diante, LIMIT uma restrio de linhas correspondentes. A instruo para
assim que ela encontrar row_count linhas que satisfaam a clusula WHERE, tendo elas sido
alteradas ou no.
Se uma clusula ORDER BY utilizada (disponvel no MySQL 4.0.0), as linhas sero atualizadas
nesta ordem. Isto s util em conjunto com LIMIT.
A partir da MySQL Verso 4.0.4, voc tambm pode realizar operaes UPDATE que cobrem mltiplas tabelas:
UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
O exemplo mostra um inner join usando o operador de vrgula, mas instrues UPDATE multi-tabelas podem usar qualquer tipo de join permitida na instruo SELECT, como LEFT JOIN.
Nota: voc no pode utilizar ORDER BY ou LIMIT com multi-tabelas UPDATE.
547
A velocidade das operaes de deleo tambm pode ser afetadas pelos fatores discutidos em Seco 5.2.12, Performance das Consultas que Utilizam DELETE.
A opo IGNORE faz com que o MySQL ignore todos os erros durente o processo de deleo dos
registros. Erros encontrados durante o estgio de anlise so processados da maneira comum. Erros
que so ignorados devido ao uso desta opo so retornados como aviso. Esta opo aparece pela
primeira vez na verso 4.1.1.
Em tabelas MyISAM, registros deletados so mantidos em uma lista encadeada e operes INSERT
subsequentes reutilizam posies de registros antigos. Para recuperar espeos no utilizados e reduzir o tamanho do arquivo, utilize a instruo OPTIMIZE TABLE ou o utiliztrio myisamchk para
reorganizar as tabelas. OPTIMIZE TABLE mais fcil, mas myisamchk mais rpido. Veja Seco 4.6.1, Sintaxe de OPTIMIZE TABLE e Seco 4.5.6.10, Otimizao de Tabelas.
O primeiro formato de delo de multi-tabelas suportado a partir do MySQL 4.0.0. O segundo formato de deleo multi-tabelas suportado a partir do MySQL 4.0.2.
A idia que apenas linhas coincidentes da tabelas listadas antes de FROM ou antes da clusula
USING so deletadas. O efeito que voc pode deletar l;inhas de muitas tabelas ao mesmo tempo e
tambm ter tabelas adicionais que so utilizadas para busca.
O .* depois do nome da tabela existe apenas para ser compatvel com o Access:
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
ou
DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
No cso acima ns deletamos linhas coincidente apenas na tabela t1 e t2.
O exemplo mostra um inner join usando o operador de vrgula, mas instrues UPDATE multi-tabelas podem usar qualquer tipo de join permitida na instruo SELECT, como LEFT JOIN.
Se uma clusula ORDER BY utilizada (disponvel no MySQL 4.0.0), as linhas sero deletadas naquela ordem. Isto s til se usado em conjunto com LIMIT. Por exemplo:
DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp
LIMIT 1
Isto ir deletar as entradas antigas (por timestamp) onde as linhas casam com a clusula WHERE.
A opo especfica do MySQL LIMIT row_count para DELETE diz ao servidor o nmero mximo de linhas a serem deletadas antes do controle retornar ao cliente. Isto pode ser usado para assegurar que uma comando DELETE especfico mo tomar muito tempo, Voc pode simplesmente repetir o comando DELETE at que o nmero de linhas afetadas seja menor que o valor LIMIT.
No MySQL 4.0, voc pode especificar mltiplas tabelas na instruo DELETE para deletar linhas de
uma ou mais tabelas dependendo de uma condio particular em vrias tabelas. No entanto voc no
pode utilizar ORDER BY ou LIMIT em uma multi-tabela DELETE.
548
Operaes truncate apagam e recriam a tabela, o que muito mais rpido que deletar registros
um a um.
Operaes truncate no so seguras a transao; voc irobter um erro se voc tiver uma transao ativa ou ativar um travamento de tabela.
Uma vez que o arquivo de definio nome_tabela.frm deja vlido, a tabela pode ser recriada deta forma, mesmo se o arquivo de dados ou de ndice estiver corrompido.
TRUNCATE uma extenso Oracle SQL. Esta instruo foi adicionada no MySQL 3.23.28, embora
da verso 3.23.28 a 3.23.32, a palavra chave TABLE deva ser omitida.
REPLACE funciona exatamente como o INSERT, exceto que se um registro antigo na tabela tem o
mesmo valor que um novo registro em um ndice UNIQUE ou PRIMARY KEY, o registro antigo
deletado antes que o novo registro seja inserido. See Seco 6.4.3, Sintaxe INSERT.
Em outras palavras, voc no pode acessar os valores do registro antigo em uma instruo REPLACE. Em algumas verses antigas do MySQL aparentemente voc podia fazer isto, mas era um bug
que j foi arrumado.
Par aestar apto a utilizar REPLACE voc deve ter privilgios INSERT e DELETE para a tabela.
Quando voc utilizar um comando REPLACE, mysql_affected_rows() retornar 2 se a nova
linha substituir uma linha antiga. Isto porque uma linha foi inserida depois que a linha duplicada
foi deletada.
Este fato torna fcil determinar se REPLACE adicionou ou subsitituiu uma linha: verifique se o valor de linhas afetadas 1 (adicionado) ou 2 (substituido).
Note que a menos que a tabela utilize ndices UNIQUE ou PRIMARY KEY, utilizar um comando
REPLACE replace no faz sentido. Ele se torna equivalente a um INSERT, porque no existe ndice
a ser usado para determinar se uma nova linha duplica outra.
Seqgue aqui o algoritmo usado em mais detalhes: (Ele tambm usado com LOAD DATA ...
REPLACE.
- Insere a linha na tabela
- Enquanto ocorrer erro de chave duplicada para chaves primria ou nica
- Reverte as chaves alteradas
- Le as linha conflitantes da tabela atravs do valor da chave duplicada
- Deleta as linhas conflitantes
- Tenta inserir o chave primria e nica original na rvore
Se um nome de arquivo sem nenhum componente dado, o servidor procura pelo arquivo no diretorio de banco de dados do banco de dados atual.
550
Note que estas regras significam que um arquivo chamado ./myfile.txt lido no diretrio de
dados do servidor, enquanto um arquivo chamado myfile.txt l o diretrio de dados do naco de
dados atual. Por exemplo, a seguinte instruo LOAD DATA l o arquivo data.txt do diretrio
de dados de db1 pois db1 o banco de dados atual, mesmo que a instruo carrega explicitamente
o arquivo em uma tabela no banco de dados db2:
mysql> USE db1;
mysql> LOAD DATA INFILE "data.txt" INTO TABLE db2.my_table;
As palavras-chave REPLACE e IGNORE controlam o tratamento de entrada de registros que duplicam linhas existentes em valores de chave nica.
Se voc especificar REPLACE, as linhas inseridas substituiro as linhas existentes (em outras palavras, linhas que tiverem o mesmo valor de um ndice primrio ou nico como linhas existentes). See
Seco 6.4.7, Sintaxe REPLACE.
Se voc especificar IGNORE, registros inseridos que duplicam uma linha existente em um valor de
chave nica ser ignorados. Se voc no especificar nenhuma das opes, o comportamento depende de se a palavra chave LOCAL especificada ou no. Sem LOCAL, um erro ocorre quando um valor de chave duplicada encontrado, e o resto do arquivo texto ignorado. Com LOCAL o comportamento padro o mesmo de quando IGNORE for especificado, isto porque o servidor no tem
como parar no meio da operao.
Se voc quiser ignorar as restries de chaves estrangeiras durante a carga voc pode faze SET
FOREIGN_KEY_CHECKS=0 antes de executar LOAD DATA.
Se voc utiliza LOAD DATA INFILE em uma tabela MyISAM vazia, todos os ndices no-nicos
so criados em um batch separado (como em REPAIR). Isto normalmente torna LOAD DATA INFILE muito mais rpido quando voc tem diversos ndices. Normalmente isto muito rpido mas
em casos extremos voc pode tornar o ndice mais rpido ainda desligando-os com ALTER TABLE
.. DISABLE KEYS e usando ALTER TABLE .. ENABLE KEYS para recriar os ndices. See
Seco 4.5.6, Utilizando myisamchk para Manuteno de Tabelas e Recuperao em Caso de Falhas.
LOAD DATA INFILE o complemento de SELECT ... INTO OUTFILE. See Seco 6.4.1,
Sintaxe SELECT . Para gravar dados de uma tabela em um arquivo, use SELECT ... INTO
OUTFILE. Para ler o arquivo de volta em uma tabela, use LOAD DATA INFILE. A sintaxe das
clusulas FIELDS e LINES a mesma para ambos os comandos. Ambas as clusulas so opicionais, mas FIELDS deve preceder LINES se ambos so especificados.
Se voc especificar uma clusula FIELDS, cada uma das subclusulas (TERMINATED BY,
[OPTIONALLY] ENCLOSED BY, e ESCAPED BY) tambm so opicionais, exceto pelo fato de
que voc deve especificar pelo menos uma delas.
Se voc no especificar uma clusula FIELDS, o padro o mesmo que se voc tivesse escrito isto:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
Se voc no especificar uma clusula LINES, o padro o mesmo que se voc tivesse escrito isto:
LINES TERMINATED BY '\n'
Nota: Se voc gerou o arquivo texto no Windows, voc deve alterar o mostrado acima para: LINES
TERMINATED BY '\r\n' j que o Windows utiliza dois caracteres como um terminador de linha. Alguns programas como wordpad, pode usar \r como terminador de linha.
Se todas as linas que voc deseja ler tem um prefixo comum que voc quer saltar, voc pode usar
LINES STARTING BY prefix_string.
Em outras palavras, o padro faz com que LOAD DATA INFILE funcione da seguinte maneira ao
se ler uma entrada:
551
Se LINES STARTING BY prefix for usado, l at que o prefixo seja encontrado e comea
a ler o caracter seguinte ao prefixo. Se a linha no inclui o prefico e;a ser saltada.
Interprete a ocorrncia de tabulaes, novas linhas ou '\' precedidos por '\' como caracteres literias que so parte dos valores dos campos.
Inversamente, os padres fazem SELECT ... INTO OUTFILE funcionar da seguinte forma ao
escrever as sadas:
Utilize '\' para considerar como parte dos campos instncias de tabulao, nova linha ou '\' que
estejam dentro dos valores dos campos.
Note que para escrever FIELDS ESCAPED BY '\\', voc deve especificar duas barras invertidas para que o valor seja lido como uma nica barra invertida.
A opo IGNORE nmero LINES pode ser utilizado para ignorar linhas no inicio do arquivo.
Por exemplo, voc pode usar IGNORE 1 LINES para saltar uma linha de cabealho contendo nomes de colunas:
mysql> LOAD DATA INFILE "/tmp/file_name" INTO TABLE test IGNORE 1 LINES;
Quando voc utiliza SELECT ... INTO OUTFILE em conjunto com LOAD DATA INFILE
para escrever os dados de um banco de dados em um arquivo e ento ler o arquivo de volta no banco
de dados posteriormente, as opes para tratamento de linhas e campos para ambos os comandos devem coincidir. Seno, LOAD DATA INFILEno ir interpretar o contedo do arquivo de forma
apropriada. Suponha que voc utilize SELECT ... INTO OUTFILE para escrever um arquivo
com os campos separados por vrgulas:
mysql> SELECT * INTO OUTFILE 'data.txt'
->
FIELDS TERMINATED BY ','
->
FROM ...;
Para ler o arquivo delimitado com vrgula de volta, a instruo correta seria:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
->
FIELDS TERMINATED BY ',';
Se voc tentasse ler do arquivo com a instruo abaixo, no iria funcionar pois ela instrui LOAD
DATA INFILE a procurar por tabulaes entre campos:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
->
FIELDS TERMINATED BY '\t';
O resultado desejado que cada linha de entrada fosse interpretada como um nico campo.
LOAD DATA INFILE pode ser usado para ler arquivos obtidos de fontes externas. Por exemplo,
552
um arquivo no formato dBASE ter campos separados por vrgulas e entre aspas duplas. Se as linhas
no arquivo so terminadas por com uma nova linha, o comando mostardo aqui ilustra as opes do
tratamento de campos e linhas que voc usaria pra carregar o arquivo. the file:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE nome_tabela
->
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
->
LINES TERMINATED BY '\n';
Qualquer uma das opes de tratamento de campos e linhas podem especificar uma string vazia
(''). Se no for vazio, os valores de FIELDS [OPTIONALLY] ENCLOSED BY e FIELDS
ESCAPED BY devem ser um caracter simples. Os valores de FIELDS TERMINATED BY e LINES TERMINATED BY podem ser mais de uma caracter. Por exemplo, para escrever linhas terminadas pelos par retorno de carro/alimentao de linha, ou para ler um arquivo contendo tais linhas,
especifique uma clusula LINES TERMINATED BY '\r\n'.
Por exemplo, para ler um arquivo de piadas, que so separadas com uma linha de %%, em uma tabela
SQL, voc pode fazer:
CREATE TABLE jokes (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joke TEXT
NOT NULL);
LOAD DATA INFILE "/tmp/jokes.txt" INTO TABLE jokes FIELDS TERMINATED BY ""
LINES TERMINATED BY "\n%%\n" (joke);
FIELDS [OPTIONALLY] ENCLOSED BY controla a citao dos campos. Para saida (SELECT
... INTO OUTFILE), se voc omitir a palavra OPTIONALLY, todos os campos estaro entra o
caracter ENCLOSED BY. Um exemplo de tal sada (usando vrgula como delimitador de campo)
mostrado abaixo:
"1","a
"2","a
"3","a
"4","a
string","100.20"
string containing a , comma","102.20"
string containing a \" quote","102.20"
string containing a \", quote and comma","102.20"
string",100.20
string containing a , comma",102.20
string containing a \" quote",102.20
string containing a \", quote and comma",102.20
Note que a ocorrncia de caracter ENCLOSED BY dentro do valor do campo indicado colocando
um caracter ESCAPED BY antes dele. Note tambm que se voc especificar um valor ESCAPED
BY vazio, possvel gerar sadas que no podero ser lidas aprorpiadamente por LOAD DATA INFILE. Por exemplo, a sada mostrada seria apareceria como a seguir se o caracter de escape fosse
vazio. Observe que o segundo campo na quarta linha contm uma vrgula seguida de aspas, o que
(erroneamente) parece terminar o campo:
1,"a
2,"a
3,"a
4,"a
string",100.20
string containing a , comma",102.20
string containing a " quote",102.20
string containing a ", quote and comma",102.20
Para entrada, o caracter ENCLOSED BY, se presente, ser eliminado do fim dos valores dos campos. (Isto verdade se OPTIONALLY for especificado; OPTIONALLY no tem efeito na interpretao da entrada). A ocorrncia de caracteres ENCLOSED BY precedido pelo caracter ESCAPED BY
so interpretados como parte do campo atual.
Se o campo comea com o caracter ENCLOSED BY, instncias daquele caracter so reconhecidos
como terminao de um valor do campo apenas se seguido pelo campo ou sequncia de linah TERMINATED BY. Para evitar ambiguidade, ocorrncias do caracter ENCLOSED BY dentro de um va553
lor de campo pode ser duplicado e ser interpretado como uma nica instncia do caracter. Por
exemplo, se ENCLOSED BY '"' for especificado, aspas sero tratadas como mostrado abaixo:
"The ""BIG"" boss"
The "BIG" boss
The ""BIG"" boss
FIELDS ESCAPED BY controla como escrever ou ler caracteres especiais. Se o caracter FIELDS
ESCAPED BY no estivaer vazio, ele ser usado para preceder o seguinte caracter de sada:
ASCII 0 (o que escrito seguido de um caracter de escape ASCII '0', no o byte de valor zero).
Se o caracter FIELDS ESCAPED BY estiver vazio, nenhum caracter ser ``escapado''. Provavelmente no uma boa idia especificar um caracter de escape vazio, principalmente se os valores dos
campos em seus conter qualquer caracter na lista dada.
Para entradas, se o caracter FIELDS ESCAPED BY no estiver vazio, as ocorrncias daquele caracter so eliminadas e o caracter seguinte tomado como parte do valor do campo. As excees so
um '0' ou 'N' ``escapado'' (por exemplo, \0 ou \N se o caracter de escape for '\'). Estas sequencias
so interpretadas como os ASCII 0 (um byte de valor zero) e NULL. Veja abaixo as regras no tratamento de NULL.
Para maiores informaes sobre a sintaxe '\'-escape, veja Seco 6.1.1, Literais: Como Gravar
Strings e Numerais.
Em certos casos, as opes de tratamento de campoe e linhas se interagem:
O tratamento do valor NULL varia, dependendo das opes de FIELDS e LINES que voce usar:
Para os valores FIELDS e LINES padres, NULL escrito como \N para sada e \N lido como NULL para as entradas (assumindo que o caracter ESCAPED BY '\').
554
Se FIELDS ENCLOSED BY no for vazio, um campo contendo a palavra literal NULL como
seu valor lido como um valor NULL (isto difere da palavra NULL entre os caracteres FIELDS
ENCLOSED BY, a qual lida como a string 'NULL').
Com os formatos de tamanho fixos (que acontecem quando FIELDS TERMINATED BY e FIELDS ENCLOSED BY estiverem ambos vazios), NULL escrito como uma string vazia. Note
que isto faz com que os valores NULL e uma string vazia na tabela sero indistingveis quando
escritas no arquivo pois elas so ambas escritas como strings vazias. Se voc precisar estar saber
diferenciar as duas ao ler o arquivo de volta, voc no deve utilizar o formato de tamanho fixo.
Se voc especificar um separador que igual ao prefixo do outro, LOAD DATA INFILE no
poder interpretar a entratada apropriadamente. Por exemplo, a seguinte clusula FIELDS causaria problemas:
FIELDS TERMINATED BY '"' ENCLOSED BY '"'
Se FIELDS ESCAPED BY estiver vazio, um valor de campo que contm uma ocorrncia de
FIELDS ENCLOSED BY ou LINES TERMINATED BY seguido por valores FIELDS TERMINATED BY far com que LOAD DATA INFILE pare de ler um campo ou linha antes do esperado. Isto ocorre porque LOAD DATA INFILE no pode determinar apropriadamente onde o
valor de campo ou linha acaba.
Para tipos de data e hora, a coluna definida com o valor ``zero'' apropriado para o tipo. See
555
Deleted: 0
Skipped: 0
Warnings: 0
Avisos ocorrem sob as mesmas circuntncias que quando so inseridos via instruo INSERT (see
Seco 6.4.3, Sintaxe INSERT), exceto que LOAD DATA INFILE tambm gera avisos quando
houver poucos ou muitos campos na linha de entrada. Os avisos no so armazenados em nenhum
local; o nmero de avisos s pode ser utilizado como uma indicao se tudo correr bem.
Se voc obter avisos e quiser saber exatamente porque eles ocorreram, um modo de se fazer isto
utilizar SELECT ... INTO OUTFILE em outro arquivo e campor-lo ao arquivo de entrada original.
Se voc precisar que LOAD DATA leia de um pipe, voc pode utilizar o seguinte truque:
mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
cat < /dev/tcp/10.1.1.12/4711 > /nt/mysql/db/x/x
mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x
Se voc estiver usando uma verso do MySQL a anterior a 3.23.25 voc s poder fazer o descrito
acima com LOAD DATA LOCAL INFILE.
No MySQL 4.1.1 voc pode usar SHOW WARNINGS para conseguir a lista do primeiros
max_error_count avisos. See Seco 4.6.8.9, SHOW WARNINGS | ERRORS.
Para mais informaes sobre a eficincia de INSERT versus LOAD DATA INFILE e a melhora na
velocidade de LOAD DATA INFILE, See Seco 5.2.10, Performance das Consultas que Utilizam INSERT.
556
A interface handler no precisa fornecer uma aprncia consistente dos dados (por exemplo,
dirty-reads so permitidas), assim o mecanismo de armazenamento pode fazer otimizaes
que o SQL normalmente no permite.
muito mais fcil portar aplicaes que usam interface como ISAM para o MySQL.
Ele permite se fazer uma travessia em um banco de dados de uma maneira que no facil (em
alguns casos impossvel) de fazer com SQL. A interface handler um modo mais natural de
mostrar dados ao trabalhar com aplicaes que fornecem uma interface interativa com o usurio
para o banco de dados.
557
6.4.10. Sintaxe DO
DO expresso, [expresso, ...]
Executa a expresso mas no retorna nenhum resultado. Este um modo curto de SELECT expresso, expresso, mas tem a vantagem de ser rpida quando voc no se preocupa com o
resultado.
Ele til principalmente com funes que tem efeitos em um dos lados, como RELEASE_LOCK.
Ext
Ext
Ext
.BAK
.DAT
.HSH
.ISD
.ISM
.ISM
.MRG
.MYD
.MYI
.db
.frm
558
Voc tambm pode deletar um banco de dados com mysqladmin. See Seco 4.9, Utilitrios e
Scripts do Lado do Cliente MySQL.
| DELAY_KEY_WRITE = {0 | 1}
| ROW_FORMAT = { DEFAULT | DYNAMIC | FIXED | COMPRESSED }
| RAID_TYPE = { 1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=#
| UNION = (table_name,[table_name...])
| INSERT_METHOD = { NO | FIRST | LAST }
| DATA DIRECTORY = 'caminho absluto para o diretrio'
| INDEX DIRECTORY = 'caminho absluto para o diretrio'
| DEFAULT CHARACTER SET character_set_name [COLLATE collation_name]
instruo_select:
[IGNORE | REPLACE] [AS] SELECT ... (Alguma instruo vlida)
CREATE TABLE cria uma tabela com op nome dado no banco de dados atual.
As regras para nomes de tabelas permitidos so dados em Seco 6.1.2, Nomes de Banco de dados,
Tabela, ndice, Coluna e Alias. Por padro a tabela criada no banco de dados atual. Um erro ocorre se no houver o banco de dados atual ou se a tabela j existir.
No MySQL Verso 3.22 ou posterior, o nome de tabela pode ser especificado como nome_bd.nome_tabela para criar a tabela em um banco de dados especfico. Ele funciona sem se
preoocupar se existe um banco de dados atual.
A partir do MySQL Verso 3.23, voc pode usar a palavra-chave TEMPORARY qaundo voc criar
uma tabela. A tabela temporria visvel apenas a para a conexo atual, e ser automaticamente deletada quando a conexo fechada. Isto significa que duas conexes diferentes podem usar o mesmo
nome de tabela temporria sem conflitos outras ou com uma tabela existente com o mesmo nome.
(A tabela existente escondida at que a tabela temporria seja deletada). A partir do MySQL 4.0.2
voc deve ter o privilgio CREATE TEMPORARY TABLES para poder criar tabelas temporrias.
No MySQL Verso 3.23 ou posterior voc pode utilizar as palavras-chaves IF NOT EXISTS para
que no ocorra um erro se a tabela j existir. Note que no h verificao de que a tabela existente
tem uma estrutura idntica a aquela indicada pela instruo CREATE TABLE
A partir da verso 4.1.0, o atributo SERIAL pode ser usado com um alias para BIGINT NOT
NULL AUTO_INCREMENT UNIQUE. Este um recuros para compatibilidade.
Como no MySQL 3.23, voc pode criar uma tabela de autra adicionando uma instruo SELECT no
fim da instruo CREATE TABLE:
CREATE TABLE new_tbl SELECT * FROM orig_tbl;
Os ndices no so transportados para a nova tabela, e algumas converses de tipos de coluna podem
ocorrer. Por exemplo, o atributoAUTO_INCREMENT no est preservado e colunas VARCHAR podem se tornar colunas CHAR.
Quando criar uma tabela com CREATE ... SELECT, de um apelido para qualquer chamada de
funo ou expresses em uma consulta. Se voc no o fizer, a instruo CREATE pode falhar ou resultar em nomes de colunas indesejveis.
CREATE TABLE artists_and_works
SELECT artist.name, COUNT(work.artist_id) AS number_of_works
FROM artist LEFT JOIN work ON artist.id = work.artist_id
GROUP BY artist.id;
No MySQL 4.1, voc pode especificar explicitamente o tipo para uma coluna gerada:
CREATE TABLE foo (a tinyint not null) SELECT b+1 AS 'a' FROM bar;
No MySQL 4.1 voc pode utilizar LIKE para criar uma tabela baseada em uma definio de outra
tabela. No MySQL 4.1 voc tambm pode especificar o tipo para uma coluna gerada:
CREATE TABLE new_tbl LIKE orig_tbl;
560
Cada tabela nome_tabela representada por algum arquivo no diretrio de banco de dados. No
caso das tabelas tipo MyISAM voc ir obter:
CREATE TABLE ... LIKE no copia nenhuma opo de tabela DATA DIRECTORY ou INDEX
DIRECTORY que foi especificada para a tabela original.
Arquivo
Proposito
nome_tabela.frm
nome_tabela.MYD
Arquivo de dados
nome_tabela.MYI
Arquivo ndice
Para mais informaes de propriedades de varios tipo de coluna, veja Seco 6.2, Tipos de Campos:
Se nem NULL nem NOT NULL for especificado, a coluna tratada como se NULL fosse especificado.
Uma coluna integer pode ter o atributo adicional AUTO_INCREMENT. Quando voc insere um
valor de NULL (recomendado) ou 0 em uma coluna AUTO_INCREMENT indexada, a coluna
definida com o valor da prxima sequncia. Normalmente ele valor+1, onde valor o
maior valor para a coluna column atualmente na tabela. A sequncia de AUTO_INCREMENT comea com 1. See Seco 12.1.3.32, mysql_insert_id().
A partir do MySQL 4.1.1, especificando o parmetro NO_AUTO_VALUE_ON_ZERO para a opo do servidor --sql-mode ou a varivel do servidor sql_mode permite que voc aramzene 0 nas colunas AUTO_INCREMENT como 0, em vez de gerar uma nova sequncia de valores.
See Seco 4.1.1, Opes de Linha de Comando do mysqld.
Se voc deletar a linha contendo o valor mximo para uma coluna AUTO_INCREMENT, o valor
ser reutilizado por uma tabela ISAM, ou BDB, mas no por tabelas MyISAM ou InnoDB. Se
voc deletar todas as linhas na sua tabela com DELETE FROM nome_tabela (sem um WHERE) no modo AUTOCOMMIT, a sequencia ser reiniciada em todos os tipos de tabela, exceto
InnoDB. See Seco 7.5.12.5, Como Funciona uma Coluna AUTO_INCREMENT no InnoDB.
Nota: S pode haver uma coluna AUTO_INCREMENT por tabela, e ela deve ser indexada e no
pode ter uma valor DEFAULT. No MySQL Verso 3.23, uma coluna AUTO_INCREMENT funcionar corretamente apenas se conter apenas valores positivos. Inserir um nmero negativo considerado como a insero de um nmero positivo muito grande. Isto ocorre para evitar problemaa de preciso quando os nmeros vo de positivo para negativo e tambm para assegurar que
no se obtenha, acidentalmente, uma coluna AUTO_INCREMENT que contenha 0.
Em tabelas MyISAM e BDB voc pode especificar colunas AUTO_INCREMENT secundrias em
uma chave ulti-coluna. See Seco 3.6.9, Usando AUTO_INCREMENT.
Para tornar MySQL compatvel com alguns aplicativos ODBC, voc pode encontrar o valor AUTO_INCREMENT da ltima linha inserida com a seguinte consulta:
SELECT * FROM nome_tabela WHERE auto_col IS NULL
Valores NULL so tratados em colunas TIMESTAMP de modo diferente de outros tipos de colunas. Voc no pode armazenar um NULL literal em uma coluna TIMESTAMP; definindo a coluna com NULL lhe atribui a a data e a hora atual. Como colunas TIMESTAMP se comportam desta forma, os atributos NULL e NOT NULL no se aplicam de modo normal e so ignorados se
voc os especificar.
Por outro lado, tornar o uso de colunas TIMESTAMP mais fcil para os clientes MySQL, o servidor relata que tal coluna pode ter o valor NULL atribudo (a que verdade), mesmo que TIMES561
TAMP nunca contenham, realmente, um valor NULL. Voc pode ver isto quando voc utiliza
DESCRIBE nome_tabela para obter informaes sobre sua tabela.
Note que definir uma coluna TIMESTAMP com 0 no o mesmo que defin-la com NULL, porque 0 um valor TIMESTAMP vlido.
Um valor padro (DEFAULT) tem que ser constante, ele no pode ser uma funo ou uma expresso.
Se nenhum valor DEFAULT especificado para uma coluna, o MySQL atribuir um automaticamente, como a seguir.
Se a coluna aceitar NULL como um valor, o valor padro NULL.
Se a coluna declarada como NOT NULL, o valor padro depende do tipo de coluna:
Para tipos date e time diferentes de TIMESTAMP, o padro o valor zero apropriado para o
tipo. Para a primeira coluna TIMESTAMP na tabela, o padro a data e hora atuais. See Seco 6.2.2, Tipos de Data e Hora.
Para tipos string diferentes de ENUM, o valor padro uma string vazia. Para ENUM, o padro
o primeiro valor enumerado.
Valores padres devem ser constantes. Isto significa, por exemplo, que voc no pode definir o
padro de uma coluna date como o valor de funes como NOW() or CURRENT_DATE.
Um comentrio para uma coluna pode ser especificado com a opo COMMENT. O comentrio
mostrado pela instruo SHOW CREATE TABLE e por SHOW FULL COLUMNS. Esta opo
est disponvel a partir do MySQL 4.1. (Ela perimitida mas ignorada em verses anteriores.)
KEY normalmente um sinnimo para INDEX. A partir da verso 4.1, o atributo de chave PRIMARY KEY tambm pode ser especificado apenas como KEY. Isto foi implementado para compatibilidade com outros bancos de dados.
No MySQL,uam chave UNIQUE s pode ter valores distintos. Um erro ocorre se voc tantar adicionar uma nova linha com uma chave que coincida com uma j existente.
PRIMARY KEY uma chave nica (KEY) onde todas as colunas chaves devem ser definidas como NOT NULL. Se elas no forem explicitamente declaradas como NOT NULL, isto ser feito
implicitamente e sem aviso. No MySQL a chave chamada PRIMARY. Uma tabela pode ter
apenas uma PRIMARY KEY. Se voc no tiver uma PRIMARY KEY e alguma aplicao perguntar pela PRIMARY KEY em sua tabela, o MySQL retornar a primeira chave UNIQUE, que
no possui nenhuma coluna NULL, como a PRIMARY KEY.
Uma PRIMARY KEY pode ser um ndice multi-coluna. Porm, voc no pode criar um ndice
multi-coluna usando o atributo de chave PRIMARY KEY em uma especificao de coluna. Fazendo assim apenas colunas simples podero ser marcadas como primrias. Voc deve utilizar
uma clusula PRIMARY KEY(index_nome_coluna, ...) separada.
Um ndice UNIQUE aquele no qual todos os valores no ndice devem ser distintos. A exceo a
isto que se for permtido conter valores NULL em uma coluna no ndice, ele pode conter mltiplos valores NULL. Este exceo no se aplica a tabelas BDB, que permitem apenas um nico
NULL.
Se a chave PRIMARY ou UNIQUE consistir de apenas uma coluna e ela do tipo inteiro, voc
tambm poder se referir a ela como _rowid (novo na verso 3.23.11).
Se voc no atribuir um nome ao ndice que no um PRIMARY KEY, ele ter o mesmo nome
562
da prmeira index_nome_coluna, com um sufixo opicional (_2, _3, ...) para torn-lo nico. Voc pode nome de ndices para uma tabela usando SHOW INDEX FROM
nome_tabela. See Seco 4.6.8.1, Recuperando Informaes sobre Bancos de Dados, Tabelas, Colunas e ndices.
Apenas os tipos de tabelas MyISAM, InnoDB, e BDB suportam ndices em coluna que possam
ter valores NULL. Nos outros casos voc deve declarar tais colunas NOT NULL ou um erro ser
retornado.
Apenas os tipos de tabela MyISAM e (a partir do MySQL 4.0.14) InnoDB suportam ndice em
colunas BLOB e TEXT. Ao colocar um ndice em uma coluna BLOB ou TEXT voc sempre DEVE especificar o tamanho do ndice, at 255 bytes. Por exemplo:
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
Uma especificao index_col_name pode finalizar com ASC ou DESC. Esta palavras chaves
so permitidas para estenso futura para especificar o armazenamento do valor do ndice em
crescente ou decrescente. Atualmente elas so analisadas mas ignoradas; valores de ndice so
sempre armazenados em ordem crescente.
Quando voc utiliza ORDER BY ou GROUP BY com uma coluna TEXT ou BLOB, o servidor ardena valores usando apenas o nmero inicial de bytes, indicado pela varivel do servidor
max_sort_length. See Seco 6.2.3.2, Os Tipos BLOB e TEXT.
No MySQL Verso 3.23.23 ou posterior, voc tambm pode criar ndices FULLTEXT especiais.
Eles so usados para busca full-text. Apenas o tipo de tabela MyISAM suporta ndices FULLTEXT. Eles s podem ser criados em colunas CHAR, VARCHAR, e TEXT. A indexao sempre
ocorre sobre toda a coluna; ndices parciais no so suportados. Veja Seco 6.8, Pesquisa Fulltext no MySQL para detalhes de operao.
No MySQL Verso 3.23.44 ou posterior, tabelas InnoDB suportam verificao de chaves estrangeiras. See Seco 7.5, Tabelas InnoDB. Note que a sintaxe FOREIGN KEY no InnoDB
mais restrita que a sintaxe apresentada acima. As colunas da tabela indicada devem ser nomeadas explicitmente. O InnoDB suporta ambas as aes ON DELETE e ON UPDATE em chaves
esrtrangiras nos MySQL 3.23.50 e 4.0.8, respectivamente. Veja a seo InnoDB do manual para a sintaxe precisa. See Seco 7.5.5.2, Restries FOREIGN KEY. Para outros tipos de tabelas, MySQL Server analisa as sinatxes FOREIGN KEY, CHECK e REFERENCES no comando
CREATE TABLE, mas sem tal ao ser tomada. See Seco 1.8.4.5, Chaves Estrangeiras.
Para tabelas ISAM e MyISAM, cada coluna NULL tem um bit extra, arredondado para o byte
mais prximo. O tamanho mximo de um registro em bytes pode ser calculado como a seguir:
tamanho da linha = 1
+ (soma do tamanho da coluna)
+ (nmeros de coluna NULL + delete_flag 7)/8
+ (nmero de colunas de tamanho varivel)
delete_flag 1 para tabelas com formato de registro esttico. Tabelas estticas usam um bit
no registro para um parmetro que indica se o linha foi deletada. delete_flag 0 para tabelas dinmicas porque este parmetro armazenado no cabealho da linha dinmica.
Estes clculos no se aplicam tabelas InnoDB, para a qual o tamanho do armazenamento no
diferente para colunas NULL comparados a colunas NOT NULL.
563
Descrio
BDB ou
leyDB
Berke-
HEAP
Os dados desta tabela so armazenados apenas na memria. See Seco 7.4, Tabelas HEAP.
ISAM
InnoDB
Tabelas com transaes eguras com bloqueio de linha. See Seco 7.5, Tabelas InnoDB.
MERGE
Uma coleo de tabelas MyISAM usadas como uma tabela. See Seco 7.2, Tabelas MERGE.
MRG_MyISAM
MyISAM
Descrio
AUTO_INCREMENT
AVG_ROW_LENGTH
CHECKSUM
Defina com 1 se voc quiser manter um checksum para todas as linha (deixa a tabela um pouco mais lenta para atualizaes, mas fica
mais fcil encontrar tabelas corrompidas) (apenas MyISAM).
COMMENT
MAX_ROWS
MIN_ROWS
PACK_KEYS
PASSWORD
DELAY_KEY_WRITE
ROW_FORMAT
No MySQL 3.23, Se voc especificar um SELECT depois de uma instruo CREATE, MySQL
criar novos campos para todos os elemento em SELECT. Por exemplo:
mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
->
PRIMARY KEY (a), KEY(b))
->
TYPE=MyISAM SELECT b,c FROM test2;
Isto ir criar uma tabela MyISAM com trs colunas, a, b e c. Note que as colunas da instruo
SELECT so inseridas do lado correto da tabela, no sobreposta nela. Considere o seguinte
exemplo:
mysql> SELECT * FROM foo;
+---+
| n |
+---+
| 1 |
+---+
mysql> CREATE TABLE bar (m INT) SELECT n FROM foo;
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM bar;
+------+---+
| m
| n |
+------+---+
| NULL | 1 |
+------+---+
1 row in set (0.00 sec)
Para cada linha na tabela foo, uma linha inserida em bar com os valores de foo e os valores
padres para a nova coluna.
CREATE TABLE ... SELECT no ir criar automaticamente nenhum ndice para voc. Isto
feito intencionalmente para deixar o comando o mais flexvel possvel. Se voc quiser ter ndices em uma tabela criada, voc deve especific-lo antes da instruo SELECT:
565
A opo RAID_TYPE ir ajud-lo a exceder o limite de 2G/4G limit para arquivo de dados
MyISAM (no o arquivo de ndice) em sistemas operacionais que no suportam arquivos grandes. Note que esta opo no recomendada para sistema de arquivos que suportam arquivos
grandes!
Voc pode obter mais velocidade da gargalo de E/S colocando diretorios RAID em diferentes
discos fsicos. RAID_TYPE funcionar em qualquer sistema operacional, desde que voc tenha
configurado o MySQL com --with-raid. Por agora o nico RAID_TYPE permitido
STRIPED (1 e RAID0 so utilizados para isto).
Se voc especificar RAID_TYPE=STRIPED para tabeals MyISAM, MyISAM criar subdiretrios RAID_CHUNKS chamados 00, 01, 02 no diretrio de banco de dados. Em cada um destes diretrios MyISAM criar uma nome_tabela.MYD. Ao escrever dados no arquivo de dados, o
manipulador RAID ir mapear o primeiro RAID_CHUNKSIZE *1024 bytes para o primeiro arquivo e os prximos RAID_CHUNKSIZE *1024 bytes para o prximo arquivo.
UNION utilizado quando voc quer utilizar uma coleo de tabelas identicas como uma. Isto s
funciona com tabelas MERGE. See Seco 7.2, Tabelas MERGE.
No momento voc precisa ter privilgios SELECT, UPDATE e DELETE nas tabelas mapeadas
para uma tabela MERGE. Todas as tabelas mapeadas devem estar no mesmo banco de dados na
tabela MERGE.
Se voc quiser inserir dados em uma tabela MERGE, voc tem que especificar com INSERT_METHOD na tabela onde o registro deve ser inserido. INSERT_METHOD uma opo
til somente para tabelas MERGE. See Seco 7.2, Tabelas MERGE. Esta opo foi introduzida
no MySQL 4.0.0.
Na tabela criada a chave PRIMARY ser colocado primeiro, seguida de todas a chaves nicas
(UNIQUE) e ento das chaves normais. Isto ajuda o otimizador MySQL para priorizar qual chave utilizar e tambm a detectaa mais rapidamente chaves nicas (UNIQUE) duplicadas.
Utilizando
DATA
DIRECTORY='directorio'
ou
INDEX
DIRECTORY='directorio' voc pode especificar onde o mecanismo de armazenamento deve colocar os seus arquivos de tabelas e ndices. Note que ``diretrio'' deve ser um caminho completo
para o diretrio (no um caminho relativo).
Isto s funciona para tabelas MyISAM no MySQL 4.0, quando no estiver usando a opo -skip-symlink. See Seco 5.6.1.2, Utilizando Links Simblicos para Tabelas.
566
Colunas VARCHAR com um tamanho menor que quatro so alteradas para CHAR.
Se qulquer coluna em uma tabela tem um tamanho varivel, toda a linha de tamanho varvel
como resultado. Consequentementem se uma tabela contm qualquer coluna de tamanho varivel (VARCHAR, TEXT, ou BLOB), todas as colunas CHAR maior que trs caracteres so alteradas
para colunas VARCHAR. Isto no afeta como voc utiliza as colunas; no MySQL, VARCHAR
apenas um modo diferente de armazenar caracteres. O MySQL realiza esta converso porque ela
salva espao e torna as operes de tabela mais rpidas. See Captulo 7, Tipos de Tabela do
MySQL.
A partir da verso 4.1.0, se um campo CHAR ou VARCHAR com uma especificao de tamanho
maior que 255 convertido para TEXT. Este um recurso para compatibilidade.
O tamanho do display TIMESTAMP deve ser para e na faixa de 2 a 14. Se voc especificar um
tamanho de display de 0 opu maior que 14, o tamaho convertido para 14. Tamanhos de valor
mpar na faixa de 1 a 13 so convertidos para o nmero para mais prximo acima.
Voc no pode armazenar um NULL literal em uma coluna TIMESTAMP; defin-la com NULL a
atribui a data e hora atual. Por colunas TIMESTAMP comportarem deste modo, os atributos
NULL e NOT NULL no se aplicam no modo normal e so ignorados se voc especific-los.
DESCRIBE nome_tabela sempre indica que a uma coluna TIMESTAMP pode ser atribudo
valores NULL.
MySQL mapeia certos tipos de colunas utilizados por outros produtos de banco de dados para tipos MySQL. See Seco 6.2.5, Usando Tipos de Colunas de Outros Mecanismos de Banco de
Dados .
Se voc quiser ver se o MySQL utiliza um tipo de coluna diferente do especificado, axecute uma
instruo DESCRIBE nome_tabela depois de criar ou alterar a sua tabela.
Outras alteraes de tipos de colunas podem ocorrer se voc compactar a tabela utilizando myisampack. See Seco 7.1.2.3, Caractersticas de Tabelas Compactadas.
Se voc utilizar ALTER TABLE para alterar a especificao da coluna, mas DESCRIBE
tbl_name indicar que a sua coluna no foi alterada, possvel que o MySQL tenha ignorado ou a
sua modificao por uma das razes descritas em Seco 6.5.3.1, Alterao de Especificaes de
Colunas. Por exemplo, se voc tentar alterar uma coluna VARCHAR para CHAR, MySQL ainda usar VARCHAR se a tabela conter outras colunas de tamanho varivel.
ALTER TABLE funciona fazendo uma cpia temporria da tabela original. A alterao realizada
na cpia, assim a tabela original deletada e a nova tabela renomeada. Isto feito de tal forma que
todas as desnecessriaatualizaes so automaticamente redirecionadas para a nova tabela sem nenhuma atualizao errada. Enquanto o ALTER TABLE executado, a tabela original pode ser lida
por outros clientes. Atualizaes e escrita na tabela so guardadas at a nova tabela estar pronta.
Note que se voc utilizar qualquer outra opo de ALTER TABLE, exceto RENAME, o MySQL ir
sempre criar um a tabela temporria, mesmo se os dados no precisarem realmente serem copiados
(como quando voc altera o nome de uma coluna). Planejamos corrigir isto no futuro, mas como no
se faz ALTER TABLE com tanta frequncia, isto no de alta prioridade em nosso TO DO. Para tabelas MyISAM, vOc pode aumentar a velocidade na parte da recriao dos ndices (que a parte
mais lenta do processo recriao) atribuindo um alto valor varivel myisam_sort_buffer_size.
Para utilizar ALTER TABLE, voc precisa dos privilgios ALTER, INSERT e CREATE na tabela.
IGNORE uma extenso do MySQL ao SQL-92. Ele controla como o ALTER TABLE funciona
se houver duplicao em chaves nicas na nova tabela. Se IGNORE no especificado, a cpia
abortada e retornada. Se IGNORE for especificado, para linhas com duplicatas em chaves nicas,
somente a primera linha usada; as outras so deletadas.
Voc pode executar mltiplas clusulas ADD, ALTER, DROP e CHANGE em uma nica instruo
ALTER TABLE. Esta uma extenso do MySQL ao SQL-92, que permite paenas uma clusula
de cada por instruo ALTER TABLE.
A palavra opcional COLUMN uma palavra puramente desnecessria e pode ser omitida.
Se voc utilizar ALTER TABLE nome_tbl RENAME TO novo_nome sem nenhuma outra
opo, MySQL simplesmente renomeia os arquivos correspondentes a tabela nome_tbl. No
h necessidade de se criar uma tabela temporria. See Seco 6.5.5, Sintaxe RENAME
TABLE.
Clusulas definio_create usam a mesma sintaxe para ADD e CHANGE assim como para
CREATE TABLE. Note que a sintaxe inclui o nome da coluna, no apenas o tipo da coluna. See
Seco 6.5.3, Sintaxe CREATE TABLE.
Voc pode renomear ma coluna usando uma clusula CHANGE nome_col_antiga definies_create. Para tal, especifique o nome das colunas antiga e da nome e o tipo que a coluna atual possui. Por exemplo, para renomear uma coluna INTEGER de a para b, faa assim:
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
Se voc quiser mudar um tipo de coluna, mas no o nome, a sintaxe CHANGE ainda exige dois
nomes de colunas, mesmo que sejam o mesmo. Por exemplo:
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
No entanto, como no MySQL Verso 3.22.16a, voc tambm pode utilizar MODIFY para alterar
um tipo de coluna sem renome-lo:
568
Se voc utilizar CHANGE ou MODIFY para reduzir uma coluna na qual exista um ndice em parte
da coluna (por exemplo, se voc tiver um ndice nos primeiros 10 caracteres de uma coluna
VARCHAR), voc no poder reduzir a coluna para um tamanho menor que o nmero de caracteres indexados.
Quando voc altera um tipo de coluna usando CHANGE ou MODIFY, erter os dados para o novo
tipo da melhor forma possvel.
No MySQL Verso 3.22 ou posterior voc pode utilizar FIRST ou ADD ... AFTER nome_col para aadicionar uma coluna em uma posio especfica na linha da tabela. O padro
adicionar a coluna no fim. A partir do MySQL Verso 4.0.1, voc pode tambm utilizar as palavras-chave FIRST e AFTER em CHANGE ou MODIFY.
ALTER COLUMN especifica um novo valor padro para uma coluna ou remover o valor padro
antigo. Se o padro antigo removido e a coluna pode ser NULL, o novo padro NULL. Se a
coluna no pode ser NULL, MySQL atribui um valor padro, como descrito em Seco 6.5.3,
Sintaxe CREATE TABLE.
DROP INDEX remove um ndice. Esta uma extenso do MySQL ao SQL-92. See Seco 6.5.8, Sintaxe DROP INDEX.
Se colunas forem removidas de uma tabela, as colunas tambm so removidas de qualquer ndice do qual eles fazem parte. Se todas as colunas que compe um ndice so excludas, o ndice
tambm excludo.
Se uma tabela contm apenas uma coluna, a coluna no pode ser excluda. Se o que voc pretende remover a tabela, use DROP TABLE.
DROP PRIMARY KEY deleta o ndice primrio. Se tal ndice no existe, ele apaga o prmeiro
ndice nico (UNIQUE) na tabela. (MySQL marca a primeira chave nica (UNIQUE) como
PRIMARY KEY se nenhuma PRIMARY KEY foi especificada explicitamente.)
Se voc adicionar UNIQUE INDEX ou PRIMARY KEY a uma tabela, elas so armazenadas antes de qualquer ndice no UNIQUE para que possa detectar cahves duplicadas o mais rpido
possvel.
ORDER BY lhe permite criar a nova tabela com as linhas em uma ordem especfica. Note que a
tabela no permanecer nesta ordem depois de insres e delees. Em algunas casos, isto pode
tornar a ordenao mais para o MySQL se a tabela estiver ordenada pela coluna que voc escolheu. Esta opo til principalmente quando voc sabe qeu na maioria das vezes voc ir inserir os registros em certa ordem; utilizando esta opo depois de grandes mudanas na tabela, voc obter melhor desempenho.
Se voc utilizar ALTER TABLE em uma tabela MyISAM, todos os ndices que no so nicos
so criados em um grupo separado (como em REPAIR). Isto deve tornar ALTER TABLE muito
mais rpido quando voc tiver vrios ndices.
A partir do MySQL 4.0 o recurso acima pode ser ativado explicitamente. ALTER TABLE ...
DISABLE KEYS faz o MySQL parar de atualizar chaves que no so nicas em tabelas MyISAM. ALTER TABLE ... ENABLE KEYS deve ser usado para recriar ndices perdidos. Como o MySQL faz isso com um algoritmo especial que muito mais rpido que inserir chaves
uma a uma, disabilitar chaves podem trazer um aumento de velocidade considervel em inseres volumosas.
Com a funo mysql_info() da API C, voc pode saber quantos registros foram copiados, e
(quando IGNORE for usado) quantos registros foram deletados devido a duplicao de valores
de chaves nicas.
569
As clusulas FOREIGN KEY, CHECK e REFERENCES no fazem nada, exceto para tipos de tabela InnoDB que suportam ... ADD [CONSTRAINT [symbol]] FOREIGN KEY
(...) REFERENCES ... (...) e ... DROP FOREIGN KEY .... See Seco 7.5.5.2, Restries FOREIGN KEY. A sintaxe para outros tipos de tabela s fornecido
para comptibilidade, para tornar fcil portar o cdigo de outro servidor SQL e executar aplicaes que criam tabelasd com referncias. See Seco 1.8.4, Diferenas do MySQL em Comparao com o SQL-92.
Se voc quiser alterar todas as colunas CHAR/VARCHAR/TEXT para um novo conjunto de caracteres (por exemplo, depois de atualizar do MySQL 4.0.x para o 4.1.1) voc pode fazer:
ALTER TABLE table_name CHARACTER SET character_set_name;
Note que o seguinte comando s ir alterar o default character set para uma tabela:
ALTER TABLE table_name DEFAULT CHARACTER SET character_set_name;
O default character set o conjunto de caracteres que usado se voc no especificar
o conjunto de caracteres para uma nova coluna que voc adicionar a tabela (por exemplo com
ALTER TABLE ... ADD coluna).
Aqui temos um exemplo que mostra alguns dos usos de ALTER TABLE. Ns comeamos com uma
tabela t1 que crida como mostrado aqui:
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
Para renomear a tabela de t1 para t2:
mysql> ALTER TABLE t1 RENAME t2;
Para alterar a coluna a de INTEGER para TINYINT NOT NULL (deixando o mesmo nome), e alterar a coluna b de CHAR(10) para CHAR(20) e renome-la de b para c:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
Para adicionar um nova coluna TIMESTAMP chamada d:
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
Para adicionar um ndice na coluna d, e tornar a colua a a chave primria:
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
Para remover a coluna c:
mysql> ALTER TABLE t2 DROP COLUMN c;
Para adiciomar um nova coluna inteira AUTO_INCREMENT chamada c:
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD INDEX (c);
Note que ns indexamos c, porque colunas AUTO_INCREMENT devem ser indexadas e tambm por
570
isso declaramos c como NOT NULL, pois colunas indexadas no podem ser NULL.
Quando voc adicionar uma coluna AUTO_INCREMENT, valores de coluna so preenchidos com
sequncia de nmeros automaticamente para voc. Voc pode definir o primeiro nmero da sequncia executando SET INSERT_ID=valor antes de ALTER TABLE ou usando a opo de tabela
AUTO_INCREMENT=valor. See Seco 5.5.6, Sintaxe de SET.
Com tabelas MyISAM tables, se voc no alterar a coluna AUTO_INCREMENT, a sequncia de nmeros no ser afetada. Se voc excluir uma coluna AUTO_INCREMENT e adicionar outra coluna
AUTO_INCREMENT, a numerao iniciar a partir do 1 novamente.
See Seco A.7.1, Problemas com ALTER TABLE..
571
Nota: DROP TABLE far automaticamente um commit da transao ativa atualmente (exceto se voc estiver usando a verso 4.1 e a palavra-chave TEMPORARY.
A opco TEMPORARY ignorada na verso 4.0. Na verso 4.1 esta opo funciona como a seguir:
Usar TEMPORARY uma boa maneira de assegurar que voc no apague uma tabela real.
MyISAM. ndices FULLTEXT esto disponveis no MySQL Verso 3.23.23 e posterior. Seco 6.8,
Pesquisa Full-text no MySQL.
USE db1;
SELECT COUNT(*) FROM mytable;
USE db2;
SELECT COUNT(*) FROM mytable;
# seleciona de
db1.mytable
# seleciona de db2.mytable
Torna um banco de dados particular como o atual no significa que a instruo USE no o permita
acessar tabelas em outros bancos de dados. O exemplo seguinte acessa a tabela author do banco
de dados db1 e a tabela editor do banco de dados db2:
mysql> USE db1;
mysql> SELECT author_name,editor_name FROM author,db2.editor
->
WHERE author.editor_id = db2.editor.editor_id;
A instruo USE fornecida para compatibilidade com o Sybase.
573
A instruo SHOW fornece informao similar. See Seco 4.6.8, Sintaxe de SHOW.
TRANSACTION, COMMIT e
Por padro, MySQL executado em modo autocommit. Isto significa que assim que voc executa
uma instruo que atualiza (modifica) uma tabela, o MySQL armaena a atualizao no disco.
Se voc estiver usando tabelas com segurana a transao (como InnoDB \ ou BDB), voc pode colocar o MySQL em modo no autocommit com o seguinte comando:
SET AUTOCOMMIT=0
Depois de disabilitar o modo autocommit configurando a varivel AUTOCOMMIT com zero, voc
deve utilizar COMMIT para armazenar suas alteraes em disco ou ROLLBACK se voc deseja ignorar as alteraes que voc fez desde o incio da sua transao.
Se voc quiser disabilitar o modo autocommit para uma nica srie de instrues, voc pode utiliar a
instruo START TRANSACTION:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;
BEGIN e BEGIN WORK podem ser usados em vez de START TRANSACTION para iniciar uma
transao. START TRANSACTION foi adicionado no MySQL 4.0.11; ele uma sintaxe do SQL-99
e o modo recomendado de iniciar umaa transao an ad-hoc. BEGIN e BEGIN WORK esto disponveis a partir do MySQL 3.23.17 e 3.23.19, respectivamente.
Note que se voc estiver usando tabelas sem segurana a transao, quaisquer alteraes sero armazenadas de uma vez, se considerar o status do modo autocommit.
Se voc executar uma instruo ROLLBACK depois de atualizar uma tabela no-transacional, voc
obter um erro (ER_WARNING_NOT_COMPLETE_ROLLBACK), como um aviso. Todas as tabelas
seguras a transao sero restauradas mas qualquer tabela se segurana a transao no sofrero alteraes.
Se voc estiver usando START TRANSACTION ou SET AUTOCOMMIT=0, voc deve usar o log
binrio do MySQL para backup no lugar do antigo log de atualizao. Transaes so armazenadas
no log binrio em um bloco, sobre COMMIT, para assegurar que transaes nas quais foram feitas
rolled back no foram armazenadas. See Seco 4.10.4, O Log Binrio.
Voc pode alterar o nvel isolao para transaes com SET TRANSACTION ISOLATION LEVEL. See Seco 6.7.6, Sintaxe SET TRANSACTION.
Comando
Comando
ALTER TABLE
BEGIN
CREATE INDEX
DROP DATABASE
DROP INDEX
DROP TABLE
LOCK TABLES
RENAME TABLE
SET AUTOCOMMIT=1
START TRANSACTION
TRUNCATE
UNLOCK TABLES tambm finaliza uma transao se qualquer tabela estiver atualmente bloqueada.
Antes do MySQL 4.0.13, CREATE TABLE finaliza uma transao se o log binrio est habilitado.
Transaes no podem ser aninhadas. Isto uma consequncia do COMMIT implcito realizado por
qualquer transao atual quando voc envia uma instruo START TRANSACTION ou um de seus
sinnimos.
tente para a thread atual. Todas as tabela que esto bloqueadas pela thread atual so implicitamente
desbloquadas quando a thread executa um outro LOCK TABLES, ou quando a conexo ao servidor
fechada.
Para usar LOCK TABLES no MySQL 4.0.2 voc precisa do privilgio global LOCK TABLES e um
privilgio SELECT nas tabelas envolvidas No MySQL 3.23 voc precisa ter os privilgios SELECT,
insert, DELETE e UPDATE para as tabelas.
A razo principal para utilizar LOCK TABLES para emular transaes ou obter mais velocidade
ao atualizar tabelas. Isto explicado em mais detalhes posteriormente.
Se uma thread obtem uma trava de leitura (READ) em uma tabela, aquela thread (e todas as outras
threads) s podero ler da tabela. Se uma thread obter uma trava de escrita (WRITE) na tabela, apenas a thread que bloqueou poder ler ou escrever na tabela. Outras threads sero bloqueadas.
A diferena entre READ LOCAL e READ que READ LOCAL permite que instrues INSERT no
conflitantes sejam executadas enquanto a trava est ativa. Isto, no entatnto, no pode ser usado se
voc for manipular o arquivo de banco de dados fora do MySQL enquanto a trava estiver ativa.
Quando voc usa LOCK TABLES, voc deve travar todas as tabelas que voc for usar e utilizar o
mesmo alias que estiver utilizando em suas consultas! Se voc estiver usando uma tabela vrias vezes em uma consulta (com aliases), voc deve obter um trava para cada alias.
Bloqueio de escrita (WRITE) normalmente tm maior prioridade que bloqueio de leitura (READ),
para assegurar que atualizaes so processadas assim que possvel. Isto significa que se uma thread
obtida um bloqueio de leitura (READ) e outra thread requisitar um bloqueio de escrita (WRITE), bloqueios de leitura (READ) subsequentes iro esperar at a thread de escrita (WRITE) tiver obtido a
trava e a liberado. Voc pode usar travas LOW_PRIORITY WRITE para permitir que outras threads
obtenham bloqueios de leitura (READ) enquanto a thread estiver esperando pela trava de escrita
(WRITE). Voc s deve utilizar bloqueios LOW_PRIORITY WRITE se voc estiver certo que haver um momento onde nenhuma thread ter bloqueio de leitura (READ).
LOCK TABLES funciona da seguinte maneira:
1.
Ordene todas as tabelas a serem travadas em uma ordem definida internamente (do ponto do
usurio a ordem indefinida).
2.
Se uma tabela bloqueada com uma trava de leitura e de escrita, coloque a trava de escrita antes da trava de leitura.
3.
Bloqueie uma tabela por vez at que a thread obtenha todas as travas.
Esta poltica assegura que as tabelas sejam bloqueadas sem deadlock. H no entanto outra coisa da
qual preciso estar ciente neste esquema:
Se coc estiver usando uma trava de escita LOW_PRIORITY WRITE em uma tabela, significa apenas que o MySQL ir esperar por esta trava particular at que no haja mais treads fazendo um bloqueio de leitura (READ). Quando a thread tiver obtido a trava de escrita (WRITE) e est esperando
ppo obter o trava para a prxima tabela na lista de tabelas bloqueadas, todas as outras threads iro
esperar que a trva de escrita (WRITE) seja liberada. Se isto tornar um srio problema com sua aplicao, voc deve converter algumas de suas tabellas para tabelas com segurana em transaes.
Voc pode matar com segurana um thread que est esperando por um bloqueio de tabela com
KILL. See Seco 4.6.7, Sintaxe de KILL.
Note que voc no deve travar nenhuma tabela que voc esteja usando com INSERT DELAYED.
Isto porque este o caso que o INSERT feito por uma thread separada.
Normalmente, voc no tem que travar tabelas, j que todas as instrues UPDATE so atomicas;
nenhuma outra thread pode interferir com qualquer outra executando uma instruo SQL. Existem
poucos casos em que voc gostaria de travar as tabelas de qualquer forma:
576
Se voc for executar operaes em um grupo de tabelas, muito mais rpido travar as tabelas
que voc for utilizar. O lado ruim que nenhuma outra thread pode atualizar uma tabela travada
para leitura (READ) (incluindo aquela que guarda o lock) e nenhuma outra thread pode ler uma
tabela bloqueada para escrita (WRITE) alm daquele que guarda o lock.
A razo de algumas coisas serem rpidas sob LOCK TABLES que o MySQL no ir descarregar a cache de tabelas bloqueadas at que UNLOCK TABLES seja chamado (normalmente a cache de chaves descarregada a cada instruo SQL). Isto aumenta a velocidade de insero, atualizao e deleo) em tabelas MyISAM.
Se voc estiver usando um mecanismo de armazenamento no MySQL que no suporte transaes, voc deve usar LOCK TABLES se voc quiser se assegurar que nenhuma outra thread venha entre um SELECT e um UPDATE. O exemplo mostrado aqui exige LOCK TABLES para ser
executado com segurana:
mysql>
mysql>
mysql>
->
mysql>
Sem LOCK TABLES, existe uma chance que outra thread possa inserir uma nova linha na tabela
trans entre a execuo das instrues SELECT e UPDATE.
Utilizando atualizaes incrementais (UPDATE customer SET value=value+new_value)
ou a funo LAST_INSERT_ID()i, voc pode evitar o uso de LOCK TABLES em muitos casos.
Voc tambm pode resolver alguns casos usando as funes de bloqueio a nvel de usurio
GET_LOCK() e RELEASE_LOCK(). Estas travas so salvas em uma tabela hash no servidor e implementado com pthread_mutex_lock() e pthread_mutex_unlock() para alta velocidade. See Seco 6.3.6.2, Funes Diversas.
Veja Seco 5.3.1, Como o MySQL Trava as Tabelas, para mais informaes sobre poltica de
bloqueios.
Voc pode trocar todas as tabelas em todos os banco de dados com trava de leitura com o comando
FLUSH TABLES WITH READ LOCK. See Seco 4.6.4, Sintaxe de FLUSH. Este um modo
muito conveiente de tirar backups se voc tiver um sistema de arquivos, como Veritas, que pode tirar snapshots.
NOTE: LOCK TABLES mo seguro com transaes e far um commit implicitamente em qualquer transao ativa antes de tentar travar as tabelas.
pode
definir
nvel
de
isolao
577
global
padro
para
mysqld
com
579
+
Um sinal de mais precedente indica que esta palavra deve estar presente em cada linha retornada.
Um sinal de menos precedente indice que esta palavra no deve estar presente em qualquer linha retornada.
Por padro (quando nem mais nem menos especificado) a palavra opcional, mas as linhas
que a contm sero avaliadas positivamente. Isto define o comportamento de MATCH() ...
AGAINST() sem o modificados IN BOOLEAN MODE.
< >
Estes dois operadores so usados para alterar a contribuio de uma palvara no valor de relevncia que tribudo a um registro. O operador < reduz a contribuio e o operador > a aumenta.
Veja o exemplo abaixo.
( )
Parenteses so usado para agrupar palavras em subexpresses.
580
~
Um til precedente atua como um operador de negao, tornando a contribuio da palavra para a
relevncia da linha ser negativa. Ele til para marcar palavras "ruidosas". Linhas com tais palavras tero uma avaliao mais baixa que outras, mas no ser excluda, como seria com o operador -.
*
Um asterisco um operador de truncamento. Diferente dos outros operadores, ele deve ser inserida ao fim da palavra, no deve ser precedente.
"
A frase que colocada entre aspas duplas ", coincidem apenas com linhas que contenha esta frase literalmente, como foi digitada.
apple banana
encontra linhas que contenha pela menos uma destas palavras.
+apple +juice
... ambas as palavras.
+apple macintosh
... palavra ``apple'', mas avaliada mais alto se tambm conter ``macintosh''.
+apple -macintosh
... palavra ``apple'' mas no ``macintosh''.
apple*
... ``apple'', ``apples'', ``applesauce'', e ``applet''.
"some words"
... ``some words of wisdom'', mas no ``some noise words''.
Pesquisas full-text pode ser usadas com UCS-2 (mas funcionam com UTF-8 a partir do MySQL
4.1.1).
Todos os parmetros da funo MATCH() devem ser colunas da mesma tabela que parte do
mesmo ndice FULLTEXT, a menos que MATCH() esteja IN BOOLEAN MODE.
581
A lista de coluna MATCH() deve casar exatamente a lista de colunas em algum definio de ndice FULLTEXT para a tabela, a menos que este MATCH() seja IN BOOLEAN MODE.
pela
variavel
A lista de palavras de parada pode ser carregada do arquivo especificado pela varivel
ft_stopword_file. See Seco 4.6.8.4, SHOW VARIABLES. Reconstrua o seu ndice
FULLTEXT depois de modificar a lista de palavras de parada. (Esta varvel s est disponvel a
partir do MySQL verso 4.0.10 e posterior)
O ponto inical de 50% determinado pelo esquema de pesagem particular escolhido. Para disabilit-lo, altere a seguinte linha em myisam/ftdefs.h:
#define GWS_IN_USE GWS_PROB
Para:
#define GWS_IN_USE GWS_FREQ
Ento recompile o MySQL. No h necessidade de reconstruir o ndice neste caso. Note: fazendo isto voc diminui em muito a habilidade do MySQL fornecer valores de relevncia adequados para a funo MATCH(). Se voc realmente precisa buscar por tais palavras comuns, seria
melhor faz-lo utilizando IN BOOLEAN MODE, que no observa o poonto inicial de 50%.
Algumas vezes o mantedor do mecanismo de busca gostaria de alterar os operadores usados por
busca full-text boolanas. Eles so definidos pela varivel ft_boolean_syntax. See Seco 4.6.8.4, SHOW VARIABLES. Ainda, esta varivel somente leitura; este valor est definido em myisam/ft_static.c.
Para mudanas full-text que exigem que voc reconstrua seu ndice FULLTEXT, o modo mais fcil
de faz-lo para uma tabela MyISAM usar a seguinte instruo, a qual reconstroi o arquivo de ndice:
582
Operadores de proximidade
Supporte para "always-index words". Elas poderiam ser quaisquer strings que o usurio quisesse
tratar como palavra, os exemplos so "C++", "AS/400", "TCP/IP", etc.
Suporte a UCS-2.
Se todas as consultas que voc estiver realizando forem simples (tais como selecionar um registro de uma tabela com um registro); mas ainda diferente daquelas em que as consultas no so
armazendas, a sobrecarga de ter a cache de consultas ativa de 13%. Este pode ser considerado
como o cenrio de pior caso. No entanto, na vida real, consultas so muito mais complicadas que
nosso exemplo simples, assim a sobrecarga , normalmente, significantemente menor.
Buscas depois de uma linha em uma tabela de uma linha 238% mais rpido. Isto pode ser considerado perto do mnimo de ganho a ser esperado para uma consulta que est armazenada.
Se voc quiser disabilitar o codigo da cache de consulta defina query_cache_size=0. Disabilitando o cdigo da cache de consultas no haver nenhuma sobrecarga notvel. (cache de consultas pode ser excludo do cdigo com ajuda da opo de conigurao -without-query-cache)
583
Funo
Funo
FOUND_ROWS
GET_LOCK
RELEASE_LOCK
LOAD_FILE
MASTER_POS_WAIT
NOW
SYSDATE
CURRENT_TIMESTAMP
CURDATE
CURRENT_DATE
CURTIME
CURRENT_TIME
DATABASE
RAND
BENCHMARK
Um consulta no pode ser armazenada em cache se conter variveis, referenciar o banco de dados
do sistema mysql, for da forma SELECT ... IN SHARE MODE, SELECT ... INTO OUTFILE ..., SELECT ... INTO DUMPFILE ... ou da forma SELECT * FROM AUTOINCREMENT_FIELD IS NULL (para retornar a ID da ultima insero - ODBC contorna este problema).
584
No entanto, FOUND_ROWS() retornar o valor correto, mesmo se a consulta precedente foi buscada
da cache.
No caso de uma consulta no utilizar qualquer tabela, ou utilizar tabelas temporrias, ou se o usurio
tiver um privilgio de coluna para qualquer tabela chamada, esta consulta no ser armazenada em
cache.
Antes de uma consulta ser trazida da cache de consulta, o MySQL ir verificar se o usurio com privilgio SELECT para todos os banco de dados e tabelas envolvidos. Se este no for o caso, o resultado em cache no ser usado.
query_cache_min_res_unit
Esta varivel est presente a partir da verso 4.1.
O resultado de uma consulta (os dados que tambm so enviados ao cliente) armazenado na
cache de consulta durante o recuperao do resultado. Consequentemente o dado normalmente
no tratado em um grande bloco. A cache de de conaultas aloca blocos para armazenar o dado
em demanda, assim quando um bloco preenchido, um novo bloco alocado. Como a operao
de alocao de memria caro, a cache de consulta aloca blocos com um tamanho mnimo de
query_cache_min_res_unit. Quando a consulta executada, o ltimo bloco do resultado
cortado para o tamanho atual do dado, assim a memria sem uso liberada.
Se voc tiver vrias consultas com resultados pequenos, o tamanho padro do bloco pode levar a fragmentao de memria (indicado por um grande nmero de blocos livres (Qcache_free_blocks), que podem fazer a cache de consultas deletar consultas da cache devido a perda de memria) (Qcache_lowmem_prunes)). Neste caso voc deve diminuir
query_cache_min_res_unit.
query_cache_size A quantidade de memria (especificada em bytes) alocada para armazenar resultados de consultas antigas. Se ele for 0, a cache de consultas est desbilitada (padro).
Descrio
Dentro de uma thread (conexo), o comportamento da cache de consulta pode ser alterado do padro. A sintaxe a seguinte:
585
Descrio
0 or OFF
1 or ON
2 or DEMAND
Descrio
SQL_CACHE
SQL_NO_CACHE Faz esta consulta no armazenvel em cache, no permite que esta consulta seja armazenada em cache.
Descrio
Qcache_queries_in_cache
Qcache_inserts
Qcache_hits
Qcache_lowmem_prunes
Qcache_not_cached
Qcache_free_memory
Qcache_free_blocks
Qcache_total_blocks
586
587
Captulo
MySQL
7.
Tipos
de
Tabela
do
No MySQL Verso 3.23.6, voc pode escolher entre 3 formatos de tabelas bsicos (ISAM, HEAP e
MyISAM). Verses mais novas do MySQL suportam tipos de tabelas adicionais (InnoDB ou BDB),
dependendo de como voc o compila. Um banco de dados pode conter tabelas de diferentes tipos.
Ao criar uma nova tabela, voc pode dizer ao MySQL que tipo de tabela criar. O tipo de tabela padro , normalmente, MyISAM.
MySQL sempre criar um arquivo .frm para guardar as definies de coluna e tabela. Os ndices e
dados da tabela sero armazenados em um ou mais arquivos, dependendo do tipo de tabela.
Se voc tentar utilziar um tipo de tabela que no est ativa ou no foi compilada com o MySQL, ele
ir criar uma tabela do tipo MyISAM. Este comportamento conveniente quando voc quer copiar
tabelas entre servidores MySQL que suportam tipos de tabel;as diferentes. (Talvez o seu servidor
master suporte mecanismos de armazenamento tarnsacionais para aumento de segurana, enquanto o
servidor slave s utiliza mecanismos de aramazenamento no-transacionais para maior velocidade.)
Esta mudanaautomatica de tipos de tabela podem confuso para novos usurios MySQL. Planejamos arrumar isto introduzindo avisos no protocolo cliente/servidor na verso 4.1 e gerar um aviso
quando uma tipo de tabela automaticamente alterado.
Voc pode converter tabelas entre tipos diferentes com a instruo ALTER TABLE. See Seco 6.5.4, Sintaxe ALTER TABLE.
Note que o MySQL suporta dois tipos diferentes de tabelas: tabelas seguras com transao (InnoDB and BDB) e tabelas no seguras com tarnsao HEAP, ISAM, MERGE, e MyISAM).
Vantagens de tabelas seguras com transao (TST):
Mais segura. Mesmo se o MySQL falhar ou se voc tiver problemas com hardware, voc pode
ter os seus dados de volta, ou atravs de recuperao automatica ou de um backup + o log de
transao.
Voc pode combinar muitas instrues e aceitar todas de uma vez com o comando COMMIT.
Voc pode executar um ROLLBACK para ignorar suas mudanas (se voc no estiver rodando
em modo auto-commit).
Se uma atualizao falhar, todas as suas mudanas sero restauradas. (Com tabelas NTST todas
as mudanas que tiverem sido feitas so permanentes).
Pode fornecer melhor concorrncia se a tabela obter muitas atualizaes concorrentes com leituras.
Note que para utilizar tabelas InnoDB voc tem que usar pelo menos a opo de inicializao innodb_data_file_path. See Seco 7.5.3, Opes de Inicializao do InnoDB.
Vantagens de tabelas no seguras com transao (NTST):
588
Voc pode combinar tabelas TST e NTST na mesma instruo para obter o melhor dos dois mundos.
Existe um parmetro no arquivo MyISAM que indica se a tabela foi fechada corretamente. Se o
mysqld iniciado com --myisam-recover, tabelas MyISAM sero automaticamente verificadas e/ou reparadas na abertura se a tabela no foi fechada apropriadamente.
Voc pode INSERIR novas linhas em uma tabela que no tenha blocos livres no meio do arquivo de dados, na mesma hora outras threadas so lidas da tabela (insero concorrente). Um bloco livre pode vir de uma atualizao de uma linha de tamanho dinmico com muitos dados para
uma linha com menos dados ou ao deletarmos linhas. Quando todos os blocos livres so usados,
todas as inseres futurs sero concorrentes de novo.
Todo dado armazenado com byte mais baixo primeiro. Isto torna a mquina e SO independentes. A nica exigncia para a portabilidade do arquivo binrio que a a mquina utilize inteiros
com sinais em complemento de dois (como toda a mquina nos ltimos 20 anos tem) e formato
de pontos flutuante IEEE (tambm totalmente dominante entre mquinas mainstream). A nica
rea de mquinas que no podem suportar compatibilidade binria so sistemas embutidos
(porque eles, algumas vezes, tem processadores peculiares).
No h uma grande perda de velocidade em armazenar o byte mais baixo de dados primeiro; os
bytes em um registro de tabela esto normalmente desalinhados e isto no d muito poder de leitura do byte desalinhado em outra ordem alm da ordem reversa. O cdigo atual busca-valor-coluna tambm no crtico em relao ao tempo comparado a outro cdigo.
Todas as chaves numricas esto armazendas com o byte mais alto em primeiro para conseguir
melhor compactao do ndice.
Tratamento interno de uma coluna AUTO_INCREMENT. MyISAM ir atualiz-lo automaticamenteem um INSERT/UPDATE. O valor AUTO_INCREMENT pode ser zerado com myisamchk. Ele far colunas AUTO_INCREMENT mais rpidas (pelo menos 10%) e nmeros natigos no iro reutilizar como no antigo ISAM. Note que quando um AUTO_INCREMENT definido no fim de uma chave multi-parte o comportamento antigo ainda est presente.
Ao inserir ordenandamente (como quando se utiliza colunas AUTO_INCREMENT) a rvore chave ser separada de forma que o nodo mais alto contenha apenas uma chave. Isto ir aumentar a
utilizao de espao na rvore de chaves.
O tamanho mximo da chave de 500 bytes por padro (pode ser alterado recomopilando). No
caso de chaves maiores que 250 bytes, um tamanho de bloco de chave maior que o padro de
1024 bytes usado para esta chave.
589
Nmero mximo de chaves/tabelas 32 por padro. Isto pode ser aumentado para 64 sem ser necessrio recompilar myisamchk.
myisamchk marcar as tabelas como verificadas se algum execut-las sem -update-state. myisamchk --fast s verificar aquelas tabelas que no tenham esta
marca.
myisamchk -a armazena estatsticas para partes de chaves(e no apenas para toda a chave como no ISAM).
Linhas de tamanho dinmico sero agora muito menos fragmentados quando misturar delees
com atualizaes e inseres. Isto feito combinando automaticamente blocos deletados adjacentes e extendendo blocos se o prximo bloco deletado.
Voc pode colocar arquivos de dados e ndices em diretrios diferentes para obter maior velocidade (com a opo DATA/INDEX DIRECTORY="caminho" para CREATE TABLE). See
Seco 6.5.3, Sintaxe CREATE TABLE.
MyISAM tambm suporta os seguintes itens, os quais o MySQL estar apto a utilizar em um futuro
prximo:
Suporte a tipos VARCHAR reais; uma coluna VARCHAR inicia com um tamanho armazenado em
2 bytes.
VARCHAR e CHAR podem ser maior que 64K. Todos os segmentos de chaves tm a sua prpria
definio de linguagem. Isto habilitar o MySQL para ter diferentes definies de linguagens
por coluna.
Um ndice computado em hash pode ser usado para UNIQUE. Isto lhe permitir ter UNIQUE em
qualquer combinao de colunas na tabela. (Voc no pode procurar em um em um ndice computado UNIQUE, de qualquer forma.)
Note que os arquivos de ndice so muito menores com MyISAM que com ISAM. Isto significa que
MyISAM usar normalmente menos recursos do sistema que ISAM, mas precisar de mais tempo de
CPU quando inserir dados em um ndice compactado.
As seguintes opes para mysqld podem ser usadas para alterar o comportamento de tabelas MyISAM. See Seco 4.6.8.4, SHOW VARIABLES.
Opo
Descrio
--myisam-recover=#
-O
myi- Buffer utilizado ao recuperar tabelas.
sam_sort_buffer_size=#
--delay-key-write=ALL
-O
myi- Usada paa ajudar o MySQL a decidir quando utilzar o msam_max_extra_sort_file_si todo lento, mas seguro, de criao de ndices de cache de
ze=#
chaves. Note este parmetro dado em megabytes antes da
verso 4.0.3 e em bytes a partir desta verso.
-O
myi- No utilzia o mtodo rpido de ordenao de ndice para
sam_max_sort_file_size=#
criar ndices se o arquivo temporrio se tornasse maior que
o valor dado. Note que este parmetro dado em megabytes antes da verso 4.0.3 e em bytes a partir desta verso.
-O
bulk_insert_buffer_size=#
Se encontrarmos um erro, tente fazer um reparao rpida (com ordenao e sem recriar o arquivo de dados) da tabela.
Se o reparao falhar devido a um erro no arquivo de dados (por exemplo um erro de chave duplicada), feita uma nova tentativa, mas desta vez o arquivo de dados recriado.
Se a reparao falhar, tente mais uma vez com o antigo mtodo de opo de reparao (escrever
linha a linha sem ordenao) o qual deve estar apto a reparar qualquer tipo de erros com pequenas exigncias de disco.
Se a recuperao no estiver apta a recuperar todas as linhas de uma instruo completada previamente e voc no especificou FORCE como uma opo para myisam-recover, ento a reparao
automtica abortar com uma mensagem de erro no arquivo de erros:
Error: Couldn't repair table: test.g00pages
Caso voc tenha utilizado a opo FORCE, voc ir obter um aviso no arquivo de erro:
Warning: Found 344 of 354 rows when repairing ./test/g00pages
Note que se voc executar uma recuperao automtica com a opo BACKUP, voc deve ter um
script cron que mova automaticamente arquivos com nome como tablename-datetime.BAK
do diretrio de banco de dados para uma media de backup.
See Seco 4.1.1, Opes de Linha de Comando do mysqld.
Todas as colunas CHAR, NUMERIC, e DECIMAL tem espaos adicionados at o tamanho da coluna.
muito rpida.
Fcil de reconstruir depois de uma falha, pois os registros esto localizados em posies fixas.
No precisa ser reorganizada (com myisamchk) a menos que um grande nmero de registros
sejam deletados e voc queira retornar espao de diaco livre ao sistema operacional.
Todas as colunas string so dinmicas (exceto aquelas com tamanho menor que 4).
Cada registro precedido por um mapa de bits indicando quais colunas esto vazias ('') para
colunas string ou zero para colunas numricas (Isto diferente de colunas contendo valores
NULL). Se uma coluna de string tem um tamanho de zero depois da remoo de espaos extras,
ou uma coluna numrica tem um valor de zero, isto marcado no mapa de bits e no salvado
em disco. Strings no vazias so salvas como um byte de tamanho mais o conteudo da string.
Geralmente utiliza muito menos espao de disco que tabelas de tamanho fixo.
592
Cada registro utiliza apenas o espeo necessrio. Se um registro aumenta, ele separado em varios pedaos, de acordo com a necessidade. Isto resulta em fragmentao do registro.
Se voc atualiza uma linha com informaes que ultrapassam o seu tamanho, a linha ser fragmentada. Neste caso, voc pode precisar executar myisamchk -r de tempos em tempos para
obter melhor performance. Use myisamchk -ei nome_tabela para algumas estatsticas.
No fcil de recontru-la aps uma falha, pois um registro pode ser fragmentado em muitos pedaos e um link (fragmento) pode ser perdido.
(nmero
(nmero
tamanho
tamanho
(nmero
de colunas + 7) / 8
de colunas char)
empacotado de colunas numricas
das strings
de colunas NULL + 7) / 8
Existe uma penalidade de 6 bytes para cada link. Um registro dinmico ligado sempre que uma
atualizao causa um aumento do registro. Cada novo link ter pelo menos 20 bytes, assim o
prximo aumento estar, provavelemente, no mesmo link. Se no, haver outro link. Voc pode
checar quantos links existem com myisamchk -ed. Todos os links podem ser removidos com
myisamchk -r.
Todas as distribuies MySQL, mesmo aquelas existentes antes do MySQL se tornar GPL, podem ler tabelas que forma compactadas com myisampack.
Tabelas compactadas utilizam muito pouco espao em disco. Isto minimiza o uso de disco, o que
muito bom quando se utiliza discos lentos (com CD-ROMs).
Cada registro compactado separadamente (pouca sobrecarga de acesso). O cabealho de um registro fixo (1-3 bytes) dependendo do maior registro na tabela. Cada coluna compactada diferentemente. Alguns dos tipos de compactao so:
Se os valores em uma coluna inteira tem uma faixa pequena, a coluna armazenada usando
o menor tipo possvel. Por exemplo, uma coluna BIGINT (8 bytes) pode ser armazenada como uma coluna TINYINT (1 byte) se todos os valores esto na faixa de 0 a 255.
Se uma coluna tem apenas um pequeno conjunto de valores possveis, o tipo de coluna
convertido para ENUM.
593
Um erro de hardware.
Voc estar usando um programa externo (como myisamchk) em uma tabela aberta.
Voc obtem o erro Incorrect key file for table: '...'. Try to repair
it enquanto seleciona dados da tabela.
Voc pode verificar se uma tabela est ok com o comando CHECK TABLE. See Seco 4.5.4,
Sintaxe de CHECK TABLE.
Voc pode repara um tabela corrompida com REPAIR TABLE. See Seco 4.5.5, Sintaxe do REPAIR TABLE. Voc tambm pode repar-la, quando o mysqld no estiver em execuo com o
comando myisamchk. sintaxe myisamchk.
Se a sua tabela estiver muito corrompida voc deve tentar encontrar o razo! See Seco A.4.1, O
Que Fazer Se o MySQL Continua Falhando.
Neste caso, a coisa mais importante de saber se a tabela foi corrompida porque o mysqld foi finalizado (pode se verificar isto facilmente verificando se h uma linha restarted mysqld recente
no arquivo de erro do mysql. Se este no o caso, ento voc deve tentar fazer um caso de teste disto. See Seco E.1.6, Fazendo um Caso de Teste Se Ocorre um Corrompimento de Tabela.
594
Quando voc raparar a tabela ou verific-la e ela estiver ok, o contador zerado.
Para evitar problemas com interaes com outros processos que podem fazer uma verificao na
tabela, o contador no decrementado no fechamento se ele for 0.
O MySQL ter falhado entre uma atualizao e o fechamento final. (Note que a tabela pode ainda
estar ok j que o MySQL sempre faz escritas de tudo entre cada instruo.)
Muitos servidores mysqld estrem usando a tabela e um deles tiver feito um REPAIR ou
CHECK da tabela enquanto ela estava em uso por outro servidor. Nesta configurao o CHECK
seguro de se fazer (mesmo se voc obter ovisos de outros servidor), mas REPAIR deve ser evitado pois ele atualmente substitui o arquivo de dados por um novo, o qual no mostrado para
os outros servidores.
Facilidade de gernciamento de um conjunto de log de tabelas. Por exemplo, voc pode colocar
dados de meses diferentes em arquivos separadosfrom different months into separate files, compress some of them with myisampack, and then create a MERGE to use these as one.
Lhe da maior velocidade. Voc pode separar uma grande tabela somente leitura baseado em algum critrio e ento colocar as diferentes partes da tabela em discos diferentes. Uma tabela
MERGE desta forma pode ser muito mais rpida que se usada em uma grande tabela. (Voc pode,
claro, usar tambm um nvel RAID para obter o memo tipo de benefcio.)
Faz pesquisas mais eficientes. Se voc sabe exatamente o que voc esta procurando, voc pode
buscar em apenas um dos pedaos da tabelas para algumas pesquisas e utilizar tabelas MERGE
para outras. Voc pode at ter diferentes tabelas MERGE ativas, com possveis arquivos sobrepostos.
Reparaes mais eficientes. facil reparar os arquivos individuais que so mapeados para um
arquivo MERGE que tentar reparar um arquivo realmente grande.
Mapeamento instantneo de diversos arquivos como um. Uma tabela MERGE usa o ndice de tabelas individuais. No necessrio manter um ndice de para ela. Isto torna a coleo de tabelas
MERGE MUITO rpido de fazer ou remapear. Note que voc deve especificar a definio de chave quando voc cria uma tabela MERGE!.
Se voc tem um conjunto de tabelas que voc junta a uma tabela grande por demanda ou bacth,
voc deveria criar uma tabela MERGE delas por demanda. Isto muito mais rpido economizar bastante espao em disco.
Voc pode criar um apelido/sinnimo para uma tabela usando MERGE sobre uma tabela. No deve haver nenhum impacto notvel na performance ao se fazer isto (apenas algumas chamadas indiretas e chamadas de memcpy() para cada leitura).
REPLACE no funciona.
Tabelas MERGE usam mais descritores de arquivos. Se voc estiver usando uma tabela MERGE
que mapeia mais de 10 tabelas e 10 usurios a esto usando, voc est usando 10*10 + 10 descritores de arquivos. (10 arquivos de dados para 10 usurios e 10 arquivos de ndices compartilhados).
A leitura de chaves lenta. Quando voc faz uma leitura sobre uma chave, o mecanismo de armazenamento MERGE precisar fazer uma leitura em todas as tabelas para verificar qual casa
melhor com a chave dada. Se voc ento fizer uma "leia prximo", o mecanismo de armazenamento MERGE precisar procurar os buffers de leitura para encontrar a prxima chave. Apenas
quando um buffer de chaves usado, o mecanismo de armazenamento precisar ler o prximo
bloco de chaves. Isto torna as chaves MERGE mais lentas em pesquisas eq_ref, mas no em
pesquisas ref. See Seco 5.2.1, Sintaxe de EXPLAIN (Obter informaes sobre uma SELECT).
Voc no pode fazer DROP TABLE, ALTER TABLE, DELETE FROM nome_tabela sem
uma clusula WHERE, REPAIR TABLE, TRUNCATE TABLE, OPTIMIZE TABLE, ou
ANALYZE TABLE em nenhuma das tabelas que mapeada por uma tabela MERGE que est
"aberta". Se voc fizer isto, a tabela MERGE pode ainda se referir a tabela original e voc obter
resultados inexperados. O modo mais fcil de contornar esta deficincia e atravs do comando
FLUSH TABLES, assegurando que nenhuma tabela MERGE permanecer "aberta".
Quando
voc
cria
uma
tabela
MERGE
596
voc
deve
especificar
com
UNI-
ON=(lista-de-tabelas) quais tabelas voc quer usar com uma. Opcionalmente voc pode
especificar com INSERT_METHOD se voc quer que inseres em tabelas MERGE ocorram na primeira ou na ltima tabela da lista UNION. Se voc no especificar INSERT_METHOD ou especificar
NO, entao todos os comandos INSERT na tabela MERGE retornaro um erro.
O seguinte exemplo lhe mostra como utilizaqr tabelas MERGE:
CREATE
CREATE
INSERT
INSERT
CREATE
Alterar o arquivo .MRG e executar um FLUSH TABLE na tabela MERGE e todas as tabelas selecionadas para forar o mecanismo de armazenamento a ler o novo arquivo de definio.
Uma tabela MERGE no pode manter restries UNIQUE sobre toda tabela. Quando voc faz um
INSERT, os dados vo para a primeira ou ltima tabela (de acordo com INSERT_METHOD=xxx) e estas tabelas MyISAM asseguram que os dados so nicos, mas no se
sabe nada sobre outras tabelas MyISAM.
RENAME TABLE em uma tabela usada por uma tabela MERGE ativa pode corromper a tabela.
Isto ser corrigido no MySQL 4.1.x.
Criao de uma tabela do tipo MERGE no verifica se o tabelas selecionadas so de tipos compatveis ou se elas existem. O MySQL far uma verificao rpida de se o tamanho do registro
igual entre tabelas mapeadas quando a tabela MERGE usada, mas esta no uma verificao total.
Se voc usar tabelas MERGE deste modo, voc poder obter problemas estranhos.
Se voc usar ALTER TABLE para adicionar primeiro um ndice UNIQUE em uma tabela usada
em uma tabela MERGE e ento usar ALTER TABLE para adicionar um ndice normal na tabela
MERGE, a ordem da chave ser diferente para as atabelas se houvesse uma chave no nica antiga na tabela. Isto ocorre porque ALTER TABLE coloca chaves UNIQUE antes de chaves normais para estar apto a detectar chaves duplicadas o mais rpido possvel.
DROP TABLE em uma tabela que est em uso por uma tabela MERGE no funcionar no Windows porque o mecanismo de armazenamento MERGE faz o mapeamento da tabela escondido da
camada mais alta do MySQL. Como o Windows no permite que voc apague arquivos que estejam abertos, voc deve primeiro descarregar todas as tabelas MERGE (com FLUSH TABLES)
ou apagar a tabela MERGE antes de apagar a tabela. Ns consertaremos isto assim que introduzirmos VIEWs.
A maioria das coisas que so verdadeiras para tabelas MyISAM tambm so verdadeiras para tabelas
ISAM. See Seco 7.1, Tabelas MyISAM. As maiores diferenas comparados a tabelas MyISAM
so:
598
Se voc quiser converter uma tabela ISAM em uma tabela MyISAM de forma a se poder utilizar utilitrios tais como mysqlcheck, use uma instruo ALTER TABLE:
mysql> ALTER TABLE nome_tabela TYPE = MYISAM;
A verses embutidas do MySQL no supoortam tabelas ISAM.
Voc sempre deve utilizar a especificao MAX_ROWS na instruo CREATE para assegurar que
voc no ir utilizar toda a memria acidentalmente.
Tabelas HEAP s podem usar chaves inteiras para procurar por uma linha; compare isto a tabelas
MyISAM onde qualquer prefixo de chave pode ser usada para encontrar linhas.
Voc pode ter chaves no nicas em uma tabela HEAP (isto no comum em tabelas com hash).
Tabelas HEAP so compartilhadas entre todos os clientes (como qualquer outra tabela).
Voc no pode pesquisar pela prxima entrada na ordem (isto , usar o ndice para fazer um
ORDER BY).
Dados de tabelas HEAP so alocados em blocos menores. As tabelas so 100% dinmicas (na insero). No so necessrias areas excessivas e espao de chave extra. Linhas deletadas so colocadas em uma lista encadeada e so reutilizadas quando voc insere novos dados na tabela.
Voc precisa de memria extra suficiente para todas as tabelas HEAP que voc quiser utilizar ao
mesmo tempo.
599
Para liberar memria, voc deve executar DELETE FROM tabela_heap, TRUNCATE tabeala_heap ou DROP TABLE tabela_heap.
O MySQL no pode descobrir aproximadamente quantas linhas existem entre dois valores (isto
utilizado pela atimizador de escala para decidar qual indice usar). Isto pode afetar algumas
consultas se voc alterar uma tabela MyISAM para uma tabela HEAP.
Para assegurar que voc no vai cometer nenhum erro acidentalmente, voc no pode criar tabelas HEAP maiores que max_heap_table_size.
padro.
Se voc tiver feito o download de uma verso binria do MySQL que inclui suporte para InnoDB,
simplesmente siga as instrues do manual do MySQL para instalar um vrso binria do MySQL.
Se voc j tem o MySQL-3.23 instalado, ento o modo mais simples de instalar MySQL -Max
substituir i executvel do servidor mysqld com o executvel correspondente na distribuio -Max.
MySQL e MySQL -Max diferem apenas no executvel do servidor. See Seco 2.2.9, Instalando
uma Distribuio Binria do MySQL. See Seco 4.8.5, mysqld-max, om servidor mysqld extendido.
Para compilar o MySQL com suoprte a InnoDB, faa o download do MySQL-3.23.34a ou posterior
de http://www.mysql.com/ e configure o MySQL com a opo --with-innodb. Veja o manual
MySQL sobre como instalar uma distribuio fonte. See Seco 2.3, Instalando uma distribuio
com fontes do MySQL.
cd /caminho/para/fonte/mysql-3.23.37
./configure --with-innodb
Para utiliar tabelas InnoDB no MySQL-Max-3.23 voc deve especificar parmetros de configurao
na seo [mysqld] do arquivo de configurao my.cnf, ou no Windows opcionalmente em
my.ini.
No mnimo, na verso 3.23 voc deve especificar innodb_data_file_path onde voc especificar o nome e tamanho dos arquivos de dados. Se voc no mencionar innodb_data_home_dir em my.cnf o padro criar estes arquivoas no diretorio_dados
do MySQL. Se voc especificar innodb_data_home_dir como uma string vazia, ento voc
pode dar caminhos absolutos ao seu arquivo de dados em innodb_data_file_path.
O modo mnimo de modificar de adicionar a seo [mysqld] a linha
innodb_data_file_path=ibdata:30M
mas para obter melhor desempenho melhor que voc especifique as opes como recomendado.
See Seco 7.5.3, Opes de Inicializao do InnoDB.
exemplo:
innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:100M:autoextend
instrui InnoDB a criar apenas um nico arquivo de dados com tamanho inicial de 100 MB e que
extendido em blocos de 8 MB quando o espao acabar. Se o disco ficar cheio voc pode querer adicionar outro arquivo de dados a outro disco, por exemplo. Ento voc tem que olhar o tamanho de
ibdata1, arredondar o tamanho para baixo at o mltiplo de 1024 * 1024 bytes (= 1 MB) mais
prximo, e especificar o tamanho arredondado de ibdata1 explicitamente em innodb_data_file_path. Depois disto voc pode adicionar outros arquivos de dados:
innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend
Tenha cuidado com sistema de arquivos onde o tamanho mximo do arquivo 2 GB. O InnoDB no
est ciente disto. Neste sistemas de arquivos voc pode querer especificar o tamanho mximo para o
arquivo de dados:
innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M
Um exemplo de my.cnf simples. Suponha que voc tenha um computador com 128 MB RAM e
um disco rgido. Abaixo est o exemplo dos parmetros de configurao possveis para my.cnf ou
my.ini para o InnoDB. Ns consideramos que voc est executando MySQL-Max-3.23.50 ou
posterior, our MySQL-4.0.2 ou posterior. Este exemplo serve para a maioria dos usurios, tanto em
Unix e Windows, que no querem distribuir arquivos de dados InnoDB e arquivos de log em vrios
discos. Isto cria um arquivo de dados ibdata1 auto-extensvel e dois arquivos de log
ib_logfile0 e ib_logfile1 do InnoDB no datadir do MySQL (normalmente /
mysql/data). O arquivo de log ib_arch_log_0000000000 do InnoDB tambm fica em
datadir.
[mysqld]
# Voc pode escrever outras opes do servidor MySQL aqui
# ...
#
Arquivos de dados deve estar aptos
#
a guardar os seus dados e ndices.
#
Esteja certo que voc tem espao
#
livre suficiente em disco.
innodb_data_file_path = ibdata1:10M:autoextend
#
Defina o tamanho da rea de buffer com
#
50 - 80 % da meria do seu computador
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=10M
#
Defina o tamanho do seu arquivo log
#
para 25 % da tamanho da rea de buffer
set-variable = innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=8M
#
Defina ..flush_log_at_trx_commit
#
com 0 se voc puder perder
#
algumas das ultimas trnsaes
innodb_flush_log_at_trx_commit=1
Check that the MySQL server has the rights to create files in datadir.
Note que os arquivo de dados devem ser < 2 GB em alguns sistemas de arquivos! O tamanho combinado do arquivos de log devem ser < 4 GB. O tamanho combinado dos arquivos de dados devem
ser >= 10 MB.
Quando voc criar um banco de dados pela primeira vez, melhor que voc inicie o servidor
MySQL do prompt de comando. Ento InnoDB ir imprimir a informao sobre a criao do banco
de dados na tela e voc poder ver o que est acontecendo. Veja abaixo na prxima seo como a
sada na tela se parece. Por exemplo, no Windows voc pode iniciar mysqld-max.exe com:
your-path-to-mysqld\mysqld-max --console
602
Se o seu PC utiliza um carrgador de boot onde o drive C: no o drive de boot, ento a sua nica opo usar o arquivo my.ini.
Onde especificar as opes no Unix? No Unix o mysqld l opes dos seguintes arquivos, se eles
existirem, na seguinte ordem:
[mysqld]
# Voc pode escrever outras opes do servidor MySQL aqui
# ...
innodb_data_home_dir =
#
Os arquivos de devem estar aptos a
#
guardar seus dados e ndices
innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoexte
#
Defina o tamanho da rea de buffer para
#
50 - 80 % da memria do seu computador,
#
mas esteja certo, no Linux x86, que o
#
total de memria usada < 2 GB
set-variable = innodb_buffer_pool_size=1G
set-variable = innodb_additional_mem_pool_size=20M
innodb_log_group_home_dir = /dr3/iblogs
603
#
.._log_arch_dir deve ser o mesmo
#
que .._log_group_home_dir
innodb_log_arch_dir = /dr3/iblogs
set-variable = innodb_log_files_in_group=3
#
Defina o tamanho do arquivo de log
#
para cerca de 15% do tamanho da
#
rea da buffer
set-variable = innodb_log_file_size=150M
set-variable = innodb_log_buffer_size=8M
#
Defina ..flush_log_at_trx_commit com
#
0 se voc puder permitir a perda de
#
algumas das ultimas transaes.
innodb_flush_log_at_trx_commit=1
set-variable = innodb_lock_wait_timeout=50
#innodb_flush_method=fdatasync
#set-variable = innodb_thread_concurrency=5
Note que ns colocamos os dois arquivos de dados em discos diferentes. O InnoDB preencher o tablespace de tabela formado pelos arquivos de dados de baixo para cima. Em alguns casos ele aumentar o desempenho do banco de dados se todos os dados no forem colocados no mesmo disco
fsico. Colocar os arquivos de log em discos diferentes dos de dados geralmente, benfico para o
desempenho. Voc pode usar parties de discos raw (dispositivos raw) como arquivos de dados.
Em alguns Unixs eles aumentam a E/S. Vejam a seo sobre gerenciamento de espao de arquivos
no InnoDB para saber como especific-los no my.cnf.
Aviso: no Linux x86 voc deve ter cuidado par no definir um uso de memria muito alto. glibc
permitir que o rea do processo cresa acima da pilha da thread, o que far com que o seu servidor
falhe. Isto um risco se o valor de
innodb_buffer_pool_size + key_buffer +
max_connections * (sort_buffer + read_buffer_size) + max_connections * 2 MB
prximo de 2 GB ou exceda 2 GB. Cada thread usar uma pilha (geralmente 2 MB, mas no binrio
da MySQL AB somente 256 KB) e no pior caso usar tmabm sort_buffer + read_buffer_size de memria adicional.
Como sintonizar outros parmetros do servidor mysqld? Valores comuns que servem para a
maioria dos usurios so:
skip-locking
set-variable
set-variable
set-variable
#
#
#
#
#
#
set-variable
= max_connections=200
= read_buffer_size=1M
= sort_buffer=1M
Defina key_buffer com 5 - 50%
de sua RAM dependendo de quanto
voc usa tabelas MyISAM, mas
mantenha key_buffer + tamanho da
rea de buffer do InnoDB < 80% de
sua RAM
= key_buffer=...
Note que alguns parmetros so dados usando o formato do parmetro numrico de my.cnf: setvariable = innodb... = 123, outros (parmetros string e booleanos) com outro formato:
innodb_... = ... .
O significado dos parmetros de configurao so os seguintes:
Opo
Descrio
innodb_file_per_table
innodb_data_home_dir
Caminho para os arquivos de dados individuais e os seus tamanhos. O caminho do diretrio completo para cada arquivo de dados obtido concatenando innodb_data_home_dir ao caminho
especificado aqui. O tamanho do arquivo especificado em megabytes, adicionando o 'M' depois da especificao do tamanho.
InnoDB tambm entende a abreviao 'G', 1 G significa 1024
MB. A partir da verso 3.23.44 voc pode definir o tamanho do
arquivo maior que 4 GB em sistemas operacionais que seuportam que suportam arquivos grandes. Em alguns sistemas operacionais arquivos devem ser menor que 2 GB. Se voc no especificar innodb_data_file_path, o comportamento padro a partir do verso 4.0 criar um arquivo de dados ibdata1 de 10 MB auto-extensvel. A soma do tamanho dos arquivos devem ser menores que 10 MB.
Tamanho de cada arquivo de log em um grupo de logs em megabytes. Faixa de valores sensveis de 1M a 1/n-th do tamanho
do rea de buffer especificado abaixo, onde n o nmero de arquivos de log no grupo. Quanto maior o valor, menos atividade de descarga necessria na rea de buffer, economizando E/
S de disco. Mas arquivos de log maiores tambm significa que a
recuperao ser lenta no caso de falhas. O tamanho combinado
do arquivo de log deve ser menor que 4GB em comutadores de
32 bits. O padro 5M.
O diretrio onde arquivos de log totalmente escritos seriam escritos se usarmos arquivamento de log. Atualmente o valor deste parmetro deve ser definido igual a innodb_log_group_home_dir.
605
innodb_log_archive
Atualmente este valor deve ser definido com 0. Como a recuperao ai partir de um backup deve ser feito pelo MySQL usando
os seus prprios arquivos de log, no h nenhuma necessidade
de se arquivos os arquivos de log do InnoDB.
innodb_buffer_pool_size
O tamanho do buffer de memria que o InnoDB usa para armazenar dados e ndices de suas tabelas. Quanto maior for este valor, menor ser a necessidade de E/S de disco para acessar dados na tabela. Em um servidor de banco de dados dedicado voc
pode definir este parmetro at 80% do tamanho da memria fsica da mquina. No atribua um valor muito alto, pois a competio da memria fsica pode causar paginao no sistema
operacional.
inTamanho da rea de buffer em Mb, se estiver localizado na menodb_buffer_pool_awe_m mria AWE do Windows 32 bits. Deiponvel a partir da verso
em_mb
4.1.0 e relevante apenas no Windows 32 bits. Se o seu Windows
suporta mais 4GB de memria, chamado Address Windowing
Extensions, voc pode alolcar a rea de buffer do InnoDB em
uma memria fsica AWE usando este parmetro. O maior valor
possvel para isto 64000. Se este parmetro for especificado,
ento innodb_buffer_pool_size a janela no espao de endereo
de 32 bits do mysqld onde o InnoDB mapeia aquela memria
AWE. Um bom valor para innodb_buffer_pool_size 500M.
inTamanho do pool da memria que o InnoDB utiliza para armanodb_additional_mem_po zenar informaes de dicionrio de dados e outras estruturas de
ol_size
dados internas. Um bom valor aqui pode ser 2M, mas quanto
mais tabelas voc tiver em sua aplicao, mais voc precisar
alocar aqui. Se o InnoDB ficar sem memria neste pool, ele l
comeara a alocar memria do sistema operacional e a escrever
mensagens de aviso no log de erro do MySQL.
innodb_file_io_threads Nmero de threads de E/S de arquivos no InnoDB. Normalmente ele deve ser 4, mas no Windows E/S de disco pode se beneficiar de um nmero maior.
inTempo limite em segundos que uma transao InnoDB pode esnodb_lock_wait_timeout perar por uma trava antes de fazer um roll back. InnodDB detecta automaticamente deadlocks de transaes em sua prpria
tabela bloqueada e faz um roll back da transao. Se voc utiliza o comando LOCK TABLES, ou outro mecanismo de armazenamento seguro com transaes diferente do InnoDB na mesma
transao, ento um deadlock pode crescer, o que no seria notificado pelo InnoDB. Nestes casos o tempo limite til para resolver a situao.
innodb_flush_method
innodb_force_recovery
Agora voc pode ver os diretrios de arquivos de dados e logs e voc ver os arquivos criados. O diretrio de log tambm ir conter um pequeno arquivo chamado ib_arch_log_0000000000.
Este arquivo foi resultado da criao do banco de dados, depois do InnoDB desligar o arquivamento
de log. Quando o MySQL for iniciado novamente, a sada ser a seguinte:
~/mysqlm/sql > mysqld
InnoDB: Started
mysqld: ready for connections
Voc criou um subdiretrio cujo nome igual ao arquivo de dados que voc especificou.
607
Se ocorrer algum erro na criao de banco de dados InnoDB, voc deve deletar todos os arquivos
criados pelo InnoDB. Isto significa todos os arquivos de dados, de log, o pequeno log arquivado e
no caso de voc j ter criado algumas tableas InnoDB, delete tambm os arquivos .frm correspondentes a estas tabelas do diretrio de banco de dados do MySQL. Ento voc pode tentar criar o
banco de dados InnoDB novamente.
608
No caso de um rollback demorado, se voc no tiver dados valiosos e seu banco de dados, melhor
que voc mate o processo de banco de dados, delete todos os arquivos de dados e de log do InnoDB
e todos os arquivos de tabela .frm e inicie o seu trabalho de novo, do que esperar que milhes de
E/Ss de disoc de complete.
609
Um exemplo:
CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB;
CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE SET NULL
) TYPE=INNODB;
Um exemplo complexo:
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(category, id)) TYPE=INNODB;
CREATE TABLE customer (id INT NOT NULL,
PRIMARY KEY (id)) TYPE=INNODB;
CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
product_category INT NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
PRIMARY KEY(no),
INDEX (product_category, product_id),
FOREIGN KEY (product_category, product_id)
REFERENCES product(category, id)
ON UPDATE CASCADE ON DELETE RESTRICT,
INDEX (customer_id),
FOREIGN KEY (customer_id)
REFERENCES customer(id)) TYPE=INNODB;
A partir da verso 3.23.50 o InnoDB lhe permite adicionar novas restrioes de chaves estrangeiras
a uma tabela.
ALTER TABLE seunomedetabela
ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES anothertablename(...)
[on_delete_and_on_update_actions]
Lembre-se de criar os ndices necessrios primeiro.
A partir da verso 4.0.13, o InnoDB suporta
ALTER TABLE suatabela DROP FOREIGN KEY id_chave_estrangeira_gerada_internamente
Voc tem que usar SHOW CREATE TABLE para daterminar as id's de chaves estrangeiras geradas
internamente quando voc apaga uma chave estrangeira.
Na verso anterior a 3.23.50 do InnoDB, ALTER TABLE ou CREATE INDEX no devem ser usadas em conexes com tabelas que tm restries de chaves estrangeiras ou que so refernciadas em
restries de chaves estrangeiras: Qualquer ALTER TABLE remove todas as restries de chaves
estrangeiras definidas na tabela. Voc no deve utilizar ALTER TABLE para tabela referenciadas
tambm, mas utilizar DROP TABLE e CREATE TABLE para modifcar o esquema. Quando o
MySQL faz um ALTER TABLE ele pode usar internamente RENAME TABLE, e isto ir confundir
a restrio de chave estrangeira que se refere a tabela. Uma instruo CREATE INDEX processada no MySQL como um ALTER TABLE, e estas restries tambm se aplicam a ele.
Ao fazer a verificao de chaves estrangeiras, o InnoDB define o bloqueio a nivel de linhas compartilhadas em registros filhos e pais que ele precisa verificar. O InnoDB verifica a restrio de chaves
estrangeiras imediatamente: a verificao no aplicada no commit da transaao.
Se voc quiser ignorar as restries de chaves estrangeiras durante, por exemplo um operao LOAD
DATA, voc pode fazer SET FOREIGN_KEY_CHECKS=0.
O InnoDB lhe permite apagar qualquer tabela mesmo que ela quebre a restrio de chaves estrangeira que referencia a tabela. Ao apagar um tabela restrio que definida na instruo create tambm
apagada.
610
Se voc recriar uma tabela que foi apagada, ela deve ter uma definio de acordo com a restrio de
chaves estrangeiras que faz referncia a ela. Ela deve ter os nomes e tipos de colunas corretor e deve
ter os ndices na chave referenciada como indicado acima. Se esta condio no for satisfeita, o
MySQL retornar o erro de nmero 1005 e se refere ao errno 150 na string de mensagem de erro.
A partir da verso 3.23.50 o InnoDB retorna da definio de chave estrangeira de uma tabela quando
voc chama
SHOW CREATE TABLE seunometabela
Assim o mysqldump tambm produz as difinies de tabelas corretas no arquivo dump e no se
esquece das chaves estrangeiras.
Voc tambm pode listar as restries de chaves estrangeiras de uma tabela T com
SHOW TABLE STATUS FROM seubancodedados LIKE 'T'
As restries de chaves estrangeiras so listadas no comentrio da tabela impresso na sada.
611
If you have a clean backup of an .ibd file taken from the SAME MySQL/InnoDB installation, you
can restore it to an InnoDB database with the commands:
ALTER TABLE tablename DISCARD TABLESPACE; /* CAUTION: deletes the current .ibd f
<put the backup .ibd file to the proper place>
ALTER TABLE tablename IMPORT TABLESPACE;
Clean in this context means:
Purge has removed all delete-marked index records from the .ibd file.
mysqld has flushed all modified pages of the .ibd file from the buffer pool to the file.
You can make such a clean backup .ibd file with the following method.
Stop all activity from the mysqld server and commit all transactions.
Wait that SHOW INNODB STATUS\G shows that there are no active transactions in the database, and the main thread of InnoDB is Waiting for server activity. Then you can take a copy of the .ibd file.
Start a second mysqld server on the backup and let it clean up the .ibd files in the backup.
It is in the TODO to allow moving clean .ibd files also to another MySQL/InnoDB installation.
That requires resetting of trx id's and log sequence numbers in the .ibd file.
Finalize o seu banco de dados MySQL e certifique-se de que ele finalizou sem erros.
Alm de fazer um backup de binrio descrito acima, voc tambm deve fazer um dump da sua tabela com mysqldump. A razo para se fazer isto que um arquivo binrio pode ser corrompido cem
voc perceber. Dumps de tabelas so armazenados em um arquivo texto legvel e muito mais simples que arquivos binrios de banco de dados. Ver tabelas corropidas atravs de arquivos de dump
mais fcil e, como o seu formato simples, a chance dos dados se corromperem seriamente so bem
menores.
Uma boa idia fazer dumps ao mesmo tempo que voc faz o backup de binrio do seu banco de
dados. Voc tem que fechar todos os bancos de dados nos clientes para ter uma cpia consistente de
todas as suas tabelas em seu dump. Ento voc pode fazer o backup de binrio e voc ter uma cpia
consistente de seu banco de dados em dois formatos.
Para se poder recuperar o seu banco de dados InnoDB atravs do backup de binrio descrito acima,
voc tem que executar o seu banco de dados MySQL com o sistema de log geral e o arquivamento
de log do MySQL ligado. Com sistema de log geral ns queremos dizer o mecanismo de log do servidor MySQL que independente dos logs do InnoDB.
Para recuperao de falhas do seu processo do servidor MySQL, a nica coisa que voc deve fazer
reinici-lo. InnoDB verificar automaticamente os logs e realizar um roll-forward do banco de dados para o situao atual. O InnoDB far automaticamente um roll back de transaes sem commit
existentes no momento da falha. Durante a recuperao, InnoDB ir imprimir algo como o seguinte:
~/mysqlm/sql > mysqld
InnoDB: Database was not shut down normally.
InnoDB: Starting recovery from log files...
InnoDB: Starting log scan based on checkpoint at
InnoDB: log sequence number 0 13674004
InnoDB: Doing recovery: scanned up to log sequence number 0 13739520
InnoDB: Doing recovery: scanned up to log sequence number 0 13805056
InnoDB: Doing recovery: scanned up to log sequence number 0 13870592
InnoDB: Doing recovery: scanned up to log sequence number 0 13936128
...
InnoDB: Doing recovery: scanned up to log sequence number 0 20555264
InnoDB: Doing recovery: scanned up to log sequence number 0 20620800
InnoDB: Doing recovery: scanned up to log sequence number 0 20664692
InnoDB: 1 uncommitted transaction(s) which must be rolled back
InnoDB: Starting rollback of uncommitted transactions
InnoDB: Rolling back trx no 16745
InnoDB: Rolling back of trx no 16745 completed
InnoDB: Rollback of uncommitted transactions completed
InnoDB: Starting an apply batch of log records to the database...
613
2 (SRV_FORCE_NO_BACKGROUND) evita que a thread principal seja executada: se uma falha ocorresse na remoo, isto seria evitado.
4 (SRV_FORCE_NO_IBUF_MERGE) tambm previne operaes merge no buffer de inseres: se eles causassem falhar, melhor no faz-los; no calcula as estatsticas da tabelas;
O InnoDB implementa um mecanismo de ponto de verificao chamado fuzzy checkpoint. O InnoDB descarregar pginas de banco de dados modificados da res de buffer em pequenos grupos.
No h necessidade de descarregar a rea de buffer em um nico grupo, o que iria, na prtica, para o
processamento da instruo SQL do usurio por um instante.
Na recuperao de falhas o InnoDB procura por um rotulo de ponto de verificao escrito nos arquivos de log. Ele sabe que todas as modificaes no banco de dados anteriores ao rtulo j esto presentes na imagem em disco do banco de dados. O InnoDB varre os arquivos de log a partir do ponto
de verificao apicando as modificaes registradas no banco de dados.
O InnoDB escreve no arquivo de log de um modo circular. Todas as modificaes efetivadas que
tornam a pagina de banco de dados na rea de buffer diferente das imagens em disco devem estar
disponveis no arquivo de log no caso do InnoDB precisar fazer uma recuperao. Isto significa que
quando O InnoDB comea a reutilizar um arquivo de log no modo circular, ele deve estar certo de
que imagens em disco da pagina de banco de dados j contm as modificaes registradas no arquivo de log que o InnoDM ir utilizar. Em outras palavras, o InnoDB precisa criar um ponto de verificao e geralmente isto envolve descarga de pginas de banco de dados modificados para o disco.
O exposto acima explica o porque que fazer o seu arquivo de log muito maior pode economizar E/S
de disco com pontos de verificao. Pode fazer sentido configurar o tamanho do arquivo de log to
grande quanto a rea de buffer ou mesmo maior. O problema com arquivos de log grandes que a
recuperao de falhas pode ser mais demorada pois haver mais itens a se aplicar ao banco de dados.
mit usado no MySQL, ento cada instruo SQL forma uma nica transao. O MySQL sempre
inicia uma nova conexo com o modo autocommit ligado.
Se o modo autocommit desligado com SET AUTOCOMMIT = 0, ento podemos achar que um
usurio sempre tem uma transao aberta. Se for executada uma instruo SQL COMMIT ou ROLLBACK, a transao atual finalizada e uma nova iniciada. Ambas instrues liberaro todas as travas do InnoDB que foram definidas durante a transao atual. Um COMMIT significa que as alteraes feitas na transao atual se tornam permanentes e visveis a outros usurios. Uma instruo
ROLLBACK, por outro lado, cancela todas as modificaes feitas pela transao corrente.
Se a conexo tem AUTOCOMMIT = 1, ento o usurio pode ainda relaizar uma transao multiinstruo iniciando-a com START TRANSACTION ou BEGIN e finalizando-a com COMMIT ou
ROLLBACK.
READ UNCOMMITTED Tambm chamada ``dirty read'': SELECTs sem bloqueio so realizados de forma a no procurar por uma possvel verso mais nova de um registro; assim as leituras
no so 'consistentes' sob este nvel de isolamento; de outra forma este nvel funciona como READ COMMITTED.
616
READ COMMITTED Nvel de isolamento parecido com o Oracle. Todas as instrues SELECT
... FOR UPDATE e SELECT ... LOCK IN SHARE MODE s travam o registro de ndice, no a lacuna antes dele e assim permite livre insero de novos registros prximo ao registro
travado. Mas ainda no tipo de faixa UPDATE e DELETE, o InnoDB deve definir lock da chave
seguinte ou da lacuna e bloquear inseres feitas por outros usurios nas lacunas cobertas pela
faixa. Ist necessrio j que deve se bloquear ``linhas fantasmas'' para a replicao e recuperao no MySQL funcionar. Leituras consistentes (Consistent reads) comportam como no Oracle:
cada leitura consistente, mesmo dentro da mesma transao, configura e l a sua prpria cpia
recente.
REPEATABLE READ Este o nvel de isolamento padro do InnoDB. SELECT ... FOR
UPDATE, SELECT ... LOCK IN SHARE MODE, UPDATE, e DELETE que utilizam um ndice nico com uma condio de busca nica, travam apenas o registro de ndice encontrado, e
no a lacuna antes dele. De outra forma estas operaes empregam travamento de registro seguinte, bloqueando a faixa de ndice varrida com trava de chave seguinte ou de lacuna e bloqueando novas inseres feitas por outros usurios. Em leituras consistentes (consistent reads) existe
uma diferena importante do nvel de isolmento anterior: neste nvel todas as leituras consistentes dentro da mesma transao lem o mesma cpia estabelacido pela primeira leitura. Esta converso significa que se voc executa diversas SELECTs dentro da mesma transao, elas tambm so consistentes entre elas.
SERIALIZABLE Este nvel como o anterior, mas todos os SELECTs so convertidos implicitamente para SELECT ... LOCK IN SHARE MODE.
usurio que ainda no fez commit, esperaremos at que o commit seja realizado. Uma trava em modo compartilhado previne que ocorra atualizaes ou delees de registros j lidos. Depois de vermos que a consulta acima retornou o pai 'Jones', podemos com segurana adicionar o seu filho a
tabela CHILD, e realizar o commit de nossa transao. Este exemplo mostra como implementar integridade referncial no cdigo de sua aplicao.
Deixe-nos mostrar outro exemplo: temos um compo de contador inteiro em uma tabela
CHILD_CODES que usamos para atribuir um identificador nico para cada filho que adicionamos
na tabela CHILD. Obviamente, usar uma leitura consistente ou uma leitura em modo compartilhado
para ler o valor atual do contador no uma boa idia, j que dois usurios do banco de dados podem ver o mesmo valor para o contador e, assim, teramos um erro de chave duplicada ao adicionarmos os dois filhos com o mesmo identificador para a tabela.
Neste caso existem dois bons modos de se implementar a leitura e o incremento do contador: (1)
atualizar o contador primeiro aumentando-o de 1 e s depois disto l-lo, ou (2) ler o contador primeiro com um modo de bloqueio FOR UPDATE, e increment-lo depois disto:
SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE;
UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1;
Um SELECT ... FOR UPDATE ir ler o dado disponvel por ltimo atribuindo travas exclusivas
a cada linha que ele ler. Assim ele atribui uma mesma trava que um UPDATE SQL pesquisado atribuiria nos registros.
atribuida ao registro sucessor ao seu durante a leitura ir previnir que algum insira um registro que
duplique o seu neste intervalo. Assim a trava de chave seguinte permite que voc 'bloqueie' a no
existncia de algo em sua tabela.
SELECT ... FROM ...: esta uma leitura consistente, lendo uma cpia do banco de dados
e no defininfo travas.
SELECT ... FROM ... LOCK IN SHARE MODE: atribui travas de chave seguinte compratilhadas em todos os regitros de ndices que a leitura encontrar.
SELECT ... FROM ... FOR UPDATE: atribui travas de chave seguinte exclusivas em todos os registros de nidices que a leitura encontra.
INSERT INTO ... VALUES (...): atribui uma trava exclusiva em registros inseridos;
note que est rava no uma trava de chave seguinte e no previne que outros usurios insiram
nas lacunas antes do registro inserido. Se um erro de chave duplicada ocorrerm, atribua uma trava compartilhada no registro de ndice duplicado.
INSERT INTO T SELECT ... FROM S WHERE ... atribui uma trava exclusiva em cada linha inserida em T. Faz a busca em S como uma leitura consistente, mas configura travas de
chave seguinte compartilhada em S se o log do MySQL estiver ligado. O InnoDB tem que atribuir travas neste ltimo caso porque em recuperaes roll-forward de um backup, toda instruo
SQL tem que ser executada exatamente da mesma forma que foi feito originalmente.
CREATE TABLE ... SELECT ... realiza o SELECT como uma leitura consistente ou
com travas compartilhadas, como no item anterior.
REPLACE feita como uma insero se no houver colises em uma chave nica. De outra forma, uma trava de chave seguinte exclusiva colocada na linha que deve ser atualizada.
UPDATE ... SET ... WHERE ...: atribui trava de chave seguinte exclusiva em todos os
registros que a busca encontrar.
DELETE FROM ... WHERE ...:atribui trava de chave seguinte exclusiva em todos os registros que a busca encontrar.
Se uma restrio FOREIGN KEY definida na tabela. qualquer inserao, atualizao ou deleo
que exige verificao da condio de restrio configura travas de registros compartilhados nos
registros que que ele olha na verificao da restrio. Tambm no caso onde a restrio falha. o
InnoDB define estes bloqueios.
LOCK TABLES ... : atribui trava a tabela. Na implementao a camada MySQL de cdigo
atribui este bloqueio. A deteco automatica de deadlocks do InnoDB no pode ser feita onde
tais travas de tabelas esto envolvidas: veja a seo seguinte. Tambm, uma vez que o MySQL
sabe sobre bloqueio de registros, impossvel que voc obtenha um bloqueio em uma tabela na
qual outro usurio tenha bloqueio de registro. Mas isto no coloca a integridade da transao em
perigo. See Seco 7.5.15, Restries em Tabelas InnoDB.
619
O InnoDB no pode detectar deadlocks onde uma trava atribuida por uma instruo MySQL LOCK
TABLES est envolvida ou se uma trava definida em outro mecanismo de banco de dados diferente
de InnoDB est envolvida. Voc tem que resolver estas situaes usando innodb_lock_wait_timeout configurado em my.cnf.
Quando o InnoDB realiza um rollback completo de uma transao, todos as travas da transao so
liberadas. No entanto, se feito o rollback de apenas uma nica instruo SQL como um resultado
de um erro, algumas das travass definidas pela instruo podem ser preservadas. Isto ocorre porque
o InnoDB armazena as travas de registro em um formato onde ele no pode saber qual trava foi definida por qual instruo SQL.
User B
SET AUTOCOMMIT=0;
SELECT * FROM t;
empty set
INSERT INTO t VALUES (1, 2);
SELECT * FROM t;
empty set
COMMIT;
SELECT * FROM t;
empty set;
COMMIT;
SELECT * FROM t;
--------------------|
1
|
2
|
---------------------
Assima o usurio A v a linha inserida por B apenas quando B fizer um commit da insero e A tiver feito um commit de sua prpria transao pois assim o ponto no tempo avanado para depois
do commit de B.
Se voc deseja ver o estado mais atual do banco de dados, voc deve utilizar uma trava de leitura:
SELECT * FROM t LOCK IN SHARE MODE;
Use SHOW INNODB STATUS em verses do MySQL posteriores a 3.23.52 e 4.0.3 para determinar a causa do ltimo deadlock. Isto pode lhe ajudar a sintonizar a sua aplicao a avitar travas.
Sempre estar preparado para reexecutar uma transao se ela falhar em um deadlock. Deadlocks
no so perigosos. Apenas tente de novo.
Commit sua transaes com frequncia. Transaes pequenas tm menos chaces de colidir.
Se voc estiver utilizando as travas de leitura SELECT ... FOR UPDATE ou ... LOCK
IN SHARE MODE, tente usar um nvel de isolamente mais baixo READ COMMITTED.
Accesse as suas tabelas e linha em uma ordem fixa. Assim as transaes formaro filas ordenadas e no entraro em deadlock.
Adicione ndices bem escolhidos a sua tabela. Ento a suas consultas precisaro varrer menos registros de ndice e consequentemente atribuiro menos locks. Use EXPLAIN SELECT para fazer o MySQL selecione ndices apropriados a sua consulta.
Use menos locks: se voc pode utilizar um SELECT para retornar dados de uma copia de banco
de dados antiga, no adicione a clusula FOR UPDATE ou LOCK IN SHARE MODE. Usar o
nvel de isolamento READ COMMITTED bom aqui, pois cada leitura consistente dentro da
mesma transao l da sua prpria cpia atual.
Se nada ajudar, serialize suas transaes com bloqueio de tabela: LOCK TABLES t1 WRITE,
t2 READ, ... ; [faz algo com tabelas t1 e t2 aqui]; UNLOCK TABLES. Bloqueio de tabela faz com que suas transaes se enfilerem em ordem e deadlocks sero
evitados. Note que LOCK TABLES inicia implictamente uma transao, assim como o comando
BEGIN, e UNLOCK TABLES finaliza implicitamente uma transao em um COMMIT.
Outra soluo para colocar transaes em srie criar uma tabela 'semforo' auxiliar onde exista
apenas uma nica linha. Cada transao atualiza esta linha antes de acessar outra tabela. Deste
modo todas as transaes acontecem em srie. Note que o algoritmo de deteco automtico de
deadlock do InnoDB tambm funciona pois a trava de srie uma trava de registro. Na trava de
tabela do MySQL ns temos que recorrer ao mtodo do tempo limite para resolver um deadlock.
2.
Envolva diversas modificaes em uma transao. O InnoDB deve descarregar o log em disco
a cada commit da transao se esta transao fizer modificaes no banco de dados. Uma vez
que o velocidade de rotao do disco normalmente 167 revolues/segundo, o nmero de
commits fica limitado aos mesmos 167/segundo se o disco no enganar o sistema operacional.
3.
Se voc puder ter perda dos ltimos commits feitos em transaes, voc pode configurar o parmetro innodb_flush_log_at_trx_commit no arquivo my.cnf com 0. O InnoDB
tenta descarregar o log uma vez por segundo de qualquer forma, embora a descarga no seja
garantida.
4.
Torne os seus arquivos de log maiores, to grande quanto a rea de buffer. Quando o InnoDB
escrever o arquivo de log totalmente, ele ter que escrever o contedo modificado da rea de
buffer no disco em um ponto de verificao. Arquivos de log menores causaro muitos escrita
desnecessrias em disco. O ponto negativo em arquivos grandes que o tempo de recuperao
621
ser maior.
5.
6.
(Relevante para verso 3.23.39 e acima.) Em algumas verses do Linux e Unix, descarregar arquivos em disco com o comando fdatasync do Unix e outros mtodos parecido surpreendentemente lento. O mtodo padro que o InnoDB utiliza a funo fdatasync. Se voc
no estiver satisfeito com o desempenho da escrita do banco de dados, voc pode tentar configurar innodb_flush_method em my.cnf com O_DSYNC, embora O_DSYNC parea ser
mais lento em alguns sistemas.
7.
Ao importar dados para o InnoDB, esteja certo de que o MySQL no est com autocommit=1 ligado. Assim cada insero exige uma descarga de log em disco. Coloque antes da linha de importao de arquivo do SQL
SET AUTOCOMMIT=0;
e depois dele
COMMIT;
Se voc utilizar a opo mysqldump --opt, voc obter arquivos dump que so mais rpidos de importar tambm em uma tabela InnoDB, mesmo sem coloc-los entre SET AUTOCOMMIT=0; ... COMMIT;.
8.
Tome cincia dos grandes rollbacks de inseres em massa: o InnoDB utiliza o buffer de insero para economizar E/S de disco em inseres, mas em um rollback correspondente tal mecanismo no usado. Um rollback no limite de disco pode demorar cerca de 30 vezes mais que
a inssero correspondente. Matar o processa de banco de dados no ir ajudar pois o rollback
ir reiniciar ao se entrar no banco de dados. O nico modo de se livrar de um rollback deste tipo aumentar a rea de buffer de forma que o rollback dependa do limite de CPU e seja executado rpidamente ou deltar todo o banco de dados InnoDB.
9.
Tome cincia tambm de outras grandeas operaes com limite de disco. Use DROP TABLE
ou TRUNCATE (a partiir do MySQL-4.0) para esvaziar uma tabela, no DELETE FROM suatabela.
10. Utilize INSERT multi-line para reduzir a sobrecarga de comunicao entre o cliente e o servidro se voc precisar inserir muitas linhas:
INSERT INTO suatabela VALUES (1, 2), (5, 5);
Esta dica vlida para inseres em qualquer tipo de tabela, no apenas no InnoDB.
til para ajuste do desempenho. No Windows voc deve iniciar o mysqld-max a partir do Prompt
do MSDOS com a opo --standalone --console para direcionar a sada para a janela do
prompt do MS-DOS.
Existe um innodb_lock_monitor separada que imprime a mesma informao que innodb_monitor mais informaes sobre travas configuradas por cada transao.
A informao impressa inclui dados sobre:
Se a seo LOCKS HELD BY TRANSACTIONS relatar espera de bloqueios, ento a sua aplicao pode ter diputa de travas. A saida tambm ajuda a rastrear as razes de deadlocks nas transaes.
A seo SYNC INFO ir relatar semforos reservados se voc compilar o InnoDB com
UNIV_SYNC_DEBUG definido em univ.i.
A seo SYNC ARRAY INFO relatas as threads que esperam por semforos e estatsticas sobre
quantas vezes a thread precisou esperar por um mutex ou por um semforo de trava de leitura/
escrita. Um nmero grande de espera da thread pelo semforo pode ser um resultado de E/S de
disco ou problemas de disputa dentro do InnoDB. As disoutas pode ser devido a paralelismo pesado de consultas ou problemas na programao das threads no sistema operacional.
A seo CURRENT PENDING FILE I/O'S lista os pedidos de E/S de arquivos que esto pendente. Um nmero grande indica que a carga de trabalho esta no limite de disco.
A seo BUFFER POOL lhe d estatticas sobre leitura e escrita das pginas. Voc pode calcular
a partir destes nmeros quanto de E/S em arquivos de dados a sua consulta esta fazendo atualmente.
po de 6 bytes diz ao identificador da transao sobrea a ltima transao que inseriu ou atualizou um
registro. Uma deleo tambm tratada internamente como uma atualizao ande um bit especial
definido para indicae a daleo. Cada linha contm tambm um campo de 7 bytes chamado roll pointer. O roll pointer aponta para um registro log de itens a desfazer escrito no segmento rollback. Se
o registro foi atualizado, ento este registro de log contm a informao necessria para reconstruir
o contedo da linha antes de ela ter sido atualizada.
O InnoDB usa a informao no segmento rollback para realizar o operao de desfazer necessria
em um rollback de uma transao. Ele tambm usa a informao para construir verses mais novas
de um registro para uma leitura consistente.
Os logs de itens a desfazer em um segmwnto rollback so divididos en logs de insero e atualizao. Logs de insero s so necessrios em rollback das transaes e podem ser discartados assim
que se fizer o commit das transaes. Logs de atualizao tambm so utilizados em leituras consistentes, e eles s podem ser descartados quando no houver mais transaes para as quais o InnoDB
atribuiu uma cpia do banco de dados que precisasse das informaes do log de atualizaes em
uma leitura consistente para construir uma verso mais nova do registro do banco de dados.
Voc deve se lembrar de fazer commit em suas transaoes regularmente, inclusive aquelas transaes que s fazem leituras consistentes. Seno o InnoDB no pode descartar dados do log de atualizao e o segmento rollback pode crescer demias, enchendo o seu tablespace.
O tamanho fsico de um registro log de itens a desfazer em um segmento rollback normalmente
menor que o registro inserido ou atualizado correspondente. Voc pode usar esta informao para
calcular o espao necessrio para o seu segmento rollback.
Neste esquema multi-versioning uma linha no fisicamente removida do banco de dados imediatamente quando voc a deleta com uma instruo SQL. Apenas quando o InnoDB puder descartar o
registro de log de itens a desfazer da atualizao ele pode, tambm, remover fisicamente a linha correspondente e seu registros de ndices do banco de dados. Esta operao de remoo chamada
`purge' e bem rpida, tendo, normalmente, a mesma ordem de tempo da instruo SQL que fez a
deleo.
625
Cada registro de ndice no InnoDB contm um cabealho de 6 bytes. O cabealho usado para
ligar registros consecutivos e tambm para bloqueio de regiostros.
Registros em ndices agrupados contm capos para todas as colunas definidas definidas pelo
usurio. Adicionalmente, existe um campo de 6 bytes para a ID da transao e um campo de 7
bytes para o roll pointer.
Se o usurio no tiver definido uma chave prmiria para uma tabela, ento cada registro de ndi626
Cada registro de ndice secundrio tambm contm todos os campos definidos para a chave de
ndice agrupado.
Um registro tambm contm um ponteiro para cada campo do registro. Se o tamanho total dos
campos em um registro menor que 128 bytes, ento o ponteiro de 1 byte, seno de 2 bytes.
escreve a pgina em sua posio apropriada na arquivo de dados. Se o sistema operacional falhar no
meio da escrita da pgina, o InnoDB ir fazer a recuperao procurando uma cpia da pgina no
buffer de escrita dupla.
A partir da verso 3.23.41 voc tambm pode usar uma partio de disco raw como um arquivo de
dados, mas insto ainda no foi testado. Quando voc cria um navo arquivo de dados voc tem que
colocar a palavra chave newraw imediatamente depois do tamanho do arquivo de dados em innodb_data_file_path. A partio deve ter, pelo menos, o tamanho que voc especificou. Note que 1M no InnoDB 1024 x 1024 bytes, enquanto na especificao de disco 1 MB normalmente
significa 1000 000 bytes.
innodb_data_file_path=/dev/hdd1:5Gnewraw;/dev/hdd2:2Gnewraw
Quando voc reinicia o banco de dados voc deve alterar a palavra chave para raw. Seno o InnoDB escrever sobre a sua partio!
innodb_data_file_path=/dev/hdd1:5Graw;/dev/hdd2:2Graw
Usando um disco raw voc pode ter E/S sem buffer em algumas veses de Unix.
Quando voc usar parties de disco raw, certifique-se de que voc tem permisses que permitem
acesso de leitura e escrita na conta usada para executar o servidor MySQL.
Existem duas heursticas read-ahead no InnoDB: read-ahead sequencial e read-ahead aleatria. Na
read-ahead sequencial o InnoDB percebe que o padro de acesso a um segmento no tablespace sequencial. ento o InnoDB enviar uma grupo de leitura das paginas do banco de dados para o sistema de E/S. No read-ahead aleatrio o InnoDB percebe que algumas reas no tablespace parecem estar no processo de serem totalmente lidas na rea de buffer. O InnoDB envia as leituras remanescente para o sistema de E/S.
Quando voc deletar dados de uma tabela, o InnoDB contrair o ndice de rvore-B correspondente.
Ele depende do padro de delees se isto liberar pginas individuais ou extenses da tablespace, assim que o espao liberado estiver disponvel para outros usurios. Apagar a tabela ou deletar todos
os registros dela garante a liberao do espao para outros usurios, mas lembre-se que registros deletados s podem ser fisicamente removidos em uma operao de remoo (`purge'), depois que no
houver mais necessidades de rollback em trasaes ou leituras consistentes.
Se voc ficar sem espao no tablespace voc obter do MySQL o erro 'Table is full' e o
InnoDB far o rollback da instruo.
Um deadlock de uma transao ou em caso de se esgotar o tempo de espera em uma trava o InnoDB far um rollback de toda a transao.
Um erro de chave duplicada faz um rollback da insero deste registro em particular, mesmo em
instrues como INSERT INTO ... SELECT .... Caso voc no especifique a opo
IGNORE em sua instruo, provavelmente isto ser diferente e o InnoDB far rollback desta instruo SQL.
Outros erros so geralmente detectado pela camada de cdigo do MySQL e fazem o rollback da
instruo correspondente.
Aviso: NO converta o sistema de tabelas MySQL de MyISAM PARA InnoDB! Isto no suportado; se voc fizer isto o MySQL no reiniciar at que voc restaure o sistema de tabelas antigo de um backup ou os regenere com o script mysql_install_db.
629
SHOW TABLE STATUS no d estatsticas exatas sobre tabelas InnoDB, exceto sobre o tamanho fsico reservado pela tabela. O contador de linha apenas uma estimativa rude usada na otimizao SQL.
Se voc tentar criar um ndice nico em um prefixo de coluna voc obter um erro.
CREATE TABLE T (A CHAR(20), B INT, UNIQUE (A(5))) TYPE = InnoDB;
Se voc criar um ndice que no seja nico em um prefixo de uma coluna, o InnoDB criar um
ndice sobre toda a coluna.
DELETE FROM TABLE no gera a tabela novamente, mas, ao invs diato, deleta todas as linhas, uma a uma, o que no rpido. Em verses futuras do MySQL voc poder usar TRUNCATE que mais rpido.
O tamanho de pgina padro utilizado no InnoDB 16KB. Recompilando o cdigo pode se configur-la com 8 KB a 64 KB. O tamanho mximo de um registro menos da metade da pgina
de banco de dados nas verses anteriores a 3.23.40 do InnoDB. A partir da distribuio fonte da
verso 3.23.41 colunas BLOB e TEXT podem ter at 4 GB e o tamanho total do registro tambm devem ser menores que 4GB. O InnoDB no armazena campos cjo tamanho menor que
128 bytes em pginas separadas. Depois do InnoDB modificar o registro armazenando campos
grandes em pginas separadas, o tamanho restante da linha deve ser menor que metade da pgina
de banco de dados. O tamanho mximo da chave de 7000 bytes.
Em alguns sistemas operacionais os arquivos de dados devem ser menores que 2 GB. O tamanho
combinado dos arquivos de log devem ser menores que 4GB.
O tamanho mximo do tablespace 4 bilhes de pginas de banco de dados. Este tambm o tamanho mximo da tabela. O tamanho mnimo do tabelspace de 10 MB.
Quando voc reinicia o servidor MySQL, o InnoDB pode reutilizar um valor antigo para uma
coluna AUTO_INCREMENT.
Voc no pode definir o primeiro valor de uma coluna AUTO_INCREMENT no InnoDB com
CREATE TABLE ... AUTO_INCREMENT=... (ou ALTER TABLE ...). Para definir este valor insira uma linha com o valor de menos e delete esta linha.
Multiple tablespaces now available for InnoDB. You can store each InnoDB type table and its
indexes into a separate .ibd file into a MySQL database directory, into the same directory
where the .frm file is stored.
The MySQL query cache now works for InnoDB tables also if AUTOCOMMIT=0, or the statements are enclosed inside BEGIN ... COMMIT.
630
Reduced InnoDB memory consumption by a few megabytes if one sets the buffer pool size < 8
MB.
Fixed a bug: in contrary to what was said in the manual, in a locking read InnoDB set two record
locks if a unique exact match search condition was used on a multi-column unique key. For a
single column unique key it worked right.
Fixed a bug: if one used the rename trick #sql... -> rsql... to recover a temporary table, InnoDB asserted in row_mysql_lock_data_dictionary().
There are several outstanding non-critical bugs reported in the MySQL bugs database. Their fixing has been delayed, because resources are allocated to the upcoming 4.1.1 release.
Fixed a bug: InnoDB could make the index page directory corrupt in the first B-tree page splits
after mysqld startup. A symptom would be an assertion failure in page0page.c, in function
page_dir_find_slot().
Fixed a bug: InnoDB could in rare cases return an extraneous row if a rollback, purge, and a
SELECT coincided.
Fixed a possible hang over the btr0sea.c latch if SELECT was used inside LOCK TABLES.
Fixed a bug: if a single DELETE statement first managed to delete some rows and then failed in
a FOREIGN KEY error or a Table is full error, MySQL did not roll back the whole SQL
statement as it should.
Fixed a bug: if you updated a row so that the 8000 byte maximum length (without BLOB and
TEXT) was exceeded, InnoDB simply removed the record from the clustered index. In a similar
insert, InnoDB would leak reserved file space extents, which would only be freed at the next
mysqld startup.
Fixed a bug: if you used big BLOB values, and your log files were relatively small, InnoDB
could in a big BLOB operation temporarily write over the log produced after the latest checkpoint. If InnoDB would crash at that moment, then the crash recovery would fail, because InnoDB
would not be able to scan the log even up to the latest checkpoint. Starting from this version, InnoDB tries to ensure the latest checkpoint is young enough. If that is not possible, InnoDB prints
a warning to the .err log of MySQL and advises you to make the log files bigger.
Fixed a bug introduced in 4.0.13: if a CREATE TABLE ended in a comment, that could cause a
memory overrun.
Fixed a bug: If you created a column prefix PRIMARY KEY like in t(a CHAR(200), PRIMARY KEY (a(10))) on a fixed-length CHAR column, InnoDB would crash even in a simple
631
SELECT. CCHECK TABLE would report the table as corrupt, also in the case where the created
key was not PRIMARY.
InnoDB now supports the SAVEPOINT and ROLLBACK TO SAVEPOINT SQL statements.
See http://www.innodb.com/ibman.php#Savepoints for the syntax.
You can now create column prefix keys like in CREATE TABLE t (a BLOB, INDEX
(a(10))).
You can also use O_DIRECT as the innodb_flush_method on the latest versions of Linux
and FreeBSD. Beware of possible bugs in those operating systems, though.
Fixed the checksum calculation of data pages. Previously most OS file system corruption went
unnoticed. Note that if you downgrade from version >= 4.0.14 to an earlier version < 4.0.14 then
in the first startup(s) InnoDB will print warnings:
InnoDB: Warning: an inconsistent page in the doublewrite buffer
InnoDB: space id 2552202359 page number 8245, 127'th page in dblwr buf.
but that is not dangerous and can be ignored.
Modificado o algortmo de substituio da rea de buffer para que ele tente descarregar as pginas modificados se no houver pginas a serem sustitudas nos ltimos 10% da lista LRU. Isto
pode produzir e/s de disco se a carga de trabalho for uma mistura de leituras e escritas.
O algortmo de descarga do ponto de verificao da rea de buffer agora tambm tenta descarregar vizinhos prximos a pgina no fim da lista de flush. Isto pode aumentar a velocidade de desligamento do banco de dados e pode tambm aumentar as escritas em disco se o arquivo de log
do InnoDB for muito pequeno comparado ao tamanho da rea de buffer.
Na verso 4.0.13 fazemos SHOW INNODB STATUS exibir informaes detalhadas sobre o ltimo erro de UNIQUE KEY, mas armazenar esta informao podia deixar o REPLACE bem
mais lento. No exibimos nem armazenamos mais a informao.
Corrigido um erro: o parmetro innodb_max_dirty_pages_pct no levav em conta as pginas livres na rea de buffer. Isto podia levar a descargas excessivas mesmo se houvesse muitas pginas livres na rea de buffer. Soluo: SET GLOBAL innodb_max_dirty_pages_pct = 100.
Fixed a bug: InnoDB forgot to call pthread_mutex_destroy() when a table was dropped. That
could cause memory leakage on FreeBSD and other non-Linux Unixes.
Fixed a bug: MySQL could erroneously return 'Empty set' if InnoDB estimated an index range
size to 0 records though the range was not empty; MySQL also failed to do the next-key locking
in the case of an empty index range.
Fixed a bug: GROUP BY and DISTINCT could treat NULL values inequal.
632
O InnoDB agora suporta ALTER TABLE DROP FOREIGN KEY. Voc deve usar SHOW
CREATE TABLE para ver a ID de chaves estrangeiras geradas internamente quando quiser apagar uma chave estrangeira.
SHOW INNODB STATUS agora esxibe informaes detalhadas do ltimo erro de FOREIGN
KEY e UNIQUE KEY detectados. Se voc no entender porque o InnoDB retorna o erro 150 de
um CREATE TABLE, voc pode utilizar isto para estudar a razo.
ANALYZE TABLE agora tambm funciona para tabelas do tipo InnoDB. Ela faz 10 inseres
aleatrias para cada das rvores de ndices e atualiza a estimativa da cardinalidade do ndice adequadamente. Note que como isto apenas uma estimativa, repetidas execues de ANALYZE
TABLE podem produzir diferentes nmeros. O MySQL usa a estimativa de cardinalidade do ndice apenas an otimizao de joins. Se alguma join no otimizada de modo apropriado, voc
pode tentar usar ANALYZE TABLE.
A capacidade de commit de grupo do InnoDB agora tambm funciona quando o log binrio do
MySQL est habilitado. Deve haver mais de 2 threads cliente para commit de grupo estar ativo.
Adicionado uma nova varivel global configurvel de sistema do MySQL (innodb_max_dirty_pages_pct). Ela um interio na faixa de 0 - 100. O padro 90. A thread principal no InnoDB tenta descarregar as pginas da rea de buffer j que grande parte
deste percetual ainda no foi descarregado em nenhum momento.
Se innodb_force_recovery=6, no deixar o InnoDB fazer reparao de pginas corrompidas baseadas no buffer de dupla escrita.
O InnoDB agora inica mais rpido porque ele no define a memria na rea de buffer para zero.
Corrigido um erro: a definio FOREIGN KEY do InnoDB era confudida com as palavras chaves 'foreign key' dentro dos comentrios do MySQL.
Corrigido um ero: se voc apagasse um tablea para qual havia uma referncia de chave estrangeira, e posteriormente criasse a mesma tabela com tipo de colunas no correspondentes, o InnoDB podia entrar em dict0load.c, na funo dict_load_table.
Corrigido um erro: GROUP BY e DISTINCT podia tratar valores NULL como diferentes. O
MySQL tambm falahva ao fazer o lock da prxima chave no caso de uma faixa de ndice vazia.
Corrigido um erro: no faz COMMIT da transao atual quando uma tabela MyISAM atualizada; isto tambm faz com que CREATE TABLE no faa commit de uma transao InnoDB,
mesmo quando o log binrio estiver habilitado.
Corrigido um erro: no permite que ON DELETE SET NULL modifique a mesma tabela onde
o delete foi feito; podemos permit-lo porqeu into no pode produzir loops infinitos em operaes em cascata.
Corrigido um erro: permitir HANDLER PREV e NEXT tambm depois de posicionar o cursor
com uma busca nica na chave primria
Corrigido um erro: se MIN() ou MAX() resultasse em um deadlock ou em esgotamento do tempo de espera do lock, o MySQL no retornava um erro, mas NULL como o valor da funo.
Corrigido um erro grave na otimizao de consultas do InnoDB: consultas do tipo SELECT ...
WHERE ndice_col < x and SELECT ... WHERE ndice_col > x podiam provocar a varredura
da tabela mesmo se a seletividade fosse muito boa.
Corrigido um erro potencial quando MySQL chama store_lock with TL_IGNORE no meio de
uma consulta.
Corrigido um erro/recurso: se seu aplicativo usa mysql_use_result(), e usa >= 2 conexes para
enviar consultas SQL, ele poderia entrar em deadlock na hash S-latch adaptativa em btr0sea.c.
Agora o mysqld libera a S-latch se ela passar o dado de uma SELECT para o cliente.
Corrigido um erro: o MySQL podia, erroneamente, retornar 'Empty set' se o InnoDB estimasse o
tamanho da faixa do ndice para 0 registro mesmo se o registro no estivesse vazio; o MySQL
tambm falhava para fazer o lock da prxima chave no caso de uma faixa de ndice vazia.
Corrigido um erro introduzido na verso 4.0.10: SELECT ... FROM ... ORDER BY ... DESC
podia entrar em loop infinito.
Em INSERT INTO t1 SELECT ... FROM t2 WHERE ... anteriormente o MySQL definia um
bloqueio de tabela em t2. O bloqueio agora foi removido.
Aumentou o tamanho mximo mostardo de SHOW INNODB STATUS para 200 KB.
Corrigido um erro grave na otimizao da consulta do InnoDB: consultas do tipo SELECT ...
WHERE indice_col < x and SELECT ... WHERE indice_col > x podia provocar a varredura da
tabela mesmo quand a seletividade estivess muito boa.
634
Corrigido um erro: a remoo (`purge') podia causar lentido em uma tabela BLOB cuja rvore
de ndice de chave primria fosse de altura 1. Sintomas: os semforos esperam devido a um tarva X definida em btr_free_externally_stored_field().
Corrigido um erro: se o MySQL estimar uma consulta no meio de uma instruo SELECT, o InnoDB ir parar na trava de dice hash adaptativa em btr0sea.c.
Corrigido um erro: O InnoDB podia relatar corrompimento e declara em page_dir_find_owner_slot() se uma busca de ndice hash adaptativo coincidiu com uma remoo
ou uma insero.
Corrigido um erro: REPLACE INTO t1 SELECT ... no funciona se t1 tiver uma coluna com
auto incremento.
Em INSERT INTO t1 SELECT ... FROM t2 WHERE ... anteriormente o MySQL definia um
bloqueio de tabela em t2. O bloqueio agora foi removido.
Corrigido um erro: se o tamanho total dos arquivos de log do InnoDB fosse maior que 2GB em
um comoputador de 32 bits, o InnoDB escreveria o log em uma posio errada. Isto poderia fazer com que a recuperao em caso de falhas e o InnoDB Hot Backup falhassem na varredura do
log.
Consrtado um erro: uma declarao em in btr0sea.c, na funo btr_search_info_update_slow podia, teoriacamente, falhar em uma ``disputa'' de 3 threads.
Corrigido um erro: a remoo (`purge') podia causar lentido em uma tabela BLOB cuja rvore
de ndice de chave primria fosse de altura 1. Sintomas: os semforos esperam devido a um tarva X definida em btr_free_externally_stored_field().
Corrigido um erro: se o MySQL estimar uma consulta no meio de uma instruo SELECT, o InnoDB ir parar na trava de dice hash adaptativa em btr0sea.c.
Corrigido um erro: O InnoDB podia relatar corrompimento e declara em page_dir_find_owner_slot() se uma busca de ndice hash adaptativo coincidiu com uma remoo
ou uma insero.
com que ele fique na mesma pgina indefinidamente. Este erro evidentemente s est presente
em tabelas com mais de uma pgina.
Corrigido um erro: se o tamanho total dos arquivos de log do InnoDB fosse maior que 2GB em
um comoputador de 32 bits, o InnoDB escreveria o log em uma posio errada. Isto poderia fazer com que a recuperao em caso de falhas e o InnoDB Hot Backup falhassem na varredura do
log.
Agora, o InnoDB tambm suporta FOREIGN KEY (...) REFERENCES ...(...) [ON UPDATE
CASCADE | ON UPDATE SET NULL | ON UPDATE RESTRICT | ON UPDATE NO ACTION].
Tabelas e ndices agora reservam 4% a menos de espao na tablespace. Tabelas existentes tambm reservam menos espao. Atualizando para 4.0.8 vaoc ver mais espao livre em "InnoDB
free" em SHOW TABLE STATUS.
Corrigido um erro: atualizar a chave primria de um registro gera uma erro de chave estrangeira
em todas as chaves estrangeiras que fazem referncia a chaves secundrias do registro a ser atualizado. Alm disso, se uma restrio de referncia de chave estrangeira s se refere a primeir coluna em um ndice e houver mais colunas neste ndice, atualizar a coluna adicional ir gerar um
erro de chave estrangeira.
Corrigido um erro: se um ndice contm algumas colunas duas vezes e esta coluna atualizada,
a tabela se tornar corrompida. Agora o InnoDB previne a criao de tais ndices.
Corrigido um erro: removido mensagens de erros suprfluos 149 e 150 do arquivo .err quando
um SELECT bloquado provoca um deadlock ou um esgota o tempo limite de espera de um bloqueio.
Consrtado um erro: uma declarao em in btr0sea.c, na funo btr_search_info_update_slow podia, teoriacamente, falhar em uma ``disputa'' de 3 threads.
Corrigido um erro: no possvel trocar o nvel de isolamento da tarnasao de volta para REPEATABLE READ depouis de defin-lo com outro valor.
LOAD DATA INFILE em modo AUTOCOMMIT=1 no faz mais commits implicitos para cada
1MB de log binrio escrito.
636
Corrigido um erro introduzido na verso 4.0.4: LOCK TABLES ... READ LOCAL no deve definir bloqueio de registros ao l-los. Isto provoca deadlocks e esgostamento do tempo limite de
espera das travas do registro no mysqldump.
Corrigido um erro introduzido na verso 4.0.5: se o log binrio no estivessem ligado, INSERT
INTO ... SELECT ... ou CREATE TABLE ... SELECT ... podiam fazer com que o InnoDB pendurasse em um semforo criado em btr0sea.c, line128. Soluo: ligar o log binrio.
Corrigido um erro: na replicao, executar SLAVE STOP no meio de uma transao multiinstruo podia fazer com que SLAVE START s realizasse parte da transao. Um erro parecido podia ocorrer se o slave finalizasse devido a um erro e fosse reiniciado.
Corrigido um erro: ORDER BY podia falhar se voc no tiver criado um chave primria para
um tabela, mas tiver definido diversos ndices nos quais pelo menos um era um ndice nico
(UNIQUE) com todos as suas colunas declaradas como NOT NULL.
Corrigido um erro: um esgotamento do tempo de espera se um lock na conexo com ON DELETE CASCADE podia causar corrompimento em ndices.
Corrigido um erro: se um SELECT era feito com uma chave nica a partir de um ndice primrio, e a busca correspondesse a um registro marcado para deleo, o InnoDB podia erroneamente
retornar o PROXIMO registro.
Corrigido um erro introduzido na verso 3.23: LOCK TABLE ... READ LOCAL no devia definir lock de registro na leitura das linhas. Isto causava deadlocks e esgotamento do tempo de espera do lock no mysqldump.
Corrigido um erro: se um ndice continha algumas colunas duas vezes, e aquela coluna est atualizada, a tabela fcava corrompida. De agora em diante o InnoDB previne a criao de tais ndices.
A resoluo de deadlock agora seletiva: tentamos pegar como vtimas transaes com menos
linhas modificadas ou inseridas.
Definies FOREIGN KEY agora est ciente da configurao lower_case_nome_tabelas no arquivo my.cnf.
SHOW CREATE TABLE no exibe o nome do banco de dados para uma definio FOREIGN
KEY se a tabela referida est no mesmo banco de dados que a tabela.
O InnoDB faz uma verificao de consistncia para verificar a maioria das pginas de ndices
637
Se voc definir innodb_force_recovery > 0, o InnoDB tenta saltar para os registros e pginas
com ndices corrompidos fazendo SELECT * FROM tabela. Isto ajuda no dump.
O InnoDB agora usa E/S assncrona e sem buffer no Windows 2000 e XP; e apenas E/S sem
buffer assncrono por simulao no NT, 95/98/ME.
Corrigido um erro presente nas verses 3.23.52, 4.0.3, 4.0.4: A inicializao do InnoDB podia
levar muito tempo ou at mesmo falhar em alguns computadores Windows 95/98/ME.
Corrigido um erro: o lock AUTO-INC er guardado para o fim da transao se ele fosse concedido depois de uma espera de lock. Isto podia causar deadlocks desnecessrios.
Corrigido um erro: se SHOW INNODB STATUS, innodb_monitor, ou innodb_lock_monitor tiver exibido centenas de transaes em um relatrio, e a sada ficar truncada, o InnoDB travaria,
imprimindo no log de erros muitas esperas por um mutex criado em srv0srv.c, line 1621.
Corrigido um erro: SHOW INNODB STATUS no Unix sempre relata o tamanho mdio dos arquivos lidos como 0 bytes.
Corrigido um erro potencial na verso 4.0.4: o InnoDB agora faz ORDER BY ... DESC como o
MyISAM.
Corrigido um erro: DROP TABLE podia causar falhas ou um travamento se houvesse um rollback executando concorrentemente na tabela. A correo ser feita na srie 3.23 se este for um
problema para os usurios.
Corrigido um erro: ORDER BY podia falhar se voc no tivesse criado um chave primria para
uma tabela, mas tivesse definido diversos ndices nos quais pelo menos um seja um ndice nico
(UNIQUE) com todas as suas colunas declaradas como NOT NULL.
Corrigido um erro: um espera pelo tempo limite na conexo com ON DELETE CASCADE podia causar corrompimento nos ndices.
Corrigido um erro: se um SELECT era feito com uma chave nica a partir de um ndice primrio
e a busca correspondesse a um registro marcado para deleo, o InnoDB podia retornar o prximo registro.
Outstanding bugs: na verso 4.0.4 dois erros foram introduzidos no AUTO_INCREMENT. REPLACE pode fazer com que o contador seja decrementado. Um deadlock ou uma espera de tempo limite de lock pode causar o mesmo problema. Eles sero corrigidos na versao 4.0.6.
Usamos novamente E/S de disco sem buffer para arquivos de dados no Windows. A performance de leitura do Windows XP e Windows 2000 parecem estar muito fraca com E/S normal.
Ajustamos a estimativa de faixa para uqe varreduras de ndices na faixa tenham preferncia sobre a varredura completa de ndices.
Corrigido um erro presente nas verses 3.23.52, 4.0.3, 4.0.4: A inicializao do InnoDB podia
638
Corrigido um ero: a finalizao rpida (que padro), algumas vezes ficava lenta pela unio do
buffer de remoo e insero.
Corrigido um erro: fazer um grande SELECT de uma tabela onde nenhum registro estava visvel
em uma leitura consistente podia causar uma espera de semforo muito longo (> 600 segundos)
em btr0cur.c line 310.
Corrigido um erro: o lock AUTO-INC era guarda para o fim da transao se fosse concedido depois de uma espera de lock. Isto podia causar um deadlock desnecessrio.
Corrigido um erro: se voc criar uma tabela temporria dentro de LOCK TABLES, e usar esta
tabela temporria, causar um falha de declarao em ha_innobase.cc.
Corrigido um erro: se SHOW INNODB STATUS, innodb_monitor, ou innodb_lock_monitor tiver exibido centenas de transaes em um relatrio, e a sada ficar truncada, o InnoDB travaria,
imprimindo no log de erros muitas esperas por um mutex criado em srv0srv.c, line 1621.
Corrigido um erro: SHOW INNODB STATUS no Unix sempre relata o tamanho mdio dos arquivos lidos como 0 bytes.
Usamos novamente E/S de disco sem buffer para arquivos de dados no Windows. A performance de leitura do Windows XP e Windows 2000 parecem estar muito fraca com E/S normal.
Aumentado o tamanho mximo da chave de tabelas InnoDB de 500 para 1024 bytes.
Corrigido um erro: Usar ORDER BY primarykey DESC na verso 4.0.3 causa um falha de declarao em btr0pcur.c, line 203.
Corrigido um ero: a finalizao rpida (que padro), algumas vezes ficava lenta pela unio do
buffer de remoo e insero.
Corrigido um erro: fazer um grande SELECT de uma tabela onde nenhum registro estava visvel
em uma leitura consistente podia causar uma espera de semforo muito longo (> 600 segundos)
em btr0cur.c line 310.
Corrigido um erro: se a cache de consultas do MySQL foi usada, ela no fica invalidada por uma
modificao feita por ON DELETE CASCADE ou ...SET NULL.
Corrigido um erro: se voc criar uma tabela temporria dentro de LOCK TABLES, e usar esta
tabela temporria, causar um falha de declarao em ha_innobase.cc.
Corrigido um erro: se voc definisse innodb_flush_log_at_trx_commit com 1, SHOW VARIABLES mostraria seu valor como 16 milhes.
Removido um deadlock desnecessrio quando a insero precisa esperar por um lock de leitura,
atualizao ou deleo para liberar o lock da prxima chave.
O comando SQL HANDLER do MySQL agora tambm funciona para os tipos de tabela
InnoDB. O InnoDB faz o HANDLER sempre ler como leitura consistente. HANDLER um caminho de acesso direto a leitura de ndices individuais das tabelas. Em alguns casos HANDLER
pode ser usado como um substituto de cursores do lado do servidor.
Corrigido um erro na verso 4.0.2: mesmo uma nica insero podia causar um falha na verso
AIX.
Corrigido um erro: se voc usar em um nome de tabela caracteres cujo cdigo > 127, em
DROP TABLE o InnoDB podia falhar na linha 155 de pars0sym.c.
A compilao do fonte agora fornece um verso funcional, ambas em HP-UX-11 e HPUX-10.20. A fonte da verso 4.0.2 funciona apenas na verso 11, e a fonte do 3.23.52 apenas na
10.20.
Corrigido um erro: se compilado em um Solaris 64-bits, o InnoDB produz um erro de bus na inicializao.
O conjunto de recursos da verso 3.23 ser congelada a partir desta verso. Novos recursos iro
para o branch da verso 4.0, e apenas erros corrigidos sero feitos para o branch da verso 3.23.
Muitas consultas joins no limite da CPU agora so executadas mais rpido. No Windows tambm muitas outras consultas no limite da CPU executar mais rpido.
Um novo comando SQL, SHOW INNODB STATUS retorna a sada do Monitor InnoDB para o
cliente. O Monitor InnoDB agora exibe informaes detalhadas no ltimo deadlock detectado.
O InnoDB faz o otimizador de consultas SQL evitar muito mais varreduras apenas na faixa de
ndice e escolhe a varredura de toda a tabela. Agora isto est corrigido.
"BEGIN" e "COMMIT" esto agora adicionados no log binrio das transaes A replicao do
MySQL agora respeita as bordas da transao: um usurio no ver mais meia transaes na replicao dos slaves.
Um slave de replicao agora exibe na recuperao de falhas o ltima posio do log binrio do
master que ele podia recuperar.
SHOW TABLE STATUS agora tambm lista possveis ON DELETE CASCADE ou ON DELETE SET NULL no campo de comentrio da tabela.
Quando CHECK TABLE est executando em qualquer tipo de tabela InnoDB, ela agora verifica
640
Se voc definiu ON DELETE CASCADE ou SET NULL e atualizou o chave referenciada no registro pai, o InnoDB deletava ou atualizava o registro filho. Isto est alterado conforme o SQL92: voc recebe o erro 'Cannot delete parent row'.
Melhorado o algoritmo de auto incremento: agora o primeiro inserte ou SHOW TABLE STATUS inicializa o contador de auto incremento para a tabela. Isto remove quase todos os deadlocks causados pelo SHOW TABLE STATUS.
Alinhado alguns buffers usados na leitura e escrita dos arquivos de dados. Isto permite usar dispositivos raw sem buffer como arquivos de dados no Linux.
Corrigido um erro: se voc atualizasse a chave primria de uma tabela, podia ocorrer uma falha
de declarao em page0page.ic line 515.
Corrigido um erro: se voc deleta ou atualiza um registro referenciado em uma restrio de chave estrangeira e a verificao de chave estrangeira esperapor um lock, ento a verificao pode
relatar um resultado errneo. Isto tambm afeta a operao ON DELETE...
Corrigido um erro: se o banco de dados falha no meio de um commit, ento a recuperao pode
perder pginas de tablespace.
Corrigido um erro: DROP TABLE ou DROP DATABASE podiam falhar se houvesse um CREATE TABLE executando simultaneamente.
Corrigido um erro: se voc configurasse a rea de buffer com mais de 2GB em um computador
de 32 bits, o InnoDB falharia no buf0buf.ic linha 214.
Corrigido um erro: se voc rodou em modo AUTOCOMMIT, executou um SELECT, e imeditamente depois um RENAME TABLE, ento RENAME falharia e o MySQL reclamaria com o erro 192.
Corrigido um erro: se compilado no Solaris 64 bits, o InnoDB produiria um erro de bus na inicializao.
Corrigido um erro: uma join podia resultar em um segmentation faut ao copiar de uma coluna
BLOB para TEXT se alguma das colunas BLOB ou TEXT na tabela continham um valor NULL
do SQL.
Corrigido um erro: se voc adicionasse restries de chaves estrangeiras auto referenciais com
ON DELETE CASCADE a tabelas e uma deleo de registro fazia o InnoDB tentar deletar o
mesmo registro duas vezes devido a deleo em cascata e ento voc obtinha um falha de declarao.
Corrigido um erro: se voc usar o 'lock de usurio' do MySQL e fechasse uma conexo, ento o
InnoDB podia falhar em ha_innobase.cc, line 302.
O InnoDB agora suporta uma auto extenso do ltimo arquivo de dados. Voc no precisa prealocar todos os arquivos de dados na inicializao do banco de dados.
Faz diversas alteraes para facilitar o uso da ferramenta Hot Backup do InnoDB. Esta uma
ferramenta separada paga que voc pode usar para tirar backus online do seu banco de dados se
desligar o servidor ou configurar qualquer lock.
Se voc quiser executar a ferramenta Hot Backup do InnoDB em um arquivo de dados auto extendido voc ter que atualiz-lo para a verso ibbackup-0.35.
A fase de varredura do log na recuperao de falhas agora executar muito mais rpido.
A partir desta verso do servidor, a ferramenta de hot backup trunca os fins dos arquivos de dados do backup do InnoDB inutilizados.
Para permitir que a ferramenta de hot backp funcione, no Windows no usaremos mais E/S sem
buffer ou E/S assncrona nativa; usaremos a mesma assincronia simulada como no Unix.
Agora voc pode definir as clusulas ON DELETE CASCADE ou ON DELETE SET NULL em
caves estrangeiras.
Suprimimos a verificao de FOREIGN KEY se qualquer um dos valores de coluna na chave estrangeira ou chave referenciada a ser verificada SQL NULL. Isto compatvel com Oracle, por
exemplo.
SHOW CREATE TABLE agora tambm lista todas as restries de chaves estrangeiras. O
mysqdump tambm no esquece mais sobre sobre chaves estrangeiras na definiode tabelas.
Agora voc pode adicionar uma nova restrio de chave estrangeira com ALTER TABLE ...
ADD CONSTRAINT FOREIGN KEY (...) REFERENCES ... (...).
As definies de FOREIGN KEY agora permitem nomes de tabela e colunas entre aspas invertidas.
O comando MySQL SET TRANSACTION ISOLATION LEVEL ... agora tem o seguinte efeito
em tabelas InnoDB: se uma transao definida como SERIALIZABLE ento o InnoDB conceitualmente adiciona LOCK IN SHARE MODE para todas as leituras consistentes. Se uma
transao definida com qualquer outro nvel de isolao, ento o InnoDB obedece sua estratgia de lock padro que REPEATABLE READ.
SHOW TABLE STATUS no configuram mais um x-lock no fim de um ndice auto incremento
se um contador auto incremento j tiver sido inicializado. Isto remove quase todos os casos de
642
Corrigido em erro: em uma instruo CREATE TABLE statement a string 'foreign' seguida por
caracter que no seja de espao confuder o analizador do FOREIGN KEY e faz a criao de tabelas falhar com nmero de erro 150.
Corrigido um erro: se voc chamasse DROP DATABASE para um banco de dados no qual haviam consultas executando simultaneamente, o MySQL podia falhar ou travar. A falha foi corrigida, mas uma correo completa ter que esperar por alguas mudanas na camada de cdigo do
MySQL.
Corrigido um erro: no Windows deve se colocar o nome do banco de dados em minsculo para
DROP DATABASE funcionar. Corrigido na verso 3.23.49: o caso no mais problema no
Windows. No Unix o nome de banco de dadospermanece caso sensitivo.
Ajustado o otimizador SQL para favorecer busca de ndices sobre a varredura de tabelas com
mais frequencia.
Corrigido um problema de performance quando diversas consultas SELECT grandes esto executando concorrentemente em um computados Linux multiprocessador. Grandes consultas SELECT no limite da CPU tambe sero executadas mais rapdo em todas as plataformas de uma
maneira geral.
Se olog binrio do MySQL usado, o InnoD agora exibe, aps a recuperao de falhas, o nome
do ltimo arquivo de log binrio do MySQL e a posio neste arquivo (=byte offset) que o InnoDB pode recuperar. Isto til, por exemplo, quando sincronizar um banco de dados master e
um slave na replicao novamente.
Adicionado uma mensagem de erro melhor para ajudar nos problemas de instalao.
Pode-se agora recuperar tambm tabelas temporrias do MySQL que se tronaram rfo dentro
do tablespace do InnoDB.
O InnoDB agora previne que uma declarao FOREIGN KEY onde o sinal no o mesmo nas
colunas inteiras de referncia e referenciada.
Corrigido um erro: chamar SHOW CREATE TABLE ou SHOW TABLE STATUS poderia causar corrompimento de memria e fazer o mysqld falhar. O mysqldump, especialmente, corria este risco, j que ele chamava SHOW CREATE TABLE com frequencia.
Corrigido um erro: se no Unix voc fazia um ALTER TABLE em uma tabela e, simultaneamente, executava consultas nela, o mysqld podia falhar em uma declarao no row0row.c, linha 474.
Corrigido um erro: se inserir diversas tabelas contendo uma coluna auto incremento estava envolvida dentro do LOCK TABLES, o InnoDB falhava em lock0lock.c.
A verso 3.23.47 permitia diversos NULLS em um ndice secundrio UNIQUE. Mas CHECK
TABLE no era relaxed: ele rporta atabela como corrompida. CHECK TABLE no reclama
mais nesta situao.
A recuperao agora mais rpida, especialmente em um sistema de carga leve, pois a verificao do background tem sido feita com mais frequencia.
O InnoDB permite agora diversos valores de chaves parecidas em um ndice secundrio UNIQUE se aqueles valores contm NULLs do SQL. Assim a conveno agora a mesma das tabelas MyISAM.
O InnoDB traz uma melhor estimativa de contagem de linhas de uma tabela contendo BLOBs.
Em uma restrio FOREIGN KEY, o InnoDB agora caso insensitivo para nomes de colunas e
no Windows para nome de tabelas tambm.
O InnoDB permite uma coluna FOREIGN KEY do tipo CHAR se referir a uma coluna do tipo
VARCHAR e vice versa. O MySQL silenciosamente troca os tipos de algumas colunas entre
CHAR e VARCHAR e estas alteraes silenciosas no seguem declaraes de FOREIGN KEY
mais.
Clculo de estatsticas desnecessrias forma removidas das consultas que geravam um tabea
temporria. Algumas consultas ORDER BY e DISTINCT executaro muito mais rpido agora.
O MySQL agora sabe que a varredura de uma tabela InnoDB feita atravs de uma chave primria. Isto economizar uma ordenao em algumas consultas ORDER BY.
O tamanho mximo da chave de tabelas InnoDB est restrita novamente a 500 bytes. O interpretador do MySQL no pode tratar chaves longas.
Na verso 4.0.0 delees multi-tabelas no funcionavam para tabelas transacinais, Isto foi corrigido.
Nas verses 3.23.42-.44, ao criar uma tabela no Windows voc tinha que usar letras minsculas
nos nomes de bancos de dados para poder acessara tabela. Corrigido na verso 3.23.45.
O InnoDB agora descarrega stdout e stderr a cada 10 segundos; se eles estiverem redirecionados
para arquivos, o contedo do arquivo pode ser melhor vizualizado com um editor.
Corrigida um falha em .44, in trx0trx.c, linha 178 quando voc removia uma tabela cujo o arquivo .frm no existia dentro do InnoDB.
Corrigido um erro no buffer de insero. A rvore do buffer de insero podia entrar em um estado de inconsistncia, causando uma falha, e tambm falhara recuperao, Este erro podia aparecer, especialmente, em importao de grandes tabelas ou alteraes.
Corrigido um erro na recuperao: o InnoDB podia entrar em loop infinito constantemente exibindo uma mensagem de aviso de que ele no podia encontrar blocos livres na rea de buffer.
Corrigido um erro: quando voc criava uma tabela temporria de um tipo InnoDB e ento usava
ALTER TABLE para ela,o servidor MySQL podia falhar.
Corrigido um erro que podia causar um falha de declarao na verso 3.23.44 em srv0srv.c, linha 1728.
Voc pode definir restries de chaves estrangeiras em tabelas InnoDB. Um exemplo: FOREIGN KEY (col1) REFERENCES table2(col2).
Voc pode criar arquivos de dados > 4 GB naqueles sistems de arquivos que permitem isto.
Caracteres de acento no conjunto de caracteres padro latin1 sero ordenados de acordo com
com a ordenao do MySQL. NOTA: se voc est usando o latin1 e inseriu caracteres cujo cdigo > 127 em uma coluna CHAR indexada, voc deve executar CHECK TABLE em sua tabela
quando atualizar para a verso 3.23.43, e remover e reimportar a tabela se CHECK TABLE relatar um erro. reports an error!
Alterao na resoluo do deadlock: na verso 3.23.43 um deadlock fazia rolls back apenas nas
instrues SQL, 3.23.44 faz o rollback de toda a transao.
Deadlock, esgotamento do tempo de espera do lock e violao das restries de chave estrangeiras (sem registro pais e registros filhos existentes) agora retorna cdigos de erro nativos do
MySQL 1213, 1205, 1216, 1217, respectivamente.
Uma nova opo do my.cnf (innodb_force_recovery) lhe ajuda no dump de tabelas de um banco
de dados corrompidos.
Normalmente o InnoDB faz uma unio total dos buffers de insero e remoo na finalizao.
Aumentado o tamanho mximo da chave para 7000 bytes de um tamanho anterior de 500 bytes.
Corrigido um erro quando o caso das letras alteram em uma atualizao de uma coluna de ndice
secundrio.
Corrigido uma falha quando MAX(col) selecionado de uma tabela vazia, e col uma coluna
diferente da primeira em um ndice multi-colunas.
Corrigido um erro que corrompia a tabela se a chave primria de um registro com mais de
8000-byte fosse atualizado.
Existem 3 tipos de InnoDB Monitors: innodb_monitor, innodb_lock_monitor, and innodb_tablespace_monitor. Agora o innodb_monitor tambm mostra a taxa de acerto da rea de
buffer e o total de registros inseridos, atualizados, deletados e lidos.
InnoDB Monitor.
646
Uma coluna auto-increment agora obtem novos valores antes do mecanimo de transao. Isto
economiza tempo de CPU e elimina deadlocks em transaes em atribuies de novos valores.
O InnoDB agora chama fsync depois de cada escrita em disco e clacula um checksum para
todas as pginas do banco de dados que ele escreve ou l, revelando defeitos e disco.
Se voc tiver feito o download de uma verso binria do MySQL que inclui suporte a BerkeleyDB,
simplesmente siga as instrues de instalao de uma verso binria do MySQL. See Seco 2.2.9,
Instalando uma Distribuio Binria do MySQL. See Seco 4.8.5, mysqld-max, om servidor
mysqld extendido.
Para compilar o MySQL com suporte a BerkeleyDB, faa o download do MySQL verso 3.23.34 ou
mais novo e configure MySQL com a opo --with-berkeley-db. See Seco 2.3, Instalando
uma distribuio com fontes do MySQL.
cd /path/to/source/of/mysql-3.23.34
./configure --with-berkeley-db
Por favor, de uma olhada no manual fornecido com a distribuio BDB para informaes mais atualizadas.
Mesmo sendo o BerkeleyDB muito testado e confivel, a interface com o MySQL ainda considerada com qualidade gamma. Ns estamos ativamente melhorando e otimizando para torn-la estvel
o mais breve possvel.
Descrio
--bdb-home=directory Diretrio base das tabelas BDB. Ele deve ser o mesmo diretrio usado para --datadir.
--bdb-lock-detect=#
--bdb-no-recover
--bdb-shared-data
BDB. Isto pode, no entanto, lhe trazer problemas quando voc tentar iniciar o mysqld e os arquivos
de log do BDB estiverem corrompidos. See Seco 2.4.2, Problemas Inicializando o Servidor
MySQL .
Com bdb_max_lock voc pode especificar o nmero mcimo de travas (10000 por padro) que
voc pode tar ativas em uma tabela BDB. Voc deve aument-lo se voc obter um erro do tipo bdb:
Lock table is out of available locks ou Got error 12 from ... quando
voc fizer transaes longas ou quando mysqld tiver que examinar muitas linhas para calcular a
consulta.
Voc tambm pode desejar alterar binlog_cache_size e max_binlog_cache_size se voc estiver usando transaes multi-linhas. See Seco 6.7.1, Sintaxe de START TRANSACTION,
COMMIT e ROLLBACK.
Para estar apto a fazer roolback da transao, o mecanismo de armazenamento BDB mantm arquivos de log. Para obter o mximo de desempenho voc deve colocar estes arquivos em outro
disco diferente do usado por seus bancos de dados usando a opo --bdb-logdir.
O MySQL realiza um ponto de verificao a cada vez que um novo arquivo de log do BDB iniciado e remove qualquer arquivo de log que no for necessrio para a transao atual. Pode se
executar FLUSH LOGS a qualquer momento para faze um ponto de verificao de tabelas Berkeley DB.
Para recuperao de desastres, deve-se usar backups de tabelas mais log binrio do MySQL. See
Seco 4.5.1, Backups dos Bancos de Dados.
Aviso: Se voc delatar arquivos de log antigos que esto em uso, o BDB no estar apto a fazer a
recuperao e voc pode perder dados se algo der errado.
O MySQL precisa de uma PRIMARY KEY em cada tabela BDB para poder fazer referncia a linha lida anteriormente. Se voc no criar um o MySQL criar uma chave primria oculta para
voc. A chave oculta tem um tamanho de 5 bytes e incrementada a cada tentaiva de insero.
Se todas as colunas que voc acessa em uma tabela BDB so parte do mesmo ndice ou parte de
uma chave primria, ento o MySQL pode executar a consulta ser ter que acessar a linha atual.
Em uma tabela MyISAM o descrito acima guardado apenas se as colunas so parte do mesmo
ndice.
A PRIMARY KEY ser mais rpida que qualquer outra chave, j que a PRIMARY KEY armazenada junto com o registro do dado. Como as outras chaves so armazenads como os dados da
chave + a PRIMARY KEY, importante manter a PRIMARY KEY o menor possvel para economizar disco e conseguir maior velocidade.
LOCK TABLES funciona em tabelas BDB como nas outras tabelas. Se voc no utilizar LOCK
TABLE, MySQL comandar um bloqueio interno de mltipla-escrita nas tabelas para assegurar
que a tabela ser bloqueada apropriadamente se outra thread executar um bloqueio de tabela.
SELECT COUNT(*) FROM nome_tabela lento pois tabelas BDB no mantm um contador do nmero de linha na tabela.
A varredura sequencial mais lenta que com tabelas MyISAM j que os dados em tabelas BDB
so armazenados em rvores-B e no em um arquivo de dados separado.
A aplicao sempre deve estar preparada para tratar casos onde qualquer alterao de uma tabela
BDB pode fazer um rollback automtico e quqlquer leitura pode falhar com um erro de deadlock.
As chaves no so compactadas por prefixo ou por sufixo como em tabelas MyISAM. Em outras
palavras, a informao da chave gastar um pouco mais de espao em tabelas BDB quando comparadas a tabelas MyISAM.
649
Existem buracos frequentemente em tabelas BDB para permitir que voc insira novas linhas no
meio da rvore de chaves. Isto torna tabelas BDB um pouco maiores que tabelas MyISAM.
O otimizador precisa conhecer aproximadamente o nmero de linhas na tabela. O MySQL resolve isto contando inseres e mantendo isto em um segmento separado em cada tabela BDB. Se
voc no executar vrias instrues DELETE ou ROLLBACK, este nmero dever estar suficientemente prximo do exato para o otimizador do MySQL, mas como o MySQL s armazerna o
nmero ao finalizar, ele pode estar incorreto se o MySQL finalizar inesperadamente. Isto no deve ser fatail mesmo se este nmero no for 100% correto. POde se atualizar o nmero de linhas
executando ANALYZE TABLE ou OPTIMIZE TABLE. See Seco 4.6.2, Sintaxe de ANALYZE TABLE . See Seco 4.6.1, Sintaxe de OPTIMIZE TABLE.
Se voc ficar com o seu disco cheio com uma tabela BDB, voc obter um erro (provavelmente
erro 28) e deve ser feito um rollback da transao. Isto est em contraste com as tabelas MyISAM e ISAM onde o mysqld ir esperar por espao suficiente em disco pra continuar.
muito lento abrir muitas tabelas BDB ao mesmo tempo. Se voc for utilizar tabelas BDB, voc
no deve ter um cache de tabela muito grande (> 256) e voc deve usar --no-auto-rehash
com o cliente mysql. Ns planejamos arrumar isto parcialmente na versp 4.0.
SHOW TABLE STATUS ainda mo fornece muitas informaes para tabelas BDB
Otimizar o desempenho.
Fazer com que no seja utilizado bloqueio de pginas quando varrermos a tabela.
SCO OpenServer
650
Max OS X
Nota: A lista acima no est completa; atualizaremos ela assim que recebermos mais informaes.
Se voc construir o MySQL como suporte a tabelas BDB e obter o seguinte erro no arquivo de log
quando voc iniciar o mysqld:
bdb: architecture lacks fast mutexes: applications cannot be threaded
Can't init dtabases
Isto significa que as tabelas BDB no so suportadas por sua arquitetura. Neste caso voc deve reconstruir o MySQL sem o suporte a tabelas BDB.
Tabelas BDB armazenam no arquivo .db o caminho para o arquivo no qual ela foi crada. (Isto
foi feito para tornar possvel detectar travas em um ambiente multi-usurio que suporte links
simblicos)
O efeito disto que tabelas BDB no podem ser movidas entre diretrios!
Ao tirar backups de tabelas BDB, voc pode utilizar mysqldump ou tirar backup de todos os arquivos nome_tabela.db e os arquivos de log do BDB. Os arquivos de log do BDB so os arquivos no diretrio de dados base chamado log.XXXXXXXXXX (dez digitos); O mecanismo de
armazenamento BDB guarda transaes no terminadas em arquivos de log e exige que estes arquivos sejam apresentados quando o mysqld iniciar.
significa que a nova verso BDB no suporta o formato do arquivo de log antigo. Neste caso voc tem que deletar todos os logs BDB do seu diretrio de banco de dados (o arquivo com nomes
no formato log.XXXXXXXXXX) e reiniciar o mysqld. Tambm recomentdamos que voc faa
um mysqldump --opt de sua tabela BDB antiga, delete as tabelas antigas e restaure o dump.
Se voc no estiver executando em modo auto-commit e deltar uma tabela que referenciada em
outra transao, voc pode obter a seguinte mensagem de erro em seu log de erro do MySQL:
001119 23:43:56
001119 23:43:56
bdb:
bdb:
651
MaxDB funciona como um sistema cliente/servidor. O MySQL pode fincionar como um sistema
cliente/servidor ou como um sistema embutido.
652
Introduo ao MaxDB
O MaxDB no pode ser executado em todas as plataformas suportadas pelo MySQL. Por exemplo, o MaxDB no funciona no OS/2 da IBM.
O MaxDB usa um protocolo de rede proprietrio para comunicao cliente servidor, enquanto o
MySQL usa o TCP/IP (com ou sem criptografia SSL), sockets (sob sistemas do tipo Unix) ou
named pipes (sob sistemas da familia Windows-NT).
O MaxDB suporta stored procedures. Para o MySQL, stored procedures no esto programadas
para implementao at a verso 5.0. O MaxDB tambm suporta programao de triggers por
meio de extenso SQL, que est previsto para o MySQL 5.1. O MaxDB contm um depurador
para linguagens com stored procedures, pode fazer cascade de triggers aninhados e suporta vrios triggers por ao e linha.
O MaxDB distribudo com interface de usurios em modo texto, grfico ou baseado web. O
MySQL distribudo apenas com interfaces de usurios em modo text; uma interface grfica do
usurio (MySQL Control Center) distribuda separadamente da distribuo principal. Interfaces com o usurios baseada em Web para o MySQL so ofereceidas por terceiros.
O MaxDB contm recursos administrativos que o MySQL no tem: Agendamento de tarefas por
hora, evento, e alerta , e permite enviar mensagens para um administrador de banco de dados nos
avisos.
Haver um proxy MySQL permitindo que se conecte ao MaxDb usando o protocolo MySQL. Isto faz com que seja possvel usar os programas clientes do MySQL para o MaxDB, com a interface de linha de comando mysql, o utilitrio de dump mysqldump, o programa de importao
mysqlimport. Usando o mysqldump, pode-se facilmente fazer o dump de dados de um sistema de banco de dados e exportar estes dados para outro sistema de banco de dados.
Replicao entre MySQL e MaxDB ser suportado em ambas as direes. Isto , tanto o
MySQL quanto o MaxDb podem ser usados como o servidor master da replicao. O plano a
longo prazo convergir e extender a sintaxe da replicao para que assim ambos os sistemas de
bancos de dados entendam a mesma sintaxe. See Seco 4.11.1, Introduo.
Introduo ao MaxDB
ta.
Para a lista de palavras reservadas do MySQL, veja See Seco 6.1.7, Tratamento de Palavras Reservadas no MySQL.
Reservada
MaxDB
no Contexto
MaxDB
do
uso
no Correspondente no MySQL
ADDDATE()
Funo SQL
ADDTIME()
Funo SQL
ALPHA
Funo SQL
Nenhuma correspondencia
ARRAY
Tipo de dados
No implementado
ASCII()
Funo SQL
AUTOCOMMIT
BOOLEAN
CHECK
CHECK TABLE
COLUMN
Tipos de coluna
CHAR()
Funo SQL
COMMIT
COSH()
Funo SQL
Nenhuma correspondencia
COT()
Funo SQL
CREATE
DATABASE
Funo SQL
DATE()
Funo SQL
CURRENT_DATE
DATEDIFF()
Funo SQL
DAY()
Funo SQL
Nenhuma correspondencia
DAYOFWEEK()
Funo SQL
DISTINCT
Funes SQL AVG, MAX, DISTINCT; but used in a different context: SEMIN, SUM
LECT DISTINCT
DROP
EBCDIC()
Funo SQL
Nenhuma correspondencia
EXPAND()
Funo SQL
Nenhuma correspondencia
EXPLAIN
Optimization
FIXED()
Funo SQL
Nenhuma correspondencia
FLOAT()
Funo SQL
Nenhuma correspondencia
HEX()
Funo SQL
INDEX()
Funo SQL
Introduo ao MaxDB
INDEX
USE
INDEX, IGNORE
INDEX and similar hints are
being used right after SELECT, like SELECT ...
USE INDEX
INITCAP()
Funo SQL
Nenhuma correspondencia
LENGTH()
Funo SQL
LFILL()
Funo SQL
Nenhuma correspondencia
LIKE
Comparisons
LIKE wildcards
MaxDB supports ``%'', ``_'', MySQL supports ``%'', and ``_'' as wildcards in a
``ctrl+underline'', ``ctrl+up LIKE comparison
arrow'', ``*'', and ``?'' as
wildcards in a LIKE comparison
LPAD()
Funo SQL
LTRIM()
Funo SQL
MAKEDATE()
Funo SQL
MAKETIME()
Funo SQL
MAPCHAR()
Funo SQL
Nenhuma correspondencia
MICROSECOND()
Funo SQL
NOROUND()
Funo SQL
Nenhuma correspondencia
NULL
PI
Funo SQL
REF
Data type
Nenhuma correspondencia
RFILL()
Funo SQL
Nenhuma correspondencia
ROWNO
RPAD()
Funo SQL
RTRIM()
Funo SQL
SEQUENCE
CREATE
SEQUENCE, AUTO_INCREMENT; similar concept, but diffeDROP SEQUENCE
ring implementation
SINH()
Funo SQL
Nenhuma correspondencia
SOUNDS()
Funo SQL
STATISTICS
UPDATE STATISTICS
SUBSTR()
Funo SQL
SUBTIME()
Funo SQL
SYNONYM
TANH()
Funo SQL
Nenhuma correspondencia
TIME()
Funo SQL
CURRENT_TIME
TIMEDIFF()
Funo SQL
Introduo ao MaxDB
TIMESTAMP()
Funo SQL
Nenhuma correspondencia
TIMEZONE()
Funo SQL
Nenhuma correspondencia
TRANSACTION()
TRANSLATE()
Funo SQL
TRIM()
Funo SQL
TRUNC()
Funo SQL
USE
USER
Funo SQL
UTC_DIFF()
Funo SQL
VALUE()
Funo SQL, alias for COA- COALESCE(); identical syntax and implemenLESCE()
tation
VARIANCE()
Funo SQL
Nenhuma correspondencia
8.8. Funes
8.9. Tipos de Colunas
656
Os recursos descritos aqui esto como implementados no MySQL 4.1.1. (MySQL 4.1.0 possui alguns, mas no todos destes recuros, e alguns deles esto implementados de forma diferente.)
Mistura strings com diferentes conjuntos de caracteres ou collations no mesmo servidor, o mesmo banco de dados ou a mesma tabela
657
A este respeito, o MySQL 4.1 no s mais flexvel que o MySQL 4.0, mas tambm est bem a
frente de outros SGBDs. No entanto, para usar os novos recursos efetivamente, voc precisar
aprender quais conjuntos de caracteres e collations esto disponveis, como alterar os seus padres e
o que os vrios operadores de string fazem como ele.
Significado
latin1_bin
latin1_danish_ci
Dinamarqus/Noruegus
latin1_german1_ci
Alemo DIN-1
latin1_german2_ci
Alemo DIN-2
latin1_swedish_ci
Sueco/Finnish
latin1_general_ci
Multilingua
Notas:
Cada conjunto de caracteres tem uma collation que a collation padro. Por exemplp, o collation padro para latin1 latin1_swedish_ci.
Perceba que existe uma conveno para nomes de collations: Elas iniciam com o nome do conjunto
de caracteres com o qual elas so associadas, eles normalmente incluem um nome de linguagem e
finalizam com _ci (caso insensitivo), _cs (caso sensitivo), ou _bin (binario).
658
Neste nvel, a deciso simples. O conjunto de caracteres e collations do servidor dependem das opes que voc usa quando voc inicia o mysqld. Voc pode usar -default-character-set=character_set_name para o conjunto de caracteres, e junto
com isto voc pode adcionar --default-collation=collation_name para a collation. Se
voc no especificar um conjunto de caracteres, o mesmo que utilizar -default-character-set=latin1. Se voc especificar apenas um conjunto de caracteres
(por exemplo, latin1) mas no uma collation, o mesmo que usar -default-charset=latin1
--collation=latin1_swedish_ci
pois
latin1_swedish_ci a collation padro para latin1. Desta forma, os trs comando seguintees
todos tm o mesmo efeito:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1
--default-collation=latin1_swedish_ci
Um modo de o conjunto recompilando. Se voc quiser alterar o conjunto de caracteres e collation
padres na construo dos fontes, utilize: --with-character-set e --with-collation
como argumento para configure. Por exemplo:
shell> ./configure --with-character-set=latin1
ou
shell> ./configure --with-character-set=latin1
--with-collation=latin1_german1_ci
Tanto o mysqld quanto o configure verificam que a combinao conjunto de caracteres/collations vlida. Cada programa exibe um mensagem de erro e termina se a combinao no for vlida.
659
A sintaxe CREATE DATABASE ... DEFAULT CHARACTER SET ... do MySQL anloga
a sintaxe CREATE SCHEMA ... CHARACTER SET ... do padro SQL. Por isto, possvel
criar bancos de dados com com conjunto de caracteres e collations diferentes, no mesmo servidor
MySQL.
O conjuto de caracteres e collations do banco de dados so usados como valores padres se o conjunto de caracteres e a collation de tabela no forem especificados nas instrues CREATE TABLE.
Eles no possuem nenhum outro propsito.
O conjunto de caracteres e collation de tabela so usado como valores padres, se o conjunto de caracteres e collation de colunas no so especificados nas definies de colunas individuais. O conjunto de caracteres e collation de tabelas so extenses MySQL; no h nada deste tipo na padro
SQL.
660
661
Criamos uma coluna sem especificar seu conjunto de caracteres e collation. Tambm no especificamos um conjunto de caracteres e uma collation na nvel de tabela. Nestas circubntncias, o MySQL
olha para o nvel de banco de dados para a determinao. (A configurao do banco de dados se torna a configurao da tabela e ento a configurao da coluna). Assim o conjunto de caracteres para
coluna c1 latin2 e sua collation latin2_czech_ci.
Exemplos:
Uma string com conjunto de caracteres latin1 e e sua collation padro, isto , latin1_swedish_ci:
SELECT _latin1'Mller';
Com a clusula COLLATE voc pode sobrescrever o padro da collation, qualquer que seja ele, para
comparao. COLLATE pode ser usada em vrias partes da consulta SQL. Aqui esto alguns exemplos:
Com AS:
SELECT k COLLATE latin1_german2_ci AS k1
FROM t1
ORDER BY k1;
Com DISTINCT:
SELECT DISTINCT k COLLATE latin1_german2_ci
FROM t1;
Com WHERE:
SELECT *
FROM t1
WHERE _latin1 'Mller' COLLATE latin1_german2_ci = k;
Com HAVING:
SELECT k
FROM t1
GROUP BY k
HAVING k = _latin1 'Mller' COLLATE latin1_german2_ci;
664
Exemplos:
column1 = 'A'
665
latin1_german1_ci
latin1_german2_ci
Muffler
Muffler
Mller
MX Systems
Mller
Muffler
Mller
MX Systems
MX Systems
MySQL
MySQL
MySQL
A tabela um exemplo que mostra que mostra qual seria o efeito se usassemos collation diferentes
em um clusula ORDER BY. O caracter que est causando o problema neste exemplo o U com
dois pontos sobre ele, que os Alemes chamam de U-umlaut, mas ns chamamos de U-diaeresis.
A primeira coluna mostra o resultado da SELECT usando as regras de collation Suco/Finlands,
que diz que U-diaeresis ordena com Y.
A segunda coluna mostra o resultado da SELECT usando as regras Almo DIN-1, que diz que Udiaeresis ordena com U.
A terceira coluna mostra o resultado da SELECT usando as regras Almo DIN-2, que diz que Udiaeresis ordena com UE.
Trs collation diferentes, trs resultados diferentes. Isto o que o MySQL est aqui para tratar.
Usando a collation apropriada, voc pode esclher a ordem que voc deseja.
666
Por exemplo, com CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END, a collation resultante X. O mesmo se aplica a: CONCAT(), GREATEST(), IF(), LEAST(), CASE,
UNION, ||, ELT().
Para operaes que convertem para dados de caracteres, o resultado do conjunto de caracteres e collation da string esto no connection/literals character set e possuem a connection/literals collation.
Isto se aplica a: CHAR(), CAST(), CONV(), FORMAT(). HEX(), SPACE().
9.4.2. CONVERT()
CONVERT() fornece um modo de converter dados entre diferentes conjunto de caracteres. A sintaxe :
CONVERT(expr USING transcoding_name)
No MySQL, nomes transcodificados so o mesmo que o nomes dos conjuntos de caracteres correspondentes.
Exemplos:
SELECT CONVERT(_latin1'Mller' USING utf8);
INSERT INTO utf8table (utf8column)
SELECT CONVERT(latin1field USING utf8) FROM latin1table;
CONVERT(... USING ...) implementado de acordo com a especificao SQL-99.
9.4.3. CAST()
Voc tambm pode usar CAST() para converter uma string para um conjunto de caracteres diferente. O novo formato :
CAST ( character_string AS character_data_type
CHARACTER SET character_set_name )
667
Exemplo:
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);
Voc no usar uma clusula COLLATE dentro de um CAST(), mas voc pode us-la fora, isto ,
CAST(... COLLATE ...) ilegal mas CAST(...) COLLATE ... permitido.
Exemplo:
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;
Se voc usar CAST() sem especificar CHARACTER SET, ento o conjunto de caracteres e collation resultante so o conjunto de caracteres da conexo/literal e a sua collation padro. Se voc usar
CAST() com CHARACTER SET X, ento o conjunto de caracteres resultante X e a collation resultante a collation padro de X.
A coluna Maxlen exie o nmero mximo de bytes usado para armazenar um caracter.
Na UCS-2 (representao Unicode binria) todo caracter representado por um cdigo Unicode
de dois bytes com o byte mais significante primeiro. Por exemplo: "LATIN CAPITAL LETTER
A" tem o cdigo 0x0041 e armazenado como uma sequncia de dois bytes: 0x00 0x41. "CYRILLIC SMALL LETTER YERU" (Unicode 0x044B) armazenada como uma sequncia de
dois bytes: 0x04 0x4B. Para caracteres Unicode e seus cdigo veja a Unicode Home Page
[http://www.unicode.org/].
Restrio temporria: UCS-2 no pode (ainda) ser usado como um conjunto de caracteres de cliente. Insto significa que SET NAMES ucs2 no funcionar.
A maioria das letras script da Europa e Oriente Mdio cabem em uma sequncia de dois bytes: letras Latin extendidas (com til, agudo, grave e outros acentos), Cirlico, Grego, Armenio, Hebreu, rabe, Srio e outors.
669
Dica: economize spao com UTF8, use VARCHAR em vez de CHAR. Seno, o MySQL tem que
reservar 30 bytes para uma coluna CHAR(10) CHARACTER SET utf8, pois este o tamanho mximo possvel.
ro prximo.
671
Finalmente, existe um formato de arquivo diferente para armazenar informaes sobre conjunto de
caracteres e collation. Esteja certo que voc reinstalou o diretrio /share/mysql/charsets/
contendo o novo arquivo de configuraes.
Se voc quiser iniciar o mysqld de uma distribuio 4.1.x com dados craidos pelo MySQL 4.0, voc deve iniciar o servidor com o mesmo conjunto de caracteres e collation. Neste caso voc no precisar de reindexar os dados.
Existem dois modos de faz-lo:
shell> ./configure --with-character-set=... --with-collation=...
shell> ./mysqld --default-character-set=... --default-collation=...
Se voc usou o mysql com, por exemplo, oconjunto de caracteres danish do MySQL 4.0, voc
agora deve usar o conjunto de caracteres latin1 e a collation latin1_danish_ci:
shell> ./configure --with-character-set=latin1
--with-collation=latin1_danish_ci
shell> ./mysqld --default-character-set=latin1
--default-collation=latin1_danish_ci
Use a tabela mostrada na prxima seo para encontrar o nome do antigo conjunto de caracteres do
MySQL 4.0 e o par conjunto de caracteres/collation equivalente no MySQL 4.1.
big5
big5
big5_chinese_ci
czech
latin2
latin2_czech_ci
dec8
dec8
dec8_swedish_ci
dos
cp850
cp850_general_ci
german1
latin1
latin1_german1_ci
hp8
hp8
hp8_english_ci
koi8_ru
koi8r
koi8r_general_ci
latin1
latin1
latin1_swedish_ci
latin2
latin2
latin2_general_ci
10
swe7
swe7
swe7_swedish_ci
11
usa7
ascii
ascii_general_ci
12
ujis
ujis
ujis_japanese_ci
13
sjis
sjis
sjis_japanese_ci
14
cp1251
cp1251
cp1251_bulgarian_ci
15
danish
latin1
latin1_danish_ci
16
hebrew
hebrew
hebrew_general_ci
17
win1251
(removed)
(removed)
18
tis620
tis620
tis620_thai_ci
19
euc_kr
euckr
euckr_korean_ci
20
estonia
latin7
latin7_estonian_ci
21
hungarian
latin2
latin2_hungarian_ci
672
22
koi8_ukr
koi8u
koi8u_ukrainian_ci
23
win1251ukr
cp1251
cp1251_ukrainian_ci
24
gb2312
gb2312
gb2312_chinese_ci
25
greek
greek
greek_general_ci
26
win1250
cp1250
cp1250_general_ci
27
croat
latin2
latin2_croatian_ci
28
gbk
gbk
gbk_chinese_ci
29
cp1257
cp1257
cp1257_lithuanian_ci
30
latin5
latin5
latin5_turkish_ci
31
latin1_de
latin1
latin1_german2_ci
NB: TODOS OS CONJUNTO DE CARACTERES TEM UMA COLLATION BINRIA. NO INCLUMOS A COLLATION BINRIA EM TODAS AS DESCRIES A SEGUIR.
+----------+-----------------------------+---------------------+--------+
+----------------------+----------+----+---------+----------+---------+
| koi8r_general_ci
| koi8r
| 7 | Yes
|
|
0 |
| koi8r_bin
| koi8r
| 74 |
|
|
0 |
+----------------------+----------+----+---------+----------+---------+
676
678
10.1. Introduo
O MySQL implementea extenses espaciais seguindo especificaes do Open GIS Consortium (OGC). Este um consrcio internacional com mais de 250 companhias, agncias, universidades participando no desenvolvimento de solues conceituais disponveis publicamente que podem der teis com todos os tipos de aplicaes que gerenciam dados espaciais. O OGC mantm um
web site em http://www.opengis.org/.
Em 1997, o Open GIS Consortium publicou o OpenGIS (R) Simple Features Specifications For SQL
(Especificaes de Recursos OpenGIS (R) Simples Para SQL), um documento que propos diversos
modos conceituais de para extender um SQL RDBMS para suportar dados espaciais. Esta especificao
est
disponvel
no
web
site
do
OpenGIS
em
http://www.opengis.org/techno/implementation.htm. Ele contm informaes adicionais relevantes
a este captulo.
O MySQL implementa um subconjunto do ambiente SQL com Tipos Geomtricos proposto pela
OGC. Este termo se refere a um ambiente SQL que tem sido extendido com um conjunto de tipos
geomrtricos. Uma coluna SQL com valor geomtrico implementada como uma coluna de um tipo
geomtrico. As especificaes descrevem um conjunto de tipod geomtricos do SQL, bem como
funes deste tipo para criar e analisar valores geomtricos.
Um recurso geogrfico qualquer coisa no mundo que tem uma posio.
Um recurso pode ser:
Uma localizao definida. Por exemplo, um cruzamento. como um lugar especfico onde duas
ruas se interceptam.
Voc tambm pode encontrar documentos que utilizam o termo recurso geoespacial para se referir
a recursos geogrficos.
Geometria outra palavra que denota um recurso geogrfico. O significado original da palavra geometria denota um ramo da matemtica. Outro significado vindo da cartografia, se referem aos recursos geomtricos que os cartgrafos usam para mapear o mundo.
679
Este captulo utiliza todos estes termos como sinnimo: recurso geogrfico, recurso geoespacial,
recurso ou geometria, O termo normalmente mais usado aqui geometry.
Vamos definir uma geometria como um ponto ou um agregado de pontos representando alguma
coisa no mundo que possui uma localizao.
Geometry (no-instancivel)
Point (instancivel)
Curve (no-instancivel)
Line
LinearRing
Surface (no-instancivel)
LineString (instancivel)
Polygon (instancivel)
GeometryCollection (instancivel)
MultiPoint (instancivel)
MultiCurve (no-instancivel)
MultiLineString (instancivel)
MultiSurface (no-instancivel)
MultiPolygon (instancivel)
Algumas destas classes so abstratas (no-instancivel). Isto , no possvel criar um objeto desta
classe. Outras classes so instanciveis e objetos podem ser criados deles. Cada classe tem propriedades e podem ter declaraes (regras que definem intncias de classes vlidas).
Geometry a classe base. uma classe abstrata (no-instancivel). As subclasses instanciveis de
Geometry so restritas a objetos geomtricos de zero, uma e duas dimenses que existem no espeao de coordenadas bidimensional. Todas as classes geomtricas instanciveis so definidas para
que instncias vlidas da classe geometry so topologicamente fechados (isto , todas as geometrias
definidas incluem seus limites).
680
A classe base Geometry tem subclasses para Point, Curve, Surface e GeometryCollection:
Curve representam para objetos de uma dimenso, e tem a subclasse LineString, com subclasses Line e LinearRing.
o tipo (type). Cada geometria pertence a uma das classes instanciveis na hierarquia.
Seu SRID ou Identificador de Referncia Espacial. Este valor identifica o Sistema de Referncia
Espacial associada da geometria, o qual descreve o coordenada espacial na qual objeto geomtrico est definido.
Coordenadas (coordinates) em seu Sistema de Referncia Espacial, representado por um nmero de preciso dupla (8 byte). Todas as geometrias no-vazias incluem pelo menos um par de coordenadas (X,Y). Geometrias vazias no contem cooredenadas.
Coordenadas esto relacionadas ao SRID. Por exemplo, em sistemas de coordenadas diferentes,
a distncia entre dois objetos podem diferir mesmo quando os objetos tm as mesmas coordenadas, porque as distncias no sistema de coordenadas planar e a distncia no sistema geocentrico
(coordenadas na superfcie da Terra) so coisas diferentes.
Seu MBR (Retngulo de Limite Mnimo - Minimum Bounding Rectangle), ou Envelope, da geometria. Este a geometria limitar, formado pelas coordenadas de mnimo e mximo (X,Y):
((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
681
A qualidade de ser closed ou not closed (fechado ou no fechado). Valores geomtricos de alguns tipos (LineString, MultiString) podem ser fechado ou no fechado. Cada tipo determina a sua prpria afirmao de ser fechado ou no fachado.
A qualidade de ser empty ou not empty (vazio ou no vazio). Uma geometria vazia se ela no
tem nenhum ponto. Exterior, interior e limite de ma geometria vazia no esto definidos. (isto ,
eles so representados por valores NULL). Uma geometria vazia definida sempre simples e ter
um rea de 0.
Sua dimenso (dimension). Uma geometria pode ter uma dimenso de #1, 0, 1 or 2:
Points tem uma dimensio de zero. LineStrings tem uma dimenso de 1. Polygons tem
uma dimenso de 2. Dimenses de MultiPoints, MultiLineStrings e MultiPolygons so a mesma da dimenso dos elementos dos quais eles consistem.
Imagine um mapa do munod de larga-escala com muitas cidades. Um ponto poderia representar
cada cidade.
Propriedades de Point
Valor de coordenada X.
Valor da coordenada Y.
A Curve simples (simple) se ela no passa pelo mesmo ponto duas vezes.
O limite (boundary) de uma Curve no-fachada cociste do seus dois pontos finais.
Propriedades LineString
A especificao OpenGIS define uma Surface simples como uma geometria que consiste de
um nico 'patch' que associado com um 'exterior boundary' (limite exterior) e zero ou mais 'interior' boundaries (limites interiores).
As afirmaes para os polygons (as regras que definem polygons vlidos) so:
1.
O limite (boundary) de um Polygon consiste de um conjunto de LinearRings (ex. LineStrings que so simples e fechadas) que fazem os seus limites interior e exterior.
2.
Dois aneis no limite no podem se cruzar. Os aneis no limite de um Polygon podem se interseptar em um Point, mas apenas como uma tangente.
3.
4.
5.
O Exterior de um Polygon com um ou mais buracos no est conectado. Cada buraco define
um componenete conectados do exterior.
Nas afirmaes acimas, poligonos so geometrias simples. Estas afirmaes fazem de um Polygon
uma geometria simples.
Tipo de Elementos (por exemplo, um MultiPoint pode conter apenas elementos Point
Dimenso.
Propriedades de MultiPoint
A MultiCurve simples se e somente se todos os seus elementos so simples, a nica interseo entre quaisquer dois elementos ocorrem entre pontos que esto nos limites (boundaries) de
ambos os elementos.
O limite (boundary) de uma MultiCurve obtida aplicando a "mod 2 union rule": Um ponto
est no limite (boundary) de uma MultiCurve se ele est no limite de um nmero mpar de
elementos da MultiCurve.
2.
O limite de quaiqsquer dois elementos em um MultiSurface podem interceptar em um nmero finito de pontos.
2.
Os limites (Boundaries) de quaisquer dois valores Polygon que so elementos de um MultiPolygon no podem cruzar e pode se tocar em um nmero finito de pontos. (O cruzamento tambm proibido pela primeira afirmao.)
3.
4.
Propriedades de MultiPolygon
O limite (boundary) de um MultiPolygon um conjunto de curvas fechadas (valores LineStrings) correspondente ao limite dos valores seus elementos Polygon.
Internamente, o MySQL armazena valores geometry em um formato que no identico nem ao format WKT ou WKB.
Um Point (ponto).
POINT(15 20)
Note que pontos coordenados so especificados sem separo por vrgulas.
686
Uma gramtica Backus-Naur que especifica as regras de produo formal para gravar valores WKT
podem ser encontrados na documentao de especificao OGC indicada prximo ao incio deste
captulo.
:
:
:
:
01
01000000
000000000000F03F
000000000000F03F
O byte order pode ser de 0 ou 1 para indicar o tipo little-endian ou big-endian. Os byte orders little-endian e big-endian tambm so conhecidos como Network Data Representation - Representao de Dados de Rede (NDR) e External Data Representation - Representao de Dados Externos (XDR), repectivamente.
O tipo WKB um cdigo que indica o tipo de geometria. Valores de 1 a 7 indicam Point, Li687
Um valor Point tm coordenadas X e Y, cada uma representada como um valor de dupla preciso.
Valores WKB para valores de geometria mais complexas so representados por estrutras de dados
mais complexas, como detalhado na epecificao OpenGIS.
GEOMETRY
POINT
LINESTRING
POLYGON
O tipo GEOMETRY o mais genrico destes tipos, ele pode armazenar geometrias de qualquer tipo.
Os outros tipos restringem seus valores a tipos de geometria especficos.
Os outros tipos de dados tem colees de valores:
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
GEOMETRYCOLLECTION
GEOMETRYCOLLECTION pode armazenar uma coleao de objetos de qualquer tipo. Os outros tipos
de colees restrigem o tipo dos membros da coleo para um tipo de geometria especfico.
688
GeomFromText() aceita um WKT de qualquer tipo de geometria com seu primeiro argumento.
Uma implementao tambm fornece uma funo de construo especfica do tipo para cada tipo de
geometria.
GeomFromText(wkt[,srid]) , GeometryFromText(wkt[,srid])
Controi um valor geometria de qualquer tipo usando sua representao WKT e SRID.
PointFromText(wkt[,srid])
Controi um valor POINT usando sua representao WKT e SRID.
LineFromText(wkt[,srid]) , LineStringFromText(wkt[,srid])
Constroi um valor LINESTRING usando sua representao WKT e SRID.
PolyFromText(wkt[,srid]) , PolygonFromText(wkt[,srid])
Constroi um valor POLYGON usasdo sua representao WKT e SRID.
MPointFromText(wkt[,srid]) , MultiPointFromText(wkt[,srid])
Contri um valor MULTIPOINT usando sua representao WKT e SRID.
MLineFromText(wkt[,srid]) , MultiLineStringFromText(wkt[,srid])
Contri um valor MULTILINESTRING usando sua representao WKT e SRID.
MPolyFromText(wkt[,srid]) , MultiPolygonFromText(wkt[,srid])
Contri um valor MULTIPOLYGON usando sua representao WKT e SRID.
GeomCollFromText(wkt[,srid])
Text(wkt[,srid])
GeometryCollectionFrom-
BdPolyFromText(wkt,srid)
Constri um valor Polygon a partir de um valor MultiLineString no formato WKT contendo uma coleo arbitrria de valores LineString fechados.
BdMPolyFromText(wkt,srid)
Constri um valor MultiPolygon a partir de um valor MultiLineString no formato
WKT contendo uma coleo arbitrria de vlaores LineString fechados.
O MySQL fornece um conjunto de funes que utilizam um BLOB contendo representao WellKnown Binary (e, opcionalmente, um indentificador de sistema de referncia espacial (SRID)), e retornam a geometria correspondente.
GeomFromWKT pode acitar um WKB de qualquer tipo de geometria como seu primeiro argumento.
Uma implementao tambm fornece uma funo de construo especfica para cada tipo de geometria como descrito na lista acima.
GeomFromWKB(wkb,srid) , GeometryFromWKB(wkt,srid)
Constri um valor geometria de qualquer tipo usando seua representao WKB e SRID.
PointFromWKB(wkb[,srid])
Constri um valor POINT usando sua representao WKB e SRID.
LineFromWKB(wkb[,srid]) , LineStringFromWKB(wkb[,srid])
Constri um valor LINESTRING usando sua representao WKB e SRID.
PolyFromWKB(wkb[,srid]) , PolygonFromWKB(wkb[,srid])
Constri um valor POLYGON usando sua representao WKB e SRID.
MPointFromWKB(wkb[,srid]) , MultiPointFromWKB(wkb[,srid])
Constri um valor MULTIPOINT usando sua representao WKB e SRID.
MLineFromWKB(wkb[,srid]) , MultiLineStringFromWKB(wkb[,srid])
Constri um valor MULTILINESTRING usando sua representao WKB e SRID.
MPolyFromWKB(wkb[,srid]) , MultiPolygonFromWKB(wkb[,srid])
Constri um valor MULTIPOLYGON usando sua representao WKB e SRID.
GeomCollFromWKB(wkb[,srid])
FromWKB(wkt[,srid])
GeometryCollection-
BdPolyFromWKB(wkb,srid)
Constri um valor Polygon a partir de um valor MultiLineString no formato WKB contendo uma coleo arbitrria de valores LineString fechados.
BdMPolyFromWKB(wkb,srid)
Constri um valor MultiPolygon a partir de um valor MultiLineString no formato
690
Point(x,y)
Constri um Point WKB usando suas cooerdenadas.
MultiPoint(pt1,pt2,...)
Constri um MultiPoint WKB usando WKBPoints. Quando o argumento no Point
WKB, o valor de retorno NULL.
LineString(pt1,pt2,...)
Constri um LineString WKB de um nmero de Points WKB. Quando o argumento no
Point WKB, o valor de retorno NULL. Quando o nmero de Points menor que dois o valor de retorno NULL.
MultiLineString(WKBLineString,WKBLineString,...,WKBLineString)
Constri um MultiLineString WKB usando LineStrings WKB. Quando o argumento
no LineString WKB, o valor de retorno NULL.
Polygon(ls1,ls2,...)
Constri um Polygon de um nmero de LineStrings WKB. Quando o arguemnto no representa o WKB de um LinearRing (ex. LineString no fechada e simples) o valor de retorno NULL.
MultiPolygon(poly1,poly2,...)
Constri um MultiPolygon WKB de um conjunto de Polygons WKB. Quando o argumento no um Polygon WKB, o valor de retorno NULL.
GeometryCollection(WKBGeometry,WKBGeometry,..,WKBGeometry)
Constucts a GeometryCollection WKB. Quando o argumento no uma representao
WKB bem formada de uma geometria, o valor de retorno NULL.
CREATE TABLE
Use a instruo CREATE TABLE para criar uma tabela com uma coluna espacial:
mysql> CREATE TABLE geom (g GEOMETRY);
Query OK, 0 rows affected (0.02 sec)
mysql>
ALTER TABLE
Use a instruo ALTER TABLE para adicionar ou deletar uma coluna espacial a ou de uma tabela existente:
mysql> ALTER TABLE geom ADD pt POINT;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE geom DROP pt;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
Todos os exemplos anteiores usam GeomFromText() para criar os valores de geometria. Voc
tambm pode usar funes de tipo especficos:
SET @g
INSERT
SET @g
INSERT
SET @g
INSERT
SET @g
= 'POINT(1 1)';
INTO geom VALUES (PointFromText(@g));
= 'LINESTRING(0 0,1 1,2 2)';
INTO geom VALUES (LineStringFromText(@g));
= 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))';
INTO geom VALUES (PolygonFromText(@g));
= 'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
692
Uma aplicao ODBC pode enviar uma representao WKB, ligando como um argumento do tipo BLOB:
INSERT INTO geom VALUES (GeomFromWKB(?));
Outra interfaces de programao podem suportar um mecanimo de placeholder similar.
693
Funes de anlise espacial podem ser usados em muitos contextos, tais como:
GeomFromText(wkt[,srid])
Converte um valor string de sua representao WKT em formato de geometria interna e retorna
o resultado. Um nmero de funes especficas de tipo tambm so suportadas, como PointFromText() e LineFromText(); veja Seco 10.4.2.1, Criando Valores Geometry Usando Funes WKT.
GeomFromWKB(wkb [,srid])
Converte um valor binrio da sua representao WKB em formato de geometria interna e retorna
o resultado. Um nmero de funes especficas de tipo tambm so suportadas, como PointFromWKB() e LineFromWKB(); veja Seco 10.4.2.2, Criando Valores Geometry Usando
Funes WKB.
AsText(g)
Converte um valor em formato de geomtria interna em sua representao WKT e retorna a string
resultante.
mysql> SET @g = 'LineString(1 1,2 2,3 3)';
mysql> SELECT AsText(GeomFromText(@g));
+--------------------------+
| AsText(GeomFromText(@G)) |
+--------------------------+
| LINESTRING(1 1,2 2,3 3) |
+--------------------------+
694
AsBinary(g)
Converte um valor em formato de geomtria interna em sua representao WKB e retorna o valor
binrio resultante
GeometryType(g)
Retorna como string o nome do tipo da geometria da qual esta instncia g de geometry um
membro. O nome corresponder a uma das subclasses instanciveis de Geometry.
mysql> SELECT GeometryType(GeomFromText('POINT(1 1)'));
+-------------------------------------------------+
| GeometryType(GeomFromText('POINT(1 1)')) |
+-------------------------------------------------+
| POINT
|
+-------------------------------------------------+
Dimension(g)
Retorna a dimenso herdada deste objeto g de geometria. O resultado pode ser #1, 0, 1 or 2. (o
significado destes valores dado em Seco 10.2.2, Classe Geometry.)
SRID(g)
Retorna um inteiro indicando ID do Sistema de Referncia Espacial do valor de geometria g.
mysql> SELECT SRID(GeomFromText('LineString(1 1,2 2)'));
+-----------------------------------------------+
| SRID(GeomFromText('LineString(1 1,2 2)',101)) |
+-----------------------------------------------+
695
|
101 |
+-----------------------------------------------+
Envelope(geometry g):geometry
Retorna o Retngulo de Limite Mnimo (Minimum Bounding Rectangle (MBR)) para o valor de
geometria g. O resultado retornado como um polygon (polgono).
mysql> SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)',101)));
+------------------------------------------------------+
| AsText(Envelope(GeomFromText('LineString(1 1,2 2)')) |
+------------------------------------------------------+
| POLYGON((1 1,2 1,2 2,1 2,1 1))
|
+------------------------------------------------------+
O polygon definido pelos pontos nos cantos da caixa que o limita:
POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
A especificao OpenGIS tambm define as seguintes funes, que o MySQL ainda no implementou:
Boundary(g)
Retorna uma geometria que o fechamento do limite combinacional do valor da geometria g.
IsEmpty(g)
Retorna 1 se o valor da geometria g e a geometria vazia, 0 se ela no est vazia e #1 se o argumento NULL. Se a geometria est vazia, ela representa um conjunto de pontos vazios.
IsSimple(g)
Atualmewnte esta funo no deve ser usada. Quando implementada, seu comportamento ser
como descrito no prximo pargrafo.
Retorna 1 se o valor da geometria g no tem nenhum ponto geomtrico anormal, como a interseo prpria ou tangente prpria. IsSimple retorna 0 se o argumento no simples, e #1 se
NULL.
A descrio de cada geomtrica instancivel dada anteriormente neste captulo inclui a condio
especfica que faz com que uma instncia desta classe seja classificada como no simples.
X(p)
Retorna o valor da coordenada X para o ponto p como um nmero de dupla preciso.
mysql> SELECT X(GeomFromText('Point(56.7 53.34)'));
696
+--------------------------------------+
| X(GeomFromText('Point(56.7 53.34)')) |
+--------------------------------------+
|
56.7 |
+--------------------------------------+
Y(p)
Retorna o valor da coordenada Y para o ponto p como um nmero de dupla preciso.
mysql> SELECT Y(GeomFromText('Point(56.7 53.34)'));
+--------------------------------------+
| Y(GeomFromText('Point(56.7 53.34)')) |
+--------------------------------------+
|
53.34 |
+--------------------------------------+
EndPoint(ls)
Retorna o Point que o ponto final do valor LineString ls.
mysql> SELECT AsText(EndPoint(GeomFromText('LineString(1 1,2 2,3 3)')));
+------------------------------------------------------------+
| AsText(EndPoint(GeomFromText('LineString(1 1,2 2,3 3)'))) |
+------------------------------------------------------------+
| POINT(3 3)
|
+------------------------------------------------------------+
GLength(ls)
Returna como um nmero de preciso dupla o tamanho do valor LineString ls em sua referncia espacial associada.
mysql> SELECT GLength(GeomFromText('LineString(1 1,2 2,3 3)'));
+--------------------------------------------------+
| GLength(GeomFromText('LineString(1 1,2 2,3 3)')) |
+--------------------------------------------------+
|
2.8284271247462 |
+--------------------------------------------------+
IsClosed(ls)
Returna 1 se o valor LineString ls fechado (isto , seus valores StartPoint() e EndPoint() so os mesmos). Returna 0 se ls no fechado, e #1 se ele NULL.
mysql> SELECT IsClosed(GeomFromText('LineString(1 1,2 2,3 3)'));
+---------------------------------------------------+
| IsClosed(GeomFromText('LineString(1 1,2 2,3 3)')) |
+---------------------------------------------------+
697
|
0 |
+---------------------------------------------------+
NumPoints(ls)
retorna o nmero de pontos no valor LineString ls.
mysql> SELECT NumPoints(GeomFromText('LineString(1 1,2 2,3 3)'));
+----------------------------------------------------+
| NumPoints(GeomFromText('LineString(1 1,2 2,3 3)')) |
+----------------------------------------------------+
|
3 |
+----------------------------------------------------+
PointN(ls,n)
Returna o n-simo ponto no valor Linestring ls.
mysql> SELECT AsText(PointN(GeomFromText('LineString(1 1,2 2,3 3)'),2));
+-----------------------------------------------------------+
| AsText(PointN(GeomFromText('LineString(1 1,2 2,3 3)'),2)) |
+-----------------------------------------------------------+
| POINT(2 2)
|
+-----------------------------------------------------------+
StartPoint(ls)
Returna o Point que o ponto inicial do valor LineString ls.
mysql> SELECT AsText(StartPoint(GeomFromText('LineString(1 1,2 2,3 3)')));
+-------------------------------------------------------------+
| AsText(StartPoint(GeomFromText('LineString(1 1,2 2,3 3)'))) |
+-------------------------------------------------------------+
| POINT(1 1)
|
+-------------------------------------------------------------+
A especificao OpenGIS tambm define as seguintes funes, que o MySQL ainda no implementou:
IsRing(ls)
Retorna 1 se o valor LineString ls fechado (isto , seus valores StartPoinnt() e
EndPoint() so os mesmos) e simples (no passa pelo mesmo ponto mais de uma vez). Retorna 0 se ls no um anel, #1 se NULL.
GLength(mls)
Retorna o tamanho do valor de MultiLineString mls como um nmero e preciso dupla.
698
Area(poly)
Returna como um nmero de dupla preciso a rea do valor Polygon poly, como medido em
seu sistema de referncia espacial.
mysql> SELECT Area(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2
+---------------------------------------------------------------------------| Area(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'))
+---------------------------------------------------------------------------|
8
+----------------------------------------------------------------------------
NumInteriorRings(poly)
Retorna o nmero de anis interiores no valor Polygon poly.
ExteriorRing(poly)
Retorna o anel exterior do valor Polygon poly como uma LineString.
InteriorRingN(poly,n)
Retorna o n-simo anel exterior para o valor Polygon poly como uma LineString.
A especificao OpenGIS tambm define as seguintes funes, que o MySQL ainda no implementou:
Centroid(poly)
O centide matemtico para o valor Polygon poly como um Point. O resultado no garantido estar neste Polygon.
PointOnSurface(poly)
Returna um valor Point que esta garantidamente no valor Polygon poly.
Area(mpoly)
Retorna como um nmero de preciso dupla a rea do valor MultiPolygon mpoly, como
medido no sistema de referncia espacial deste MultiPolygon.
A especificao OpenGIS tambm define as seguintes funes, que o MySQL ainda no implementou:
Centroid(mpoly)
O centride matemtico para este MultiPolygon como um Point. O resultado no garantido estar neste MultiPolygon.
PointOnSurface(mpoly)
Retorna um valor Point que garantido estar no valor MultiPolygon mpoly.
700
NumGeometries(gc)
Retorna o nmero de geometrias no valor GeometryCollection gc.
GeometryN(gc,n)
Retorna o n-sima geometria no valor GeometryCollection gc. O nmero de geometrias
comea em 1.
Nota: Funes para tipos de geometrias especficas retornam NULL se a geomtria passada do tipo
de geometria errado. Por exemplo Area() retorna NULL se o tipo do objeto no nem Polygon
nem MultiPolygon.
Envelope(g)
StartPoint(ls)
EndPoint(ls)
PointN(ls,n)
ExteriorRing(poly)
InteriorRingN(poly,n)
GeometryN(gc,n)
OpenGIS propem algumas outras funes que podem produzir geometrias. Elas esto designadas a
implementar Operadores Espaciais.
Estas funes ainda no esto implementadas no MySQL. Elas devem aparecer em distribuies futuras.
Intersection(g1,g2)
Retorna uma geometria que representa a insterseo do conjunto de pontos dos valores das geometrias g1 com g2.
Union(g1,g2)
Retorna uma geometria que representa a unio do conjunto de pontos dos valores das geometrias
g1 com g2.
Difference(g1,g2)
Retorna uma geometria que representa a diferena do conjunto de pontos dos valores das geometrias g1 com g2.
SymDifference(g1,g2)
Retorna uma geometria que representa a diferena simtrica do conjunto de pontos dos valores
das geometrias g1 com g2.
Buffer(g,d)
Retiorna uma geometria que representa todos os pontos cuja distncia do valor da geometria g
menor que ou igual a distncia de d.
ConvexHull(g)
Retorna uma geometria que representa a casca convexa de do valor da geometria g.
MBRContains(g1,g2)
Retorna 1 ou 0 para indicar se o Retngulo de Limite Mnimo de g1 contm o Retngulo de Limite Mnimo de g2.
mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
702
MBRWithin(g1,g2)
Retorna 1 ou 0 para indicar se o Retngulo de Limite Mnimo de g1 esta dentro do Retngulo de
Limite Mnimo de g2.
mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
mysql> SET @g2 = GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))');
mysql> SELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);
+--------------------+--------------------+
| MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |
+--------------------+--------------------+
|
1 |
0 |
+--------------------+--------------------+
MBRDisjoint(g1,g2)
Retorna 1 ou 0 para indicar se o Retngulo de Limite Mnimo de duas geometrias g1 e g2 no
fazem interseo.
MBREqual(g1,g2)
Retorna 1 ou 0 para indicar se o Retngulo de Limite Mnimo de duas geometrias g1 e g2 so o
mesmo.
MBRIntersects(g1,g2)
Retorna 1 ou 0 para indicar se o Retngulo de Limite Mnimo de duas geometrias g1 e g2 se interseptam.
MBROverlaps(g1,g2)
Retorna 1 ou 0 para indicar se o Retngulo de Limite Mnimo de duas geometrias g1 e g2 se sobrepe.
MBRTouches(g1,g2)
Retorna 1 ou 0 para indicar se o Retngulo de Limite Mnimo de duas geometrias g1 e g2 se tocam.
Contains(g1,g2)
Retorna 1 ou 0 para indicar se g1 contem completamente g2 ou no.
Crosses(g1,g2)
Retorna 1 se g1 cruza espacialmente g2. Retorna NULL se g1 um Polygon ou um MultiPolygon, ou se g2 um Point ou um MultiPoint. Seno 0 retornado.
O termo spatially crosses denota uma relao espacial entre duas geometrias que tm as seguintes propriedades:
A interseo resulta em uma geometria que tem uma dimenso que menor que a dimenso
mxima das duas geometrias dadas.
Disjoint(g1,g2)
Retorna 1 ou 0 para indicar se g1 espacialmente disjunta de g2 ou no.
Equals(g1,g2)
Retorna 1 ou 0 para indicar se g1 espacialmente igual a g2 ou no.
Intersects(g1,g2)
Retorna 1 ou 0 para indicar se g1 intersepta espacialmente g2 ou no.
Overlaps(g1,g2)
Retorna 1 ou 0 para indicar se g1 sobrepe espacialmente a g2 ou no. O termo sobrepor
espacialmente usado se duas geometrias fazem interseo e suas intersees resultam em
uma geometria da mesma dimenso mas difernete de ambas as geometrias dadas.
Touches(g1,g2)
Retorna 1 ou 0 para indicar se g1 spatially touches g2, ou no. Duas geometrias se tocam espacialmente se o interiro de ambas geometrias no se interseptam, mas o limite de uma delas intersepta o limite ou o interior das geometrias.
Within(g1,g2)
Retorna 1 ou 0 para indicar se g1 est espacialmente dentro da g2, ou no.
Distance(g1,g2)
Retorna como um nmero de preciso dupla, a menor distncia entre quaiquer dois pontos nas
duas geometrias.
704
Related(g1,g2,pattern_matrix)
Retorna 1 ou 0 indicando se o relacionamento espacial especificado por matriz_padro
existe entre g1 e g2 ou no. Retorna #1 se os argumentos so NULL. A matriz padro uma
string. Sua especificao ser indicada aqui quando esta funo estiver implementada.
Consulta de ponto que buscam por todos os objetos que contem um dado ponto.
Consulta de regio que buscam por todos os objetos que sobrepe uma dada regio.
O MySQL utiliza Arvores R com separao quadrtica para indexar colunas espaciais. Um ndice
espacial construdo usando o MBR de uma geometria. Para a maioria da geometrias, o MBR um
retngulo mnimo que cerca a geometria. Para uma linha (linestring) horizontal ou uma vertical, o
MBR um retngulo degenerado, nas linhas e nos pontos respectivamente.
705
Example: Suponha que uma tabela geom contm mais de 32000 geometrias, que esto armazenadas
na coluna g do tipo GEOMETRY. A tabela tambm tem um campo AUTO_INCREMENT fid, armazenando valores dos IDs de objetos.
mysql> SHOW FIELDS FROM geom;
+-------+----------+------+-----+---------+----------------+
| Field | Type
| Null | Key | Default | Extra
|
+-------+----------+------+-----+---------+----------------+
| fid
| int(11) |
| PRI | NULL
| auto_increment |
| g
| geometry |
|
|
|
|
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> SELECT COUNT(*) FROM geom;
+----------+
| count(*) |
+----------+
|
32376 |
+----------+
1 row in set (0.00 sec)
Para adicionar um ndice espacial na coluna g, use esta instruo:
mysql> ALTER TABLE geom ADD SPATIAL INDEX(g);
Query OK, 32376 rows affected (4.05 sec)
Records: 32376 Duplicates: 0 Warnings: 0
mysql> EXPLAIN SELECT fid,AsText(g) FROM geom IGNORE INDEX (g) WHERE
mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30
+----+-------------+-------+------+---------------+------+---------+------+----| id | select_type | table | type | possible_keys | key | key_len | ref | rows
+----+-------------+-------+------+---------------+------+---------+------+----| 1 | SIMPLE
| geom | ALL | NULL
| NULL |
NULL | NULL | 3237
+----+-------------+-------+------+---------------+------+---------+------+----1 row in set (0.00 sec)
Vamos executar a consulta acima, ignorando a chave espacial que temos:
Todos os objetos so ataulmente considerados como estando no mesmo sistema de coordenadas planas.
708
Quando vrias aplicaes clientes so escritas em diferentes linguagens ou funcionam em diferentes plataformas, mas precisam realizar as mesmas operaes de banco de dados.
Quando a segurana prioritria. Bancos, por exemplo, usam stored procedures para todas as
operaes comuns. Isto fornece um ambiente consistente e seguro, e procedures podem assegurar que cada operao seja registrada de forma apropriada. Neste tipo de condigurao, aplicaes e usurios no conseguiriam nenhuma acesso as tabelas do banco de dados diretamente,
mas apenas podem executar stored procedures especficas.
O MySQL segue a sintaxe SQL:2003 para stored procedures, que tambm usada pelo DB2 da
IBM. Suporte para compatibilidade de outras linguagens de stored procedures (PL/SQL, T-SQL) podem ser adicionadas posteriormente.
A implementao do MySQL de stored procedures ainda est em progresso. Todas as sintaxes descritas neste captulo so suportadas e qualquer limitao e extenso est documentada de forma
aprorpiada.
Stored procedures exigem a tabela proc na banco de dados mysql. Esta tabela criada durante a
instalao do MySQL 5.0. Se voc ataulizar para o MySQL 5.0 a partir de uma verso anterior, certifique de atualizar a sua tabela de permisso para ter certeza que a tabela proc existe. See Seco 2.5.6, Atualizando a Tabela de Permisses.
O MySQL suporta uma extenso muito til que permite o uso da instruo regular SELECT (isto ,
sem usar cursores ou variveis locais) dentro de uma stored procedure. O resultado de tal consulta
simplesmente enviado diretamente para o cliente. Vrias instrues SELECT geram vria resultados, assim o cliente deve usar um biblioteca cliente do MySQL que suporta vrios resultados. Isto
significa que o cliente deve usar uma biblioteca cliente a partir de uma verso do MySQL mais recente que 4.1, pelo menos.
A seo seguinte descreve a sintaxe usada para criar, alterar, remover e condultar stored procedures
e funes.
MySQL stores the SQL_MODE settings in effect at the time a routine is created, and will always execute routines with these settings in force.
A clusula COMMENT uma extenso do MySQL, e pode ser usada para descrever o stored procedure. Esta informao exibida pelas instrues SHOW CREATE PROCEDURE e SHOW CREATE
FUNCTION.
O MySQL permite rotinas contendo instrues DDL (como CREATE e DROP) e instrues de transao SQL (como COMMIT). Isto no exigido por padro e depende de especificaes de implementao.
NOTA: Atualmente, stored FUNCTIONs no podem conter referncias s tabelas. Note que isto inclui algumas instrues SET, mas exclui algumas instrues SELECT. Esta limitao ser retirada
assim que possvel.
A seguir temos um exemplo de uma stored procedure simples que usa um parmetro OUT. O exemplo usa o comando delimiter do cliente mysql para alterar o delimitador de instruo para antes da definio do procedure. Isto permite que o delimitador ';' usado no corpo de procedure seja
passado para o servidor em vez de ser interpretado pelo mysql.
mysql> delimiter |
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
->
SELECT COUNT(*) INTO param1 FROM t;
-> END
-> |
Query OK, 0 rows affected (0.00 sec)
mysql> CALL simpleproc(@a)|
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @a|
+------+
| @a
|
+------+
| 3
|
+------+
1 row in set (0.00 sec)
A seguir esta um exemplo de uma funo que utiliza um parametro, realiza uma operao usando
uma funo SQL e retorna o resultado:
mysql> delimiter |
mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
-> RETURN CONCAT('Hello, ',s,'!');
-> |
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT hello('world')|
+----------------+
| hello('world') |
+----------------+
| Hello, world! |
+----------------+
1 row in set (0.00 sec)
RE ou ALTER FUNCTION.
11.1.3. CALL
CALL sp_name([parameter[,...]])
O comando CALL usado para chamar uma rotina que foi definida anteriormente com CREATE
PROCEDURE.
A instruo DECLARE usada para definir vrios itens locais para uma rotina: variaveis locais (see
Seco 11.1.6, Variables in Stored Procedures), condies e handlers (see Seco 11.1.7,
Condies e Handlers) e cursors (see Seco 11.1.8, Cursors). As instrues SIGNAL e RESIGNAL ainda no so suportadas.
DECLARE s pode ser usada dentro de uma instruo composta BEGIN ... END e deve estar no
incio, antes de qualquer outra instruo.
SQLWARNING is shorthand for all SQLSTATE codes that begin with 01.
NOT FOUND is shorthand for all SQLSTATE codes that begin with 02.
EXCEPTION is shorthand for all SQLSTATE codes not caught by SQLWARNING or NOT FOUND.
MySQL would have taken the default (EXIT) path after the second INSERT failed due to the PRIMARY KEY constraint, and SELECT @x would have returned 2.
11.1.8. Cursors
Simple cursors are supported inside stored procedures and functions. The syntax is as in embedded
SQL. Cursors are currently asensitive, read-only, and non-scrolling. Asensitive means that the server
may or may not make a copy of its result table.
For example:
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE a CHAR(16);
DECLARE b,c INT;
OPEN cur1;
OPEN cur2;
REPEAT
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF NOT done THEN
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
CLOSE cur2;
END
11.1.9.1. IF Statement
IF search_condition THEN statement(s)
[ELSEIF search_condition THEN statement(s)]
...
[ELSE statement(s)]
END IF
IF implements a basic conditional construct. If the search_condition evaluates to true, the
corresponding SQL statement is executed. If no search_condition matches, the statement in
the ELSE clause is executed.
Please note that there is also an IF() function. See Seco 6.3.1.4, Funes de Fluxo de
Controle.
718
MYSQL
Esta estrutura representa um manpulador para uma conexo ao banco de dados. usada para
quase todas as funes MySQL.
MYSQL_RES
Esta estrutura representa o resultado de uma consulta que retorna linhas (SELECT, SHOW, DES719
MYSQL_ROW
Esta uma representao segura de tipo de uma linha de dados. Ela implementada atualmente
como um vetor de strings de tamanho fixo (Voc no pode trat-los como strings terminadas
com null se os valores do campo podem conter dados binrios, porque tais valores podem conter
um byte null internamente.). Linhas so obtidas pela chamada de mysql_fetch_row().
MYSQL_FIELD
Esta estrutura contm informao sobre um campo, tais como nome, tipo e tamanho do campo.
Seus membros so descritos em mais detalhes aqui. Voc pode obter a estrutura MYSQL_FIELD
para cada campo chamando mysql_fetch_field() repetidamente. Valores de campos no
so parte desta estrutura; eles esto contidos na estrutura MYSQL_ROW.
MYSQL_FIELD_OFFSET
Esta uma representao segura de um offset em uma lista de campos MySQL. (Usado por
mysql_field_seek().) Offsets so nmeros de campos em um registro, comeando com
zero.
my_ulonglong
O tipo usado pelo nmero de linhas e para mysql_affected_rows(),
mysql_num_rows(), e mysql_insert_id(). Este tipo fornece uma faixa de 0 a
1.84e19.
Em alguns sistemas, tentar imprimir um valor do tipo my_ulonglong no funcionar. Para
imprimir tais valores, converta-os para unsigned long e use o formato de impresso %lu.
Exemplo:
char * name
O nome do campo, como um string terminada com null.
char * table
O nome da tabela contendo este campo, se no for um campo calculado. Para campos calculador, o valor table uma string vazia.
char * def
O valor padro para este campo, como um string terminada em null. Ele atribuido apenas se
voc utilizar mysql_list_fields().
Descrio do tipo
FIELD_TYPE_TINY
campo TINYINT
720
FIELD_TYPE_SHORT
campo SMALLINT
FIELD_TYPE_LONG
campo INTEGER
FIELD_TYPE_INT24
campo MEDIUMINT
FIELD_TYPE_LONGLONG
campo BIGINT
FIELD_TYPE_DECIMAL
FIELD_TYPE_FLOAT
campo FLOAT
FIELD_TYPE_DOUBLE
FIELD_TYPE_TIMESTAMP
campo TIMESTAMP
FIELD_TYPE_DATE
campo DATE
FIELD_TYPE_TIME
campo TIME
FIELD_TYPE_DATETIME
campo DATETIME
FIELD_TYPE_YEAR
campo YEAR
FIELD_TYPE_STRING
campo CHAR
FIELD_TYPE_VAR_STRING
campo VARCHAR
FIELD_TYPE_BLOB
FIELD_TYPE_SET
campo SET
FIELD_TYPE_ENUM
campo ENUM
FIELD_TYPE_NULL
campo tipo-NULL
FIELD_TYPE_CHAR
Voc pode utilizar a macro IS_NUM() para testar se uma campo tem um tipo numrico. Passe o
valor tipo para IS_NUM() e ele ir avaliar como VERDADEIRO (TRUE) se o campo for numrico:
if (IS_NUM(campo->tipo))
printf("Campo numrico\n");
Descrio param
NOT_NULL_FLAG
PRI_KEY_FLAG
UNIQUE_KEY_FLAG
MULTIPLE_KEY_FLAG
UNSIGNED_FLAG
ZEROFILL_FLAG
BINARY_FLAG
AUTO_INCREMENT_FLAG
ENUM_FLAG
SET_FLAG
BLOB_FLAG
TIMESTAMP_FLAG
Uso dos parmetros BLOB_FLAG, ENUM_FLAG, SET_FLAG, e TIMESTAMP_FLAG foram obsoletos porque eles indicavam o tipo de um campo e no um atributo do tipo. prefervel testar
campo->tipo para FIELD_TYPE_BLOB, FIELD_TYPE_ENUM, FIELD_TYPE_SET, ou
FIELD_TYPE_TIMESTAMP.
O seguinte exemplo ilustra o uso tpico do valor param:
if (campo->param & NOT_NULL_FLAG)
printf("Campo no pode ser nulo\n");
Voc pode usar as seguintes macros para determinar o status dos valores param:
Status param
Descrio
IS_NOT_NULL(param
)
IS_PRI_KEY(param)
IS_BLOB(param)
Descrio
mysql_affected_rows()
Retorna o nmero de linhas alteradas/deletadas/insweridas pela ltima consulta \ UPDATE, DELETE, ou INSERT.
mysql_change_user()
mysql_connect()
mysql_create_db()
Cria um banco de dados. Esta funo est obsoleta; utiliza o comando SQL CREATE DATABASE.
mysql_data_seek()
Busca por uma nmero de linha arbitrrio em um conjunto de resultados de uma consulta.
mysql_debug()
mysql_drop_db()
Apaga um banco de dados; Esta funo esta obsoleta; utiliza o comando SQL DROP DATABASE.
mysql_dump_debug_info()
mysql_eof()
mysql_errno()
mysql_error()
mysql_escape_string()
mysql_fetch_field()
mysql_fetch_field_direct()
mysql_fetch_fields()
mysql_fetch_lengths()
mysql_fetch_row()
mysql_field_seek()
mysql_field_count()
mysql_field_tell()
mysql_free_result()
mysql_get_client_info()
mysql_get_client_version()
mysql_get_host_info()
mysql_get_server_version()
mysql_get_proto_info()
mysql_get_server_info()
mysql_info()
mysql_init()
mysql_insert_id()
mysql_kill()
mysql_list_dbs()
mysql_list_fields()
mysql_list_processes()
mysql_list_tables()
mysql_num_fields()
mysql_num_rows()
mysql_options()
mysql_ping()
mysql_query()
mysql_real_connect()
723
mysql_real_escape_string()
mysql_real_query()
mysql_reload()
mysql_row_seek()
mysql_row_tell()
mysql_select_db()
mysql_set_server_option()
mysql_sqlstate()
mysql_shutdown()
mysql_stat()
mysql_store_result()
mysql_thread_id()
mysql_thread_safe()
mysql_use_result()
mysql_warning_count()
mysql_commit()
mysql_rollback()
mysql_autocommit()
mysql_more_results()
mysql_next_result()
Para se conectar ao servidor, chame mysql_init() para iniciar um manipulador de conexo, ento chame mysql_real_connect() com este manipulador (com informaes de nome de mquina, usurios e senha). Conectado, mysql_real_connect() define o parmetro reconnect (parte da estrutura MYSQL) para um valor de 1. Este parmetro indica, no evento que uma
consulta no pode ser realizada por perda de conexo, para tentar reconectar ao servidor ao antes de
desistir. Quando no precisar mais da conexo, chame mysql_close() para termin-la.
Enquanto a conexo estiver ativa, o cliente pode enviar consultas SQL para o servidor usando
mysql_query() ou mysql_real_query(). A diferena entre os dois que
mysql_query() espera que a consulta seja especificada como uma string terminada em null, enquanto mysql_real_query() espera um string de tamanho fixa. Se a string conter dados binrios (a qual pode incluir bytes null), vocdeve usar mysql_real_query().
Para cada consulta no-SELECT (por exemplo, INSERT, UPDATE, DELETE), voc pode descobrir
quantas linhas foram alteradas (afetadas) chamando mysql_affected_rows().
Para consultas SELECT, voc retorna os registros selecionados como um resultado. (Note que algumas intrues so como a SELECT ao retornar registros. Elas incluem SHOW, DESCRIBE e EXPLAIN. elas devem ser tratadas da mesma maneira que instrues SELECT.)
Existem dois modos para um cliente processa o resultado. Um mode recuperar todo o resultado de
uma vez chamando mysql_store_result(). Esta funo busca no servidor todas as linhas retornadas pela consulta e as armazena no cliente. O segundo modo o cliente iniciar um retorno do
resultado registro por registro chamando mysql_use_result(). Esta funo inicia o retorno,
mas no busca realmente nenhuma linha do servidor.
Em ambos os casos, acesse registros chamando mysql_fetch_row(). Com
mysql_store_result(), mysql_fetch_row() acessa registros que j tenham sido busca724
if (result)
... error ...
if (result < 0)
... error ...
if (result == -1)
... error ...
/* correct */
/* incorrect */
/* incorrect */
Quando uma funo retornar um erro, a subsecao Erros de descrio de funes lista os possveis tipos de erro. Voc pode descobrir quais deles ocorreu chamando mysql_errno(). Uma representao string do erro pode ser obtida chamando mysql_error().
12.1.3.1. mysql_affected_rows()
my_ulonglong mysql_affected_rows(MYSQL *mysql)
Descrio
Retorna o nmero de registros alterados pelo ltimo UPDATE, deletados elo ltimo DELETE ou inseridos pelo ltimo INSERT. Pode ser chamado imediatamente aps mysql_query() para instrues UPDATE, DELETE, ou INSERT. Para instrues SELECT, mysql_affected_rows()
funciona como mysql_num_rows().
Valor Retornado
Um inteiro maior que zero indica o nmero de registros afetados ou recuperados. Zero indica que
nenhum registro foi atualizado por uma instruo UPDATE, nenhuma linha foi encontrada pela clusula WHERE na consulta ou a consulta ainda no foi executada. -1 indica que a consulta retornou um
erro ou que, para uma consulta SELECT, mysql_affected_rows() foi chamado antes da chamada mysql_store_result().
Erros
Nenhum.
Exemplo
mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10");
printf("%ld products updated",(long) mysql_affected_rows(&mysql));
Se se for especificado o parmetro CLIENT_FOUND_ROWS ao conectar no mysqld,
mysql_affected_rows() retornar o nmero de linhas encontardos pela clusula WHERE para
a instruo UPDATE.
Note que quando for utilizado um comando REPLACE, mysql_affected_rows() retornar 2
se o novo registro substituir um mais antigo. Isto porque neste caso um registro foi inserido e depois os registros duplicados foram deletados.
12.1.3.2. mysql_change_user()
my_bool mysql_change_user(MYSQL
char *password, const char *db)
*mysql,
const
char
*user,
const
Descrio
Altera o usurio faz com que o banco de dados especificado por db se torne o banco de dados padro (atual) na conexo especificada por mysql. Em consultas subsequentes este banco de dados
o padro para referncias a tabelas que no especificam o banco de dados explicitamente.
Esta funo foi introduzida na verso do MySQL.
mysql_change_user() falha a menos que o usurio conectado possa ser autenticado ou se ele
no tiver permisso para utilizar o banco de dodos. Neste caso o usurio e o banco de dados no so
726
alterados.
O parmetro db pode ser definido como NULL se voc no dseseja ter um banco de dados padro.
A partir da verso 4.0.6 do MySQL este comando sempre far ROLLBACK de qualquer transao
ativa, fecha todas as tabelas temporrias, destrava todas as tabelas bloqueadas e volta a um estado
como se tivesse feito uma inova conexo. Isto ir acontecer mesmo se o usurio no foi alterado.
Valor Retornado
Zero se obteve successo. Diferente de zero se ocorreu um erro.
Erros
O mesmo que pode ser obtido com mysql_real_connect().
CR_COMMANDS_OUT_OF_SYNC
Comandos forma executados em ordem inapropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL finalizou.
CR_SERVER_LOST
A conexo ao servidor foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
ER_UNKNOWN_COM_ERROR
O servidor MySQL no possui este comando (provavelmente um verso mais antiga)
ER_ACCESS_DENIED_ERROR
O usurio ou a senha estavam errados.
ER_BAD_DB_ERROR
O banco de dados no existe.
ER_DBACCESS_DENIED_ERROR
O usurio no tem direitos de acessoa este banco de dados.
ER_WRONG_DB_NAME
O nome de banco de dados muito grande.
Exemplo
if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
fprintf(stderr, "Failed to change user. Error: %s\n",
mysql_error(&mysql));
}
12.1.3.3. mysql_character_set_name()
const char *mysql_character_set_name(MYSQL *mysql)
727
Descrio
Retorna o conjunto de caracteres padro para a conexo atual.
Valor Retornado
O conjunto de carcteres padro
Erros
Nenhum.
12.1.3.4. mysql_close()
void mysql_close(MYSQL *mysql)
Descrio
feca uma conexo aberta anteriormente. mysql_close() tambm desaloca o ponteiro do manipulador da conexo para o mysql se ele tiver sido alocado automaticamente por mysql_init()
ou mysql_connect().
Valor Retornado
Nenhum.
Erros
Nenhum.
12.1.3.5. mysql_connect()
MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char
*user, const char *passwd)
Descrio
A funo est obsoleta. melhor utilizar mysql_real_connect().
mysql_connect() tenta estabelecer uma conexo a um banco de dados MySQL executando em
host. mysql_connect() deve completar com suceso antes que voc podssa executar qualquer
uma das funo da API, com a exceo de mysql_get_client_info().
O significado dos parmetros so os mesmos que os parmetros correspondentes para
mysql_real_connect() com a diferena que o parmetro de conexo pode ser NULL. Neste
caso a API C aloca memria para a estrutura de conexo automaticamente e a libera quando voc
chamar mysql_close(). A disvantagem desta abordagem que voc no pode retornar uma
mensagem de erro se a conexo falhar. (Para obter informaes de erro de mysql_errno() ou
mysql_error(), voc deve fornecer um ponteiro MYSQL vlido.)
Valor Retornado
O mesmo de mysql_real_connect().
Erros
O mesmo de mysql_real_connect().
12.1.3.6. mysql_create_db()
int mysql_create_db(MYSQL *mysql, const char *db)
Descrio
728
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
Exemplo
if(mysql_create_db(&mysql, "my_database"))
{
fprintf(stderr, "Failed to create new database.
mysql_error(&mysql));
}
Error: %s\n",
12.1.3.7. mysql_data_seek()
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset)
Descrio
Busca um registro arbitrrio em um resultado de uma consulta. O valor do offset um nmero de linha e deve estar em uma faixa de 0 at mysql_num_rows(stmt)-1.
Esta funo exige que a estrutura do resultado contenha todo o resultado da consulta, assim
mysql_data_seek() s pode ser usado em conjunto com mysql_store_result(), no
com mysql_use_result().
Valor Retornado
Nenhum.
Erros
Nenhum.
12.1.3.8. mysql_debug()
void mysql_debug(const char *debug)
Descrio
729
Faz um DBUG_PUSH com a string dada. mysql_debug() usa a biblioteca de depurao Fred
Fish. Para utilizar esta funo voc deve compilar a biblioteca cliente para suportar depurao. See
Seco E.1, Depurando um Servidor MySQL. See Seco E.2, Depurando um cliente MySQL..
Valor Retornado
Nenhum.
Erros
Nenhum.
Exemplo
A chamada mostrada aqui faz com que a biblioteca cliente gere um arquivo de rastreamento /
tmp/client.trace na mquina cliente:
mysql_debug("d:t:O,/tmp/client.trace");
12.1.3.9. mysql_drop_db()
int mysql_drop_db(MYSQL *mysql, const char *db)
Descrio
Apaga o banco de dados nomeado pelo parmetro db.
Esta funo est obsoleta. melhor utilizar mysql_query() para realizar uma instruo SQL
DROP DATABASE.
Valor Retornado
Zero se o banco de dados foi apagdo com sucesso. Diferente de zero ocorreu um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
Exemplo
if(mysql_drop_db(&mysql, "my_database"))
fprintf(stderr, "Failed to drop the database: Error: %s\n",
mysql_error(&mysql));
12.1.3.10. mysql_dump_debug_info()
730
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.11. mysql_eof()
my_bool mysql_eof(MYSQL_RES *result)
Descrio
Esta funo est obsoleta. mysql_errno() ou mysql_error() podem ser usados em seu lugar.
mysql_eof() determina se o ltimo registro de um resultado foi lido.
Se voc buscar um resultado com um chamada mysql_store_result() bem sucedida, o cliente recebe todo o resultado em uma operao. Neste caso, um valor NULL retornado de
mysql_fetch_row() sempre significa que o fim do resultado foi atingido e no necessrio
chamar mysql_eof(). Quando usado com mysql_store_result(), mysql_eof() sempre retornar verdadeiro.
Por outro lado, se voc utilizar mysql_use_result() para iniciar um resultado recuperado, as
linhas do conjunto so obtido do servidor uma a uma, chamando mysql_fetch_row() repetidamente. Como pode ocorrer um erro na conexo durante este processo, um valor NULL retornado de
mysql_fetch_row() no significa, necessriaemente, que o fim do resultado fo atingido normalmente. Neste caso, voc pode utilizar mysql_eof() para determinar o que aconteceu.
mysql_eof() retorna um valor diferente de zero se o fim do resultaod foi atingido e zero se ocorreu um erro.
Historicamente, mysql_eof() preterido pelas funes de erro padro do MySQL
mysql_errno() e mysql_error(). Como estas funes de erro fornecem a mesma informao, o uso das duas ltimas preferido sobre mysql_eof(), a qual est obsoleta. (De fato, elas
fornecem mais informaes, porque mysql_eof() retorna apenas um valor booleano enquanto as
funes de erro indicam uma razo para a ocorrncia do erro quando ele ocorre).
Valor Retornado
731
Zero se nenhum erro ocorreu. Diferente de zero o fim do resultado foi atingido.
Erros
Nenhum.
Exemplo
Os exemplos seguintes mostram como voc deve usar mysql_eof():
mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
// faz algo com os dados
}
if(!mysql_eof(result)) // mysql_fetch_row() falha devido a um erro
{
fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
No entanto, voc pode conseguir o mesmo efeito com as funes de erro padres do MySQL:
mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
// faz algo com os dados
}
if(mysql_errno(&mysql)) // mysql_fetch_row() falha devido a um erro
{
fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
12.1.3.12. mysql_errno()
unsigned int mysql_errno(MYSQL *mysql)
Descrio
Para a conexo especificada pelo mysql, mysql_errno() retorna o cdigo de erro para a funo
API chamada mais recentemente que tenha obtido sucesso ou falhado. Um valor de retorno de zero
significa que um erro ocorreu. Nmeros de mensagens de erro de clientes so listados no arquivo de
cabealho errmsg.h do MySQL. Nmeros de mensagem de erros do servidor so listados no arquivo mysqld_error.h. Na distribuio fonte do MySQL voc pode encontrar uma lista completa de neros de mensagens de erro no arquivo Docs/mysqld_error.txt. Os cdigos de erros do servidor esto listados em Seco 13.1, Erros Retornados.
Note que algumas funes como mysql_fetch_row() no configuram o mysql_errno() se
elas obterem sucesso.
Uma regra do dedo que todas as funes que precisam perguntar ao servidor por informao iro
zerar mysql_errno() se obterem sucesso.
Valor Retornado
Um valor de cdigo de erro para a ltima chamada mysql_xxx, se ele falhar, Zero significa que nenhum erro ocorreu.
Erros
Nenhum.
732
12.1.3.13. mysql_error()
const char *mysql_error(MYSQL *mysql)
Descrio
Para a conexo especificada por mysql, mysql_error() retorna um string terminada em null
contendo a mensagem de erro para a funo de API chamda mais recentemente que tenha falhado.
Se a funo no falhou, o valor de retorno de mysql_error() pode ser o erro anterior ou uma
string vazia para indicar que no ocorreu erro.
Uma regra do dedo que todas as funes que precisam pedir informao ao servidor iro zerar
mysql_error() se obterem sucesso.
Para todas as funes que zeram mysql_errno, os seguintes dois testes so equivalentes:
if(mysql_errno(&mysql))
{
// ocorreu um erro
}
if(mysql_error(&mysql)[0] != '\0')
{
// ocorreu um erro
}
A lngua da mensagem de erro do cliente pode ser alterada recompilando a biblioteca do cliente
MySQL. Atualmente voc pode escolher mensagens de erro em vrias lnguas diferentes. See Seco 4.7.2, Mensagens de Erros em Outras Lnguas.
Valor Retornado
Uma string terminada em null que descreve um erro. Uma string vazia se nenhum erro ocorrer.
Erros
Nenhum.
12.1.3.14. mysql_escape_string()
Voc deve usar mysql_real_escape_string() em seu lugar!
Esta
funo
identica
a
mysql_real_escape_string()
exceto
que
mysql_real_escape_string() pega um manipulador de cnexo como seu primeiro argumento e escapa a string de acordo com a conjunto de caracteres padro.
mysql_escape_string() no utiliza um argumento de conexo e no respeita o conjunto de
caracteres atual.
12.1.3.15. mysql_fetch_field()
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
Descrio
Retorna a definio de uma coluna de um resultado como uma estrutura MYSQL_FIELD. Chame
esta funo repetidamente para retornar informaes sobre todas as colunas no resultado.
mysql_fetch_field() retorna NULL quando no existirem mais campos.
mysql_fetch_field() definido para retornar a informao do primeiro campo cada vez que
voc executar uma nova consulta SELECT. O campo retornado por mysql_fetch_field()
tambm afetado pela chamadas mysql_field_seek().
Se vov tiver chamado mysql_query() para realizar um SELECT em uma tabela mas no tiver
733
12.1.3.16. mysql_fetch_fields()
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
Descrio
Retorna um vetor de todas as estruturas MYSQL_FIELD no resultado. Cada estrutura fornece a definio do campo para uma coluna do resultado.
Valor Retornado
Um vetor da estrutura MYSQL_FIELD para todas as colunas no resultado.
Erros
Nenhum.
Exemplo
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields;
num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
printf("Field %u is %s\n", i, fields[i].name);
}
12.1.3.17. mysql_fetch_field_direct()
MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES
int fieldnr)
*result,
unsigned
Descrio
Dado um nmero de campo fieldnr para uma colua em resultado, retorna a informao de campo
daquela coluna como uma estrutura MYSQL_FIELD Voc pode utilizar esta funo para retornar a
definio para uma coluna arbitrria. O valor de fieldnr deve estar na faixa de 0 a
mysql_num_fields(result)-1.
734
Valor Retornado
A estrutura MYSQL_FIELD para uma coluna especfica.
Erros
Nenhum.
Exemplo
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *field;
num_fields = mysql_num_fields(result);
for(i = 0; i < num_fields; i++)
{
field = mysql_fetch_field_direct(result, i);
printf("Field %u is %s\n", i, field->name);
}
12.1.3.18. mysql_fetch_lengths()
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)
Descrio
Retorna o tamanho da coluna do registro atual em um resultado. Se voc planeja copiar calores dos
compos, esta informao de tamanho til tambm para a otimizao, porque voc pode evitar a
chamada strlen(). Se o resultado contm dados birios, voc deveutilizar esta funo para determinar o tamanho dos dados, pois strlen() retorna um valor incorreto para quaquer campo contendo caracteres nulos.
O tamanho para colunas vazias e para colunas contendo valores NULL zero. Para ver como distnguir este dois casos, veja a descrio de mysql_fetch_row().
Valor Retornado
Um vetor de unsigned long integers (inteiros longos sem sinal) representando o tamanho de cada coluna (no incluindo nenhuma caracter nulo). NULL se ocorrer um erro.
Erros
mysql_fetch_lengths() s vlido para o registro atual no resultado. Ele retorna NULL se
voc cham-lo antes de mysql_fetch_row() ou depois de retornar todos os registros em um resultado.
Exemplo
MYSQL_ROW row;
unsigned long *lengths;
unsigned int num_fields;
unsigned int i;
row = mysql_fetch_row(result);
if (row)
{
num_fields = mysql_num_fields(result);
lengths = mysql_fetch_lengths(result);
for(i = 0; i < num_fields; i++)
{
printf("Column %u is %lu bytes in length.\n", i, lengths[i]);
}
}
735
12.1.3.19. mysql_fetch_row()
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
Descrio
Recuera o prximo registro do resultado. Quando usado depois de mysql_store_result(),
mysql_fetch_row() retorna NULL quando no houver mais registros para retornar. Quando
usado depois de mysql_use_result(), mysql_fetch_row() retorna NULL quando no
houver mais registros para retornar ou ocorrer um erro.
O nmero de valores no registro dado por mysql_num_fields(result). Se row guarda o
valor retornado de uma chamada mysql_fetch_row(), apontadores para os valores so acessados como row[0] a row[mysql_num_fields(result)-1]. Valores NULL no registro so
indicados por apontadores NULL.
Os tamanhos dos valores do campo no registro poden ser obtidos chamando
mysql_fetch_lengths(). Campos vazios e campos contendo NULL tem tamanho 0; voc pode distingui-los verificando o apontador para o valor do campo. Se o apontador NULL, o campo
NULL; seno o campo est vazio.
Valor Retornado
Uma estrutura MYSQL_ROW para o prximo registro. NULL se no houver mais linhas para retornar
ou ocorrer um erro.
Erros
Note que o erro no zerado entre as chamadas a mysql_fetch_row()
CR_SERVER_LOST
A conexo com o servidor foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
Exemplo
MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;
num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
unsigned long *lengths;
lengths = mysql_fetch_lengths(result);
for(i = 0; i < num_fields; i++)
{
printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
}
printf("\n");
}
12.1.3.20. mysql_field_count()
unsigned int mysql_field_count(MYSQL *mysql)
Se voc estiver utilizando uma verso anterior a verso 3.22.24 do MySQL, voc deve utilizar unsigned int mysql_num_fields(MYSQL *mysql).
736
Descrio
Retorna o nmero de colunas para a consulta mais recente na conexo.
Normalmente esta funo utilizada quando mysql_store_result() retorna NULL (ento voc no possui um apontador para o resultado). Neste caso, voc pode chamar
mysql_field_count() para determinar se mysql_store_result() no produziu um resultado vazio. Isto permite que o programa cliente tome a ao aprpriada sem saber se a consulta foi
uma instruo SELECT (ou do mesmo tipo). O exemplo mostrado aqui ilustra como isto pode ser
feito.
See Seco 12.1.12.1, Porque Algumas Vezes mysql_store_result() Retorna NULL Aps
mysql_query() Returnar com Sucesso?.
Valor Retornado
Um unsigned integer (inteiro sem sinal) representando o nmero de campo em um resultado.
Erros
Nenhum.
Exemplo
MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;
if (mysql_query(&mysql,query_string))
{
// error
}
else // query succeeded, process any data returned by it
{
result = mysql_store_result(&mysql);
if (result) // there are rows
{
num_fields = mysql_num_fields(result);
// retrieve rows, then call mysql_free_result(result)
}
else // mysql_store_result() returned nothing; should it have?
{
if(mysql_field_count(&mysql) == 0)
{
// query does not return data
// (it was not a SELECT)
num_rows = mysql_affected_rows(&mysql);
}
else // mysql_store_result() should have returned data
{
fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
}
}
Uma alternativa substituir a chamada mysql_field_count(&mysql) com
mysql_errno(&mysql). Neste caso, voc est verificando diretamente um erro de
mysql_store_result() em vez de conferir o valor de mysql_field_count() se a instruo foi uma SELECT.
12.1.3.21. mysql_field_seek()
MYSQL_FIELD_OFFSET
mysql_field_seek(MYSQL_RES
MYSQL_FIELD_OFFSET offset)
Descrio
737
*result,
Define o cursor campo com o offset dado. A prxima chamada para mysql_fetch_field() ir
recuperar a definio de campo da coluna associada com o offset.
Para buscar o inicio de um registro, passe zero como valor do offset.
Valor Retornado
O valor anterior do cursor de campo.
Erros
Nenhum.
12.1.3.22. mysql_field_tell()
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)
Descrio
Retorna a posio do cursos do campo usado pelo ltimo mysql_fetch_field(). Este valor
pode ser usado como um argumento para mysql_field_seek().
Valor Retornado
O offset atual do cursor de campo.
Erros
Nenhum.
12.1.3.23. mysql_free_result()
void mysql_free_result(MYSQL_RES *result)
Descrio
Libera a memria alocada para o resultado por mysql_store_result(),
mysql_use_result(), mysql_list_dbs(), etc. Quando voc finalizar o uso do resultado,
voc deve liberar a memria utilizada chamando mysql_free_result().
Valor Retornado
Nenhum.
Erros
Nenhum.
12.1.3.24. mysql_get_client_info()
char *mysql_get_client_info(void)
Descrio
Retorna uam string que representa a verso da biblioteca cliente.
Valor Retornado
Uma string representando a verso da biblioteca cliente do MySQL.
Erros
Nenhum.
738
12.1.3.25. mysql_get_client_version()
unsigned long mysql_get_client_version(void)
Descrio
Retorna um inteiro que representa a verso da biblioteca cliente. O valor tem o formato XYYZZ onde X a verso principal, YY o nivel da distribuico e ZZ o nmero da verso dentro do nvel da
distribuio. Por exemplo, um valor de 40102 representa uma biblioteca cliente na verso 4.1.2.
Valores de Retorno
Um inteiro que representa a verso da biblioteca clientes do mysql.
Erros
Nenhum.
12.1.3.26. mysql_get_host_info()
char *mysql_get_host_info(MYSQL *mysql)
Descrio
Retorna uma string descrevendo o tipo da conexo em uso, incluindo o nome da maquina servidora.
Valor Retornado
Uma string respresntando o nome da mquina servidora e o tipo de conexo.
Erros
Nenhum.
12.1.3.27. mysql_get_proto_info()
unsigned int mysql_get_proto_info(MYSQL *mysql)
Descrio
Retorna a verso do protocolo usado pela conexo atual.
Valor Retornado
Um unsigned integer (inteiro sem sinal) representando a verso do protocolo usado pela conexo
atual.
Erros
Nenhum.
12.1.3.28. mysql_get_server_info()
char *mysql_get_server_info(MYSQL *mysql)
Descrio
Retorna um string que representa o nmero da verso do servidor.
Valor Retornado
Um string representando o nmero da verso do servidor.
739
Erros
Nenhum.
12.1.3.29. mysql_get_server_version()
unsigned long mysql_get_server_version(MYSQL *mysql)
Descrio
Retorna o nmero de verso do servidor como um inteiro (novo na verso 4.1)
Valor Retornado
Um nmero que representa a verso do servidor MySQL no formato:
verso_principal*10000 + verso_menor*100 + sub_verso
Por exemplo, 4.1.0 retornado como 40100.
Ela til para determinar a verso do servidor rapidamente em um programa cliente para saber se
algumas capacidades existem.
Erros
Nenhum.
12.1.3.30. mysql_info()
char *mysql_info(MYSQL *mysql)
Descrio
Retorna um string fornecendo informao sobre a consulta executada mais recentemente, mas apenas para as instrues listadas aqui. Para outras inastrues, mysql_info() retorna NULL. O formato da string varia dependendo do tipo de consulta, como descrito aqui. Os nmeros so apenas
ilustrativos; a string ir conter valores apropriados para a consulta.
ALTER TABLE
Formato da string: Records: 3 Duplicates: 0 Warnings: 0
UPDATE
Formato da string: Rows matched: 40 Changed: 40 Warnings: 0
Note que mysql_info() retorna um valor no-NULL para INSERT ... VALUES somente na
forma de mltiplas linhas da instruo (isto , apenas se uma lista com vrios valores especificada).
740
Valor Retornado
Uma string represntando informao adicional sobre a consulta executada mais recentemente. NULL
se no houver nenhuma informao disponvel para a consulta.
Erros
Nenhum.
12.1.3.31. mysql_init()
MYSQL *mysql_init(MYSQL *mysql)
Descrio
Aloca ou inicializa um objeto MYSQL apropriado para mysql_real_connect(). Se mysql
um ponteiro NULL, a funo aloca, inicializa e retorna um novo objeto. Seno o objeto inicializado
e o endereo do objeto retornado. Se mysql_init() aloca um novo objeto, ele ser liberado
quando mysql_close() for chamado para fechar a conexo.
Valor Retornado
Um handle MYSQL* inicializado. NULL se no houver memria suficiente para alocar o novo objeto.
Erros
Em caso de memria insuficiente, NULL retornado.
12.1.3.32. mysql_insert_id()
my_ulonglong mysql_insert_id(MYSQL *mysql)
Descrio
Retorna o ID gerado para uma coluna AUTO_INCREMENT pela consulta anterior. Use esta funo
depois de ter realizado um consulta INSERT em uma tabela que contenha um campo AUTO_INCREMENT.
Note que mysql_insert_id() retorna 0 se a consulta anterior no gerar um valor AUTO_INCREMENT. Se voc desejar salvar o valor para uso posterior, chame
mysql_insert_id() imediatamente depois da consulta que gerou o valor.
Se a consulta anterior retornar um erro, o valor de mysql_insert_id() indefinido.
mysql_insert_id() atualizado depois de instrues INSERT e UPDATE que geram um valor
AUTO_INCREMENT ou que definem um valor de coluna com LAST_INSERT_ID(expr). See
Seco 6.3.6.2, Funes Diversas.
Note tambm que o valor da funo SQL LAST_INSERT_ID() sempre contm o o valor AUTO_INCREMENT gerado mais recentemente e no zerado entre as consultas porque o valor desta
funo mantido no servidor.
Valor Retornado
O valor do campo AUTO_INCREMENT que foi atualizado pela consulta anterior. Retorna zero se
no houve consultas anteriores na conexo ou se a consulta no atualizou o valor AUTO_INCREMENT.
Erros
Nenhum.
741
12.1.3.33. mysql_kill()
int mysql_kill(MYSQL *mysql, unsigned long pid)
Descrio
Diz para o servidor matar um thread especificada pelo pid.
Valor Retornado
Zero em caso de sucesso. Diferente de zero se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.34. mysql_list_dbs()
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)
Descrio
Retorna um resultado com nome de banco de dados no servidor que correspondem a uma expresso
regular especificada pelo parmetro wild. wild pode conter o meta caracteres '%' ou '_', ou pode
ser um ponteiro NULL para coreesponder a todos os banco de dados. Chamar
mysql_list_dbs() o mesmo que executar a consulta SHOW databases [LIKE wild].
Voc deve liberar o resultado com mysql_free_result().
Valor Retornado
Um conjunto de resultados MYSQL_RES no caso de sucesso. NULL se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
742
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.35. mysql_list_fields()
MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const
char *wild)
Descrio
Retorna um resultado contendo nomes de campos de uma tabela dada que correspondam a expresso
regular especificada pelo parmetro wild. wild pode conter os metacaracteres '%' ou '_', ou pode
ser um ponteiro NULL para corresponder a todos os campos. Chamar mysql_list_fields()
o mesmo que executar a consulta SHOW COLUMNS FROM nome_tabela [LIKE wild].
Note que recomendado que voc use SHOW COLUMNS FROM nome_tabela em vez de
mysql_list_fields().
Voc deve liberar o resultado com mysql_free_result().
Valor Retornado
Um conjunto de resultados MYSQL_RES em caso de sucesso. NULL se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.36. mysql_list_processes()
MYSQL_RES *mysql_list_processes(MYSQL *mysql)
Descrio
Retorna um resultado descrevendo a thread atual do servidor. o mesmo tipo de informao relatado por mysqladmin processlist ou uma consulta SHOW PROCESSLIST.
Voc deve liberar o resultado com mysql_free_result().
Valor Retornado
Um conjunto de resultados MYSQL_RES em caso de sucesso. NULL se ocorrer um erro.
Erros
743
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.37. mysql_list_tables()
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)
Descrio
Retorna um resultado contendo nomes de tabelas no banco de dados atual que correspondam a expresso regular especificada pelo parmetro wild. wild pode conter os mets caracteres '%' or '_',
ou pode ser uma ponteiro NULL para corresponde a todas as tabelas. Chamar
mysql_list_tables() o mesmo que executar a consulta SHOW tables [LIKE wild].
Voc deve liberar o resultado com mysql_free_result().
Valor Retornado
Um conjunto de resultados MYSQL_RES em caso de sucesso. NULL se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.38. mysql_num_fields()
unsigned int mysql_num_fields(MYSQL_RES *result)
ou
unsigned int mysql_num_fields(MYSQL *mysql)
A segunda forma no funciona na verso 3.22.24 ou mais novas do MySQL. Para passar um argumento MYSQL* voc de utilizar unsigned int mysql_field_count(MYSQL *mysql)
744
em seu lugar.
Descrio
Retorna o nmero de colunas em um resultado.
Note que voc pode obter o nmero de colunas com um ponteiro para o conjunto de resultados ou
para um manipulador (handle) de conexo. Voc usaria o manipular de conexo se
mysql_store_result() ou mysql_use_result() retorna NULL (ento voc no tem um
ponteiro para o resultado). Neste caso, voc pode chamar mysql_field_count() para determinar se mysql_store_result() no produziu um resultado vazio. Isto permite que o programa
cliente tome a ao apropriada sem saber se a consulta foi uma instruo SELECT (ou do tipo SELECT). O exemplo mostrado abaixo ilustra como isto pode ser feito.
See Seco 12.1.12.1, Porque Algumas Vezes mysql_store_result() Retorna NULL Aps
mysql_query() Returnar com Sucesso?.
Valor Retornado
Um unsigned integer (inteiro sem sinal) representando o nmero de campos no conjunto de resultasdos.
Erros
Nenhum.
Exemplo
MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;
if (mysql_query(&mysql,query_string))
{
// erro
}
else // query succeeded, process any data returned by it
{
result = mysql_store_result(&mysql);
if (result) // existem resgitros
{
num_fields = mysql_num_fields(result);
// retorna registros e chama mysql_free_result(result)
}
else // mysql_store_result() retorna vazio; era esperado?
{
if (mysql_errno(&mysql))
{
fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
else if (mysql_field_count(&mysql) == 0)
{
// consulta no retora dados
// (ela no era um SELECT)
num_rows = mysql_affected_rows(&mysql);
}
}
}
Uma alternativa (se voc souber qyue a sua consulta retornou um resultado) substituir a chamada
mysql_errno(&mysql) pela verificao de se mysql_field_count(&mysql) = 0. Isto
s acontece se alguma coisa der errado.
12.1.3.39. mysql_num_rows()
my_ulonglong mysql_num_rows(MYSQL_RES *result)
745
Descrio
Retorna o nmero de linhas em um resultado.
O uso de mysql_num_rows() depende de se voc utiliza mysql_store_result() ou
mysql_use_result() para retornar o resultado. Se voc usa mysql_store_result(),
mysql_num_rows() pode ser chamado imediatamente. Se voc usa mysql_use_result(),
mysql_num_rows() no retornar o valor correto at que todas as linhas no resultado tenham sido recuperadas.
Valor Retornado
O nmero de linhas no resultado.
Erros
Nenhum.
12.1.3.40. mysql_options()
int mysql_options(MYSQL
char *arg)
*mysql,
enum
mysql_option
option,
const
Descrio
Pode ser usado para definir opes extras de conexo e afetar o comportamento de uma conexo.
Esta funo pode ser chamada vrias vezes para definir diversas opes.
mysql_options() deve ser chamado depois
mysql_connect() ou mysql_real_connect().
de
mysql_init()
antes
de
O argumento option a opo que voc que definir; o argumento arg o valor para a opo. Se
a opo um inteiro, ento arg deve apontar para o valor do inteiro.
Valores possveis para as opes:
Opo
Tipo de
mento
MYSQL_OPT_CONNECT_TIMEOUT
unsigned
*
MYSQL_OPT_COMPRESS
No usado
MYSQL_OPT_READ_TIMEOUT
unsigned
*
MYSQL_OPT_WRITE_TIMEOUT
unsigned
*
MYSQL_OPT_LOCAL_INFILE
MYSQL_OPT_NAMED_PIPE
No usado
MYSQL_INIT_COMMAND
char *
MYSQL_READ_DEFAULT_FILE
char *
746
argu- Funo
int Tempo limite de conexo em segundos.
Usa o protocolo cliente/servidor
compactado.
char *
MYSQL_OPT_PROTOCOL
unsigned
*
MYSQL_SHARED_MEMORY_BASE_NA char*
ME
Descrio
connect-timeout
compress
database
Conecta a este banco de dados se nenhum banco de dados for especificado no comando de conexo.
debug
Opes de depurao.
disable-local-infile
host
init-command
Comando para executar ao conectar ao servidor MySQL. Ser executado automaticamente ao reconectar.
max_allowed_packet
password
Senha padro.
pipe
protocol=(TCP
| Qual protocolo usar ao conectar no servidor (Novo na verso 4.1)
SOCKET | PIPE | MEMORY)
port
return-found-rows
user
Usurio padro.
747
Note que timeout foi substituido por connect-timeout, mas timeout ainda funcionar por
enquanto.
Para maiores informaes sobre arquivos de opes, veja Seco 4.1.2, Arquivo de Opes
my.cnf.
Valor Retornado
Zero em caso de sucesso. Diferente de zero se voc utilizar uma opo desconhecida.
Exemplo
MYSQL mysql;
mysql_init(&mysql);
mysql_options(&mysql,MYSQL_OPT_COMPRESS,0);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
fprintf(stderr, "Failed to connect to database: Error: %s\n",
mysql_error(&mysql));
}
O exemplo acima diz ao cliente para usar o protocolo cliente/servidor compactado e ler a opo adicional da seo odbc no arquivo de opes my.cnf.
12.1.3.41. mysql_ping()
int mysql_ping(MYSQL *mysql)
Descrio
Verifica se a conexo ao servidor est funcionando. Se ela tiver cado feita uma tentativa de conexo automaticamente.
Esta funo pode ser usada pelos clientes que se ficam inativo por um longo tempo para verificar se
o servidor fechou a conexo e reconectar se necessrio.
Valor Retornado
Zero se o servidor estiver funcionando. Diferente de zero se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.42. mysql_query()
int mysql_query(MYSQL *mysql, const char *query)
Descrio
748
Executa uma consulta SQL apontada pela string terminada em null query. A consulta deve deve
consistir de uma nica instruo SQL. Voc no deve adicionar ponto e vrgula (';') ou \g ao fim
da instruo.
mysql_query() no pode ser usadas por consultas que contenham dados binrios; voc deve utilizar mysql_real_query() em seu lugar. (Dados binrios podem conter o caracter '\0', que
mysql_query() interpreta como o fim a string de consulta.)
Se voc quiser saber se a consulta deve retornar um resultado ou no, voc pode utilizar
mysql_field_count()
para
verificar
isto.
See
Seco
12.1.3.20,
mysql_field_count().
Valor Retornado
Zero se a consulta obteve sucesso. Diferente de zero se ocorreu um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.43. mysql_real_connect()
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const
char *user, const char *passwd, const char *db, unsigned int port,
const char *unix_socket, unsigned long client_flag)
Descrio
mysql_real_connect() tenta estabelecer uma conexo mecanismo MySQL de banco de dados executando em host. mysql_real_connect() deve completar com suceeso antes que voc possa executar qualquer um das outars funoes da API, com a excesso de
mysql_get_client_info().
Os parmetros so especificados da seguinte forma:
O primeiro parmetro deve ser o endereo de uma estrutura MYSQL existente. Antes de chamar
mysql_real_connect() voc deve chamar mysql_init() para inicializar a estrutura
MYSQL. Voc pode alterar vria opes de conexo com a chamada mysql_options(). See
Seco 12.1.3.40, mysql_options().
O valor de host pode ser tanto um nome de mquivo quanto um endereo IP. Se host NULL
ou a string "localhost", a conexo feita na mquina local. Se o SO suporta sockets (Unix)
ou named pipes (Windows), eles so utilizados em vez de TCP/IP para a conexo ao servidor.
O parmetro user contm a indetificao do usurio MySQL. Se user NULL ou a string vazia "", considera-se o usurio padro. Sob Unix, ele o login atual. Sob ODBC no Windows, o
usurio atual deve ser especificado explicitamente. See Seco 12.2.2, Como Preencher os V749
O parmetro passwd contm a senha para user. Se passwd NULL, somente entradas na tabela user para usurios que tenham campo de senha em branco (vazia) sero verificados ipor
um padro coincidenete. Isto permite que o admistrador do banco de dados configure o sistema
de privilgios do MySQL de tal maneira que usurios os usurios conseguiro privileios diferentes, dependendo se ele espcificou ou no uma senha.
Nota: No tente criptografar a senha antes de chamar mysql_real_connect(); senhas criptografadas so tratadas automaticamente pela API cliente.
Se port no 0, o valor ser usado como o nmero da porta para as conexes TCP/IP. Note
que o parmetro host determina o tipo da conexo.
Se unix_socket no NULL, a string especifica o socket ou named pipe que deve ser usado.
Note que o parmetro host determina o tipo de conexo.
O valor de client_flag normalmente 0, mas pode ser definido como uma combinao dos
parmetro seguintes em circunstncias especiais:
Nome do parmetro
Descrio do parmetro
CLIENT_COMPRESS
CLIENT_FOUND_ROWS
CLIENT_IGNORE_SPACE
Permite espao depois do nome de funes. torna todos os nomes de funes palavras reservadas.
CLIENT_INTERACTIVE
CLIENT_LOCAL_FILES
CLIENT_MULTI_STATEMEN
TS
CLIENT_MULTI_RESULTS
CLIENT_NO_SCHEMA
No
permite
a
sintaxe
db_name.nome_tabela.nome_coluna. Isto para o
ODBC. Ele faz com que o analizador gere um erro se voc utilizar aquela sintaxe. til para achar erros em alguns programas
ODBC.
CLIENT_ODBC
CLIENT_SSL
Valor Retornado
Um handle de conexo MYSQL* se a conexo foi obtida com sucesso, NULL se a conexo falhou.
Para um conexo estabelecida o valor de retorn o mesmo que o valor do primeiro parmetro.
Erros
750
CR_CONN_HOST_ERROR
Falhou ao conectar ao servidor MySQL.
CR_CONNECTION_ERROR
Falhou ao conectar ao servidor MySQL local.
CR_IPSOCK_ERROR
Falhou au criar um socket IP.
CR_OUT_OF_MEMORY
Sem memria.
CR_SOCKET_CREATE_ERROR
Falhou ao criar um socket Unix.
CR_UNKNOWN_HOST
Falhou ao procurar o endereo IP para o nome de maquina.
CR_VERSION_ERROR
Um erro de protocolo resultou da tentativa de conexao a um servidor com uma biblioteca cliente
que utiliza uma verso de protocolo diferente. Isto pode acontecer se voc utiliza uma biblioteca
cliente muito antiga para se conectar a um novo servidor qua no foi iniciado com a opo -old-protocol.
CR_NAMEDPIPEOPEN_ERROR
Falhou ao criar um named pipe no Windows.
CR_NAMEDPIPEWAIT_ERROR
Falhou ao esperar por um named pipe no Windows.
CR_NAMEDPIPESETSTATE_ERROR
Falhou ao conseguir mainpulador do pipe no Windows.
CR_SERVER_LOST
Se connect_timeout > 0 e leva mais que connect_timeout segundos para conectar ao
servidor ou se o servidro foi finalizado ao executar o init-command.
Exemplo
MYSQL mysql;
mysql_init(&mysql);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"seu_programa");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
fprintf(stderr, "Failed to connect to database: Error: %s\n",
mysql_error(&mysql));
}
Usando mysql_options() a biblioteca MySQL ir ler as sees [client] e
[seu_programa] no arquivo my.cnf o qual ir assegurar que seu programa ir funcionar, mesmo se alguem tiver configurado o MySQL de um modo fora do padro.
751
12.1.3.44. mysql_real_escape_string()
unsigned long mysql_real_escape_string(MYSQL
const char *from, unsigned long length)
*mysql,
char
*to,
Descrio
A funo usada para criar um string SQL vlida que voc pode usar em uma instruo SQL. See
Seco 6.1.1.1, Strings.
A string em from codificada para uma string SQL com escape, levando em conta o conjunto de
caracteres atual da conexon. O resultado colocada em to e uma byte nulo de termino adcionado. Caracteres codificados so NUL (ASCII 0), '\n', '\r', '\', ''', '"' e Control-Z (see Seco 6.1.1,
Literais: Como Gravar Strings e Numerais). (O MySQL precisa que apenas a barra invertida e as
aspas utilizadas para citar a consulta sejam escapadas. Esta funo coloca os outros caracteres entre
aspas para torn-lo mais fcil de ser lido em arquivos log.)
A string apontada por from deve ter o tamanho de length bytes. Voc deve alocar o buffer to
para o tamanho de pelo menos length*2+1 bytes. (No pior caso, cada caracter pode precisar de
ser codificado como se utilizasse dois bytes, e voc preciria de espao para o byte null de terminao.) Quando mysql_real_escape_string() retornar, o contedo de to ser uma string terminada em null. O valor o tamanho da string codificada. no incluindo o caracter nulo usado para
terminar a string.
Exemplo
char query[1000],*end;
end = strmov(query,"INSERT INTO test_table values(");
*end++ = '\'';
end += mysql_real_escape_string(&mysql, end,"What's this",11);
*end++ = '\'';
*end++ = ',';
*end++ = '\'';
end += mysql_real_escape_string(&mysql, end,"binary data: \0\r\n",16);
*end++ = '\'';
*end++ = ')';
if (mysql_real_query(&mysql,query,(unsigned int) (end - query)))
{
fprintf(stderr, "Failed to insert row, Error: %s\n",
mysql_error(&mysql));
}
A funo strmov() usada no exemplo est includa na biblioteca mysqlclient e funciona como strcpy() mas retorna um ponteiro para null de terminao do primeiro parmetro.
Valor Retornado
O tamanho do valor colocado em to, no incluindo o caracter null de terminao.
Erros
Nenhum.
12.1.3.45. mysql_real_query()
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long
length)
752
Descrio
Executa a consulta SQL apontada por query, que deve ser uma string de length bytes. A consulta deve consistir de uma instruo SQL simples. Voc no deve adicionar um ponto e virgula (';')
ou \g no fim da instruo.
Voc deve utilizar mysql_real_query() em lugar de mysql_query() para consultas que
contenham dados binrios, pois eles podem conter o caracter '\0'. Alm disso,
mysql_real_query() mais rpido que mysql_query() pois ele no faz chamadas strlen() na string de consulta.
Se voc quiser saber se a consulta retornou um resultado ou no, voc pode usar
mysql_field_count(). See Seco 12.1.3.20, mysql_field_count().
Valor Retornado
Zero se a consulta obteve sucesso. Deiferente de zero se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.46. mysql_reload()
int mysql_reload(MYSQL *mysql)
Descrio
Diz ao servidor MySQL para recarregar a tabela de ables. The connected user must have the RELOAD privilege.
This function is deprecated. It is preferable to use mysql_query() to issue a SQL FLUSH PRIVILEGES statement instead.
Valor Retornado
Zero for success. Non-zero if an error occurred.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
753
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.47. mysql_row_seek()
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET
offset)
Descrio
Atribui ao cursor de linha um registro arbitrrio em resultado de uma consulta. O valor do offset
um offset do registro que deve ser um valor retornado de mysql_row_tell() ou
mysql_row_seek(). Este valor no simplesmente um nmero de linha; se voc quiser buscar
um registro em um resultado usando o nmero de linha utilize mysql_data_seek().
Esta funo exige que a estrutura do resultado contenha todo o resultado da consulta, assim
mysql_row_seek() pode ser um usado em conjunto apenas com mysql_store_result(),
e no com mysql_use_result().
Valor Retornado
O valor anterior do cursor de linha. Este valor pode ser passado a uma chamada subsequente
mysql_row_seek().
Erros
Nenhum.
12.1.3.48. mysql_row_tell()
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)
Descrio
Retorna a posio atual do cursor de linha para a ltima mysql_fetch_row(). Este valor pode
ser utilizado como argumento para mysql_row_seek().
Voc deve utilizar mysql_row_tell() somente depois de mysql_store_result(), e no
depois de mysql_use_result().
Valor Retornado
O offset atual do cursos de linha.
Erros
Nenhum.
12.1.3.49. mysql_select_db()
int mysql_select_db(MYSQL *mysql, const char *db)
Descrio
Faz com que o banco de dados espexcificado por db se torne o padro (atual) na conexo especificada por mysql. Nas consultas seguintes este banco de dados o padro para tabelas que no incluem uma especificao explicita para o banco de dados.
754
mysql_select_db() falha a menos que o usurio conectado possa ser autenticado com permisso para utilizar o banco de dados.
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.50. mysql_set_server_option()
int
mysql_set_server_option(MYSQL
enum_mysql_set_option option)
*mysql,
Descrio
Habilita ou desabilita uma opo para a conexo. option por ter um dos seguintes valores:
MYSQL_OPTION_MULTI_ Habilita suporte a multi instrues.
STATEMENTS_ON
MYSQL_OPTION_MULTI_ Desabilita suporte a multi instrues.
STATEMENTS_OFF
Valores Retornados
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
ER_UNKNOWN_COM_ERROR
755
enum
12.1.3.51. mysql_shutdown()
int mysql_shutdown(MYSQL *mysql)
Descrio
Diz ao servidor de banco de dados para finalizar. O usurio conectado deve ter privilgio SHUTDOWN.
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.52. mysql_sqlstate()
const char *mysql_sqlstate(MYSQL *mysql)
Descrio
Retorna uma string terminada em null contendo o cdigo de erro SQLSTATE para o ltimo erro. O
cdigo de erro consiste de cinco caracteres. 00000 significa ``sem erros''. Os valores so especificados pelo ANSI SQL e ODBC. Para uma lista de valores possveis, veja Seco 13.1, Erros Retornados.
Note que nem todos os erros j esto mapeados para SQLSTATE. O valor 'HY000' (erro geral)
usado para erros no mapeados.
Esta funo foi adicionada ao MySQL 4.1.1.
Valores Retornados
Uma string terminada em null contendo o cdigo de erro SQLSTATE.
Veja Tambm
See Seco 12.1.3.12, mysql_errno(). See Seco 12.1.3.13, mysql_error(). See Seco 12.1.7.18, mysql_stmt_sqlstate().
756
12.1.3.53. mysql_ssl_set()
int mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert,
const char *ca, const char *capath, const char *cipher)
Descrio
mysql_ssl_set() usado para estabelecer conexo segura usando SSL. Ela deve ser chamada
antes de mysql_real_connect().
mysql_ssl_set() no faz nada a mesno que o suporte OpenSSL esteja habilitado na biblioteca
cliente.
mysql e o handler da conexo retornado de mysql_init(). Os outros parmetros so especificados como a seguir:
capath o caminho para um diretrio que contm certificados SSL CA confiveis no formato
pem.
12.1.3.54. mysql_stat()
char *mysql_stat(MYSQL *mysql)
Descrio
Retorna uma string contendo informaes sinmilares a aquelas fornecidas pelo comando mysqladmin status. Isto inclui o tempo de conexo em segundos e o nmero de threads em execuo, recargas e tabelas abertas.
Valor Retornado
Uma string descrevendo o status do servidor. NULL se um erro ocorrer.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
757
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.55. mysql_store_result()
MYSQL_RES *mysql_store_result(MYSQL *mysql)
Descrio
Voc deve chamar mysql_store_result() ou mysql_use_result() para cada consulta
que retorne dados com sucesso (SELECT, SHOW, DESCRIBE, EXPLAIN).
Voc no precisa chamar mysql_store_result() ou mysql_use_result() para outras
consultas, mas ele no causar nenhum dano ou nenhuma queda notel de desempenho se voc chamar mysql_store_result() em todos os casos. Voc pode detectar se a consulta no obteve
resultado verificando se mysql_store_result() retornou 0.
Se voc quiser saber se a consulta devia retornar algum resultado, voc pode utilizar
mysql_field_count()
para
fazer
a
verificao.
See
Seco
12.1.3.20,
mysql_field_count().
mysql_store_result() l todo o resultado de uma consulta para um cliente, aloca uma estrutura MYSQL_RES e coloca o resultado nesta estrutura.
mysql_store_result() retorna um ponteiro para null se a consulta no retornar um resultado
(se a consulta foi, por exemplo, uma instruo INSERT).
mysql_store_result() tambm retorna um ponterio para null se a leitura do resultado falhar.
Voc pode verficar se voc obteve um erro verificando se mysql_error() no retornou um ponterio para null, se mysql_errno() retorna <> 0, ou se mysql_field_count() retorna <> 0.
Um resultado vazio retornado se no houver registros a retornar. (Um resultado vazio diferente
de um ponteiro para null em um valor de retorno).
Uma vez que voc tenha chamado mysql_store_result() e tenha retornado um resultado que
no uma apontador para null, voc pode chamar mysql_num_rows() para descobrir quantas linhas existem no resultado.
Voc pode chamar mysql_fetch_row() para buscar registros no resultado ou
mysql_row_seek() e mysql_row_tell() para obter ou definir a poio atual do registro
dentro do resultado.
Voc deve chamar mysql_free_result() quando tiver terminado com o resultado.
See Seco 12.1.12.1, Porque Algumas Vezes mysql_store_result() Retorna NULL Aps
mysql_query() Returnar com Sucesso?.
Valor Retornado
Uma estrutura de resultado MYSQL_RES com o resultado. NULL se um erro ocorreu.
Erros
mysql_store_result() zera mysql_error e mysql_errno se ela obter sucesso.
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_OUT_OF_MEMORY
758
Sem memoria.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.56. mysql_thread_id()
unsigned long mysql_thread_id(MYSQL *mysql)
Descrio
Retorna a ID da thread da conexo atual. Este valor pode ser usado como um argumento para
mysql_kill() para finalizar a thread.
Se a conexo for perdida e voc reconectar com mysql_ping(), a ID da thread ir alterar. Isto
significa que voc deve obter a ID da thread e guard-la para uso posterior. Voc deve obt-la quando precisar dela.
Valor Retornado
A ID da thread da conexo atual.
Erros
Nenhum.
12.1.3.57. mysql_use_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql)
Descrio
Voc deve chamar mysql_store_result() ou mysql_use_result() para cada consulta
que retornar data com sucesso (SELECT, SHOW, DESCRIBE, EXPLAIN).
mysql_use_result() inicicia a recuperao de um resultado mas no l realmente o resultado
no cliente como mysql_store_result() faz. Cada regiostro deve ser recuperado individualmente fazendo chamadas a mysql_fetch_row(). Ele l o resultado de uma consulta diretamente do servidor sem armazenar em uma tabela temporria ou em um buffer local, o o que mais rpido e utiliza menos memria que mysql_store_result(). O cliente so ir alocar memria para o registro atual para o buffer de comunicao que pode crescer para max_allowed_packet
bytes.
Por outro lado , voc no deve utilizar mysql_use_result() se voc estiver fazendo vrios
processamentos para cada registros no lado do cliente, ou se a sada enviada para a tela, na qual o
usurio de digitar um ^S (parada de tela). Isto ir prender o servidor e impedir outras threads de atualizar qualquer tabela na qual o dados esteja sendo buascado.
Ao usar mysql_use_result(), voc deve executar mysql_fetch_row() at um valor
NULL ser retornado, seno, os registros no buscados retornaro como part do resultado de sua prxima consulta. A API C fornecer o erro Commands out of sync; you can't run
this command now se voc esquecer de faz-lo.
759
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_OUT_OF_MEMORY
Sem memria.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.3.58. mysql_warning_count()
unsigned int mysql_warning_count(MYSQL *mysql)
Descrio
Retorna o nmero de avisos gerados durante a execuo da instruo SQL anterior. Disponvel a
partir do MySQL 4.1.
Valores de Retorno
A contagem de avisos.
Errors
Nenhum.
12.1.3.59. mysql_commit()
my_bool mysql_commit(MYSQL *mysql)
Descrio
Faz um commits na transao atual. Disponvel no MySQL 4.1
Valor Retornado
760
12.1.3.60. mysql_rollback()
my_bool mysql_rollback(MYSQL *mysql)
Descrio
Faz um rollback na transao atual. Disponvel no MySQL 4.1
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
Erros
Nenhum.
12.1.3.61. mysql_autocommit()
my_bool mysql_autocommit(MYSQL *mysql, my_bool mode)
Descrio
Define o modo autocommit como ligado se mode 1, desligado se mode 0.
Valor Retornado
Zero em caso de sucesso. Deiferente de zero se ocorrer um erro.
Erros
Nenhum.
12.1.3.62. mysql_more_results()
my_bool mysql_more_results(MYSQL *mysql)
Descrio
Retorna verdade se mais resultados da consulta atualmente em execuo existem, e a aplicao deve
chamar mysql_next_result() para buscar os resultados. Disponvel no MySQL 4.1
Valor Retornado
TRUE (1) se existem mais resultados. FALSE (0) se no existem mais resultados.
Note que na maioria dos casos chama-se mysql_next_result() para se mais de um resultado
existe e inicia o prximo resultado se ele existir.
See Seco 12.1.8, Tratando a Execuo de Mltiplas Consultas na API C. See Seco 12.1.3.63,
mysql_next_result().
Erros
Nenhum.
12.1.3.63. mysql_next_result()
761
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada. Por exemplo se voc no chamar
mysql_use_result() para um resulatdo anterior.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
MYSQL_STMT
Esta estrutura representa uma instruo preparada. Uma instruo preparada chamando
mysql_prepare(), que retorna uma handler da instruo, que um ponteiro para um
MYSQL_STMT. O handler usado para todas as funes subsequentes relacionadas s instrues.
A estrutura MYSQL_STMT no possui membros para uso em aplicao.
Mltiplos handles de instrues podem estar associados com uma nica conexo. O limite no
nmero de handlers depende dos recursos de sistemas disponveis.
MYSQL_BIND
Esta estrutura usada tanto para a entrada da consulta (valores de dados enviados ao servidor)
quanto para sada (valores de resultado retornados do servidor). Para entrada, ela usada com
mysql_bind_param() para ligar os valores os dados dos parmetros para armazenar em
buffers para uso pelo mysql_execute(). Para sada, ela usada com
mysql_bind_result() para ligar o buffer de resultado para uso na busca de registros com
mysql_fetch().
A estrutura MYSQL_BIND contm os seguintes membros para uso em aplicativos. Cada um deles utiliza tanto a entrada quanto a sada, embora algumas vezes sejam para diferentes propsitos
dependendo da direo da transfer6encia de dados:
void *buffer
Para entrada, este um ponteiro para o buffer no qual os dados de parmetros de uma consulta, esto armazenados. Para sada, ele um ponteiro para o buffer no qual se deve retornar
o valor de uma coluna do resultado. Para tipos numricos, o buffer deve apontar para uma
varivel do tipo C apropriado. (Se voc estiver associando a varivel com uma coluna que
tem o atributo UNSIGNED, a varivel deve ser um tipo C unsigned.) Para colunas de tipo
data e hora, o buffer deve apontar para uma estrutura MYSQL_TIME. Para colunas do tipo
caracter e string binria, o buffer aponta para um buffer de caracter.
bool *is_null
Este membro aponta para uma varivel my_bool que verdadeiro se um valor NULL, falso se ele no NULL. Para entrada, defina *IS_NULL como verdadeiro para indicar que voc est passando um valor NULL como um parmetro. Para sada, este valor verdadeiro se
o valor de um resultado retornado de uma consulta NULL.
MYSQL_TIME
Esta estrutura utilizada para enviar e receber dados DATE, TIME, DATETIME e TIMESTAMP
diretamente de e para o servidor. Isto feito configurando o membro buffer_type de uma
estrutura MYSQL_BIND para um dos tipos temporais e configurando o membro buffer para
apontar para uma estrutura MYSQL_TIME.
A estrutura MYSQL_TIME contm os seguintes membros:
my_bool neg
Um parmetrio booleano para indicar se o tempo negativo.
764
Apenas aquelas partes de uma estrutura MYSQL_TIME que se aplica a um dado tipo de valor
temporal so usados: Os elementos year, month e day so usados para valores DATE, DATETIME e TIMESTAMP. Os elementos hour, minute e second so usados para valores TIME,
DATETIME e TIMESTAMP. See Seco 12.1.9, Manipulando Valores de Data e Hora na API
C.
A seguinte tabela mostra os valores permitidos que podem ser especificados no membro buffer_type da estrutura MYSQL_BIND. A tabela tambm mostra aqueles tipos SQL que correspondem mais proximamente a cada valor buffer_type, e, para tipos numricos e temporais, o tipo C
correspondente.
buffer_type Valor
Tipo SQL
Tipo C
MYSQL_TYPE_TINY
TINYINT
char
MYSQL_TYPE_SHORT
SMALLINT
short int
MYSQL_TYPE_LONG
INT
long int
MYSQL_TYPE_LONGLONG
BIGINT
MYSQL_TYPE_FLOAT
FLOAT
float
MYSQL_TYPE_DOUBLE
DOUBLE
double
MYSQL_TYPE_TIME
TIME
MYSQL_TIME
MYSQL_TYPE_DATE
DATE
MYSQL_TIME
MYSQL_TYPE_DATETIME
DATETIME
MYSQL_TIME
MYSQL_TYPE_TIMESTAMP
TIMESTAMP
MYSQL_TIME
MYSQL_TYPE_STRING
CHAR
MYSQL_TYPE_VAR_STRING VARCHAR
MYSQL_TYPE_TINY_BLOB
TINYBLOB/TINYTEXT
MYSQL_TYPE_BLOB
BLOB/TEXT
MYSQL_TYPE_MEDIUM_BLO MEDIUMBLOB/MEDIUMTEXT
B
MYSQL_TYPE_LONG_BLOB
LONGBLOB/LONGTEXT
Descrio
mysql_prepare()
mysql_param_count()
da.
mysql_get_metadata()
mysql_bind_param()
mysql_execute()
mysql_stmt_store_result()
mysql_stmt_data_seek()
mysql_stmt_row_seek()
Busca por um offset de registro no resultado de uma busca, utilizando o valor reotornado de mysql_stmt_row_tell().
mysql_stmt_row_tell()
mysql_stmt_num_rows()
mysql_fetch()
Busca o prximo conjunto de dados do resultado e retorna os dados para todas as colunas limites.
mysql_stmt_close()
mysql_stmt_errno()
mysql_stmt_error()
mysql_stmt_sqlstate()
mysql_send_long_data()
766
1.
Chama mysql_prepare() e passa uma string contendo uma instruo SQL. Em uma operao de preparo bem sucedida, o mysql_prepare retorna o manipulador de instruo vlido
para a aplicao.
2.
3.
Define o valor de qualquer parmetro usando mysql_bind_param. Todos os parmetros devem ser definidos. De outra forma a execuo da consulta retornar um erro ou produzir resultados inesperados.
4.
5.
Se a consulta produz um resultado, liga o buffer de dados usado para retornar o valor do registro chamando mysql_bind_result().
6.
7.
O servidor analiza a consulta e envia o status de OK de volta para o cliente atribuindo uma identificao de instruo. Ele tambm envia um nmero total de parmetros, uma contagem de colunas e sua meta informao se for um resultado orientado a consulta. Toda a sintaxe e semntica da consulta verificada pelo servidor durante a chamada.
O cliente utiliza esta identificao da instruo para as operaes adicionais, assim o servidor
pode identificar a instruo dentre outras existentes. O cliente tambm aloca um manipulador de
instrues com esta identificao e o retorna para a aplicao.
O servidor identifica a instruo usando a identificao fornecida pelo cliente, substitui o marcador do parmetro com o dado fornecido mais recente e executa a consulta. Se a consulta produz
um resultado, o servidor envia o dado de volta para o cliente. Seno envia o status de OK como
nmero total de registros alterados, deletados ou inseridos.
O cliente l os dados do pacote registro por registro e o coloca no buffer de dados da aplicao
fazendo as converses necessrias. Se o tipo do buffer de aplicao o mesmo do tipo do campo
retornado do servidor, as converses so diretas.
Voc pode obter o cdigo de erro, mensagens e o valor SQLSTATE da instruo utilizando
mysql_stmt_errno(), mysql_stmt_error() e mysql_stmt_sqlstate() respectivamente.
767
12.1.7.1. mysql_prepare()
MYSQL_STMT * mysql_prepare(MYSQL *mysql, const char *query, unsigned long length)
Descrio
Prepara a consulta SQL apontada pela string com terminao em nulo query, e retorna um handle
da instruo para ser usado por operaes adicionais na instruo. A consulta deve consistir de uma
nica instruo SQL. Voc no deve adicionar ponto e virgula (';') ou \g a instruo.
A aplicao pode incluir um ou mais marcadores de parmetro na instruo SQL, embutindo interrogaes ('?') na string SQL na posio aprpriada.
Os marcadores s so vlidos em certos lugares na instruo SQL. Por exemplo, eles no so permitidos em lista VALUES() de uma instruo INSERT (para especificar valores para uma linha ou em
uma comparao com uma coluna em uma clusula WHERE para especificar uma valor de comparao. No entanto, eles no so permitidos como identificadores (tais como nomes de colunas ou tabelas), na lista select que indica as colunas a serem retornadas por uma instruo SELECT), ou para
especificar ambos operandos de um operador binrio como o sinal de igual =. A ltima restrio
necessria porque seria impossvel determinar o tipo do parmetro. Em geral, parmetros so vlidos somente em instruo de Linguagem de Manipulao de Dados (Data Manipulation LanguangeDML), e no em instrues de Linguagem de Definio de Dados (Data Defination LanguageDDL).
Os marcadores de parmetro devem limitar variveis
mysql_bind_param() antes de executar a instruo.
de
aplicaes
utilizando
Valor Retornado
Um ponteiro para uma estrutura MYSQL_STMT se o preparo obteve sucesso. NULL se ocorreu um
erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_OUT_OF_MEMORY
Falta de memria
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
consulte
exemplo
de
Seco
12.1.7.5,
12.1.7.2. mysql_param_count()
unsigned long mysql_param_count(MYSQL_STMT *stmt)
Descrio
Retorna o nmero de marcadores de parmetros presentes na consulta preparada.
Valor Retornado
Um unsigned long (inteiro sem sinal) representando o nmero de parmetros em uma instruo.
Erros
Nenhum.
Exemplo
Para utilizar mysql_param_count()
mysql_execute().
consulte
exemplo
de
Seco
12.1.7.5,
12.1.7.3. mysql_get_metadata()
MYSQL_RES *mysql_get_metadata(MYSQL_STMT *stmt)
Descrio
Se uma instruo passada para mysql_prepare() rproduziu um resultado,
mysql_get_metadata() retorna o resultado dos meta dados na forma de um ponteiro para uma
estrutura MYSQL_RES que tambm pode ser usada para processar a meta informao como o nmero total de campos e informao de campos indivduais. Este ponteriro para o resultado pode ser
passado como um argumento para qualquer um dos campos com base na API que processam o resultado dos metadados, como:
mysql_num_fields()
mysql_fetch_field()
mysql_fetch_field_direct()
mysql_fetch_fields()
mysql_field_count()
mysql_field_seek()
mysql_field_tell()
mysql_free_result()
A estrutura do resultado deve estar liberada quando voc acabar de us-lo. Voc pode faz-lo passando para mysql_free_result(). semelhante ao modo que voc libera um resulatdo chamado com mysql_store_result().
O resultado retornado por mysql_get_metadata() contm apenas metadados. Ele no contm
769
CR_OUT_OF_MEMORY
Falta de memria
CR_UNKNOWN_ERROR
Ocorreu um erro desconhecido
Exemplo
Para utilizar mysql_get_metadata()
mysql_fetch()
consulte
exemplo
de
Seco
12.1.7.13,
12.1.7.4. mysql_bind_param()
my_bool mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind)
Descrio
mysql_bind_param() utilizado para ligar dados para os marcadores de parmetros na instruo SQL que foi passada para mysql_prepare(). Ele utiliza a estrutura MYSQL_BIND para fornecer os dados. bind o endereo de um vetor de estruturas MYSQL_BIND. A biblioteca cliente
espera que o vetor deve contenha um elemento para cada marcador de parmetro ? que est presente
na consulta.
Suponha que voc prepare a seguinte instruo:
INSERT INTO mytbl VALUES(?,?,?)
Quando voc ligar os parmetros, o vetor da estrutura MYSQL_BIND deve conter trs elementos e
pode estar declarado assim:
MYSQL_BIND bind[3];
O membro de cada elemento MYSQL_BIND que deve estar configurado est descrito em Seco 12.1.5, Tipos de Dados de Instrues Preparadas da API C.
Valor Retornado
Zeros se a ligao foi obtida com sucesso. Diferente de zero se ocorrer um erro.
Erros
CR_NO_PREPARE_STMT
No existem instrues preparadas
CR_NO_PARAMETERS_EXISTS
No existem parmetros para ligar
770
CR_INVALID_BUFFER_USE
Indica se a ligao forncer dados longos em bolcos e se o tipo de buffer binrio ou no uma
string.
CR_UNSUPPORTED_PARAM_TYPE
A converso no suportada. Possivelmente o valor de buffer_type invlido ou no um
dos tipos suportados listados acima.
CR_OUT_OF_MEMORY
Falta de memria
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
Exemplo
Para utilizar mysql_bind_param()
mysql_execute().
consulte
exemplo
de
Seco
12.1.7.5,
12.1.7.5. mysql_execute()
int mysql_execute(MYSQL_STMT *stmt).
Descrio
mysql_execute() executa a consulta preparada associada ao controlador de instrues. O valor
atual do marcador de parmetros enviado para o servidor durante esta chamada, e o servidor substituir marcadores com os novos dados fornecidos.
Se a instruo um UPDATE, DELETE ou INSERT, o nmero total de registros altrados, deletados
ou inseridos pode ser encontrado chamando mysql_stmt_affected_rows(). Se este um resultado de uma consulta como SELECT, deve se chamar mysql_fetch() para buscar dados previamente para fazer qualquer outra funo que resulte em um processamento de consulta. Para mais
informaes sobre como buscar os resultados, consulte Seco 12.1.7.13, mysql_fetch()
Valor Retornado
Zero se a execuo obteve sicesso. Diferente de zero se ocorreu um erro. O cdigo de erro e a mensagem podem ser obtidas chamando mysql_stmt_errno() e mysql_stmt_error().
Erros
CR_NO_PREPARE_QUERY
Nenhuma consulta preprada previamente para execuo
CR_ALL_PARAMS_NOT_BOUND
No forma fornecidos todos os dados de parmetros.
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_OUT_OF_MEMORY
Falta de memria
771
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
Exemplo
O seguinte exemplo demonstra como criar e preencher uma tabela usando mysql_prepare(),
mysql_param_count(),
mysql_bind_param(),
mysql_execute()
e
mysql_stmt_affected_rows(). A varivel mysql considerada como um controlador de
conexo vlido.
#define STRING_SIZE 50
#define DROP_SAMPLE_TABLE "DROP TABLE IF EXISTS test_table"
#define CREATE_SAMPLE_TABLE "CREATE TABLE test_table(col1 INT,\
col2 VARCHAR(40),\
col3 SMALLINT,\
col4 TIMESTAMP)"
#define INSERT_SAMPLE "INSERT INTO test_table(col1,col2,col3) VALUES(?,?,?)"
MYSQL_STMT
*stmt;
MYSQL_BIND
bind[3];
my_ulonglong affected_rows;
int
param_count;
short
small_data;
int
int_data;
char
str_data[STRING_SIZE];
unsigned long str_length;
my_bool
is_null;
if (mysql_query(mysql, DROP_SAMPLE_TABLE))
{
fprintf(stderr, " DROP TABLE failed\n");
fprintf(stderr, " %s\n", mysql_error(mysql));
exit(0);
}
if (mysql_query(mysql, CREATE_SAMPLE_TABLE))
{
fprintf(stderr, " CREATE TABLE failed\n");
fprintf(stderr, " %s\n", mysql_error(mysql));
exit(0);
}
/* Prepare an INSERT query with 3 parameters */
/* (the TIMESTAMP column is not named; it will */
/* be set to the current date and time) */
stmt = mysql_prepare(mysql, INSERT_SAMPLE, strlen(INSERT_SAMPLE));
if (!stmt)
{
fprintf(stderr, " mysql_prepare(), INSERT failed\n");
fprintf(stderr, " %s\n", mysql_error(mysql));
exit(0);
}
fprintf(stdout, " prepare, INSERT successful\n");
/* Get the parameter count from the statement */
param_count= mysql_param_count(stmt);
fprintf(stdout, " total parameters in INSERT: %d\n", param_count);
if (param_count != 3) /* validate parameter count */
{
fprintf(stderr, " invalid parameter count returned by MySQL\n");
exit(0);
}
/* Bind the data for all 3 parameters */
772
/* INTEGER PARAM */
/* This is a number type, so there is no need to specify buffer_length */
bind[0].buffer_type= MYSQL_TYPE_LONG;
bind[0].buffer= (char *)&int_data;
bind[0].is_null= 0;
bind[0].length= 0;
/* STRING PARAM */
bind[1].buffer_type= MYSQL_TYPE_STRING;
bind[1].buffer= (char *)str_data;
bind[1].buffer_length= STRING_SIZE;
bind[1].is_null= 0;
bind[1].length= &str_length;
/* SMALLINT PARAM */
bind[2].buffer_type= MYSQL_TYPE_SHORT;
bind[2].buffer= (char *)&small_data;
bind[2].is_null= &is_null;
bind[2].length= 0;
/* Bind the buffers */
if (mysql_bind_param(stmt, bind))
{
fprintf(stderr, " mysql_bind_param() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
/* Specify the data values for the first row */
int_data= 10;
/* integer */
strncpy(str_data, "MySQL", STRING_SIZE); /* string */
str_length= strlen(str_data);
/* INSERT SMALLINT data as NULL */
is_null= 1;
/* Execute the INSERT statement - 1*/
if (mysql_execute(stmt))
{
fprintf(stderr, " mysql_execute(), 1 failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
/* Get the total number of affected rows */
affected_rows= mysql_stmt_affected_rows(stmt);
fprintf(stdout, " total affected rows(insert 1): %ld\n", affected_rows);
if (affected_rows != 1) /* validate affected rows */
{
fprintf(stderr, " invalid affected rows by MySQL\n");
exit(0);
}
/* Specify data values for second row, then re-execute the statement */
int_data= 1000;
strncpy(str_data, "The most popular open source database", STRING_SIZE);
str_length= strlen(str_data);
small_data= 1000;
/* smallint */
is_null= 0;
/* reset */
/* Execute the INSERT statement - 2*/
if (mysql_execute(stmt))
{
fprintf(stderr, " mysql_execute, 2 failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
/* Get the total rows affected */
affected_rows= mysql_stmt_affected_rows(stmt);
fprintf(stdout, " total affected rows(insert 2): %ld\n", affected_rows);
if (affected_rows != 1) /* validate affected rows */
{
fprintf(stderr, " invalid affected rows by MySQL\n");
exit(0);
}
773
12.1.7.6. mysql_stmt_affected_rows()
my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt)
Descrio
Retorna o nmero total de registros alterados, deletados ou inseridos pela ltima instruo executada. Pode ser chamada imediatamente depois de mysql_execute() para instrues UPDATE,
DELETE ou INSERT. Para instrues SELECT, mysql_stmt_affected_rows() funciona
como mysql_num_rows().
Valor Retornado
Um integer (inteiro) maior que zero indica o nmero de registros afetados ou retornados. Zero indica
que nenhum registro foi atualizado em uma instruo UPDATE, nenhum regitro coincidiu com a
clusula WHERE na consulta ou que nenhuma consulta foi exeutada ainda. #1 indica que a consulta
retornou um erro ou que, para uma consulta SELECT, mysql_stmt_affected_rows() foi
chamado antes de chamra mysql_fetch().
Erros
Nenhum.
Exemplo
Para utilizar mysql_stmt_affected_rows() consulte o exemplo de Seco 12.1.7.5,
mysql_execute().
12.1.7.7. mysql_bind_result()
my_bool mysql_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)
Descrio
mysql_bind_result() usado para associar (ligar) colunas no resultados ao buffer de dados e
buffer de tamanho. Quando mysql_fetch() chamado para buscar dados, o protocolo cliente/
servidor MySQL os coloca os dados para as colunas limite no buffer especificado.
Note que todas as colunas devem ser limitadas por buffers antes da chamada de mysql_fetch().
bind o endereo de um vetor de estruturas MYSQL_BIND. A biblioteca cliente espera que o vetor
contenha um elemento para cada coluna no resultado. Seno mysql_fetch() simplesmente ignorado os dados trazidos; os buffers devem se suficientemente grande para guardar os dados, porque o
protocolo no retorna dados em blocos.
Uma coluna pode ser limitada a qualquer hora, mesmo depois do resultado ter sido parcialmente recuperado. A nova ligao tem efeito ba prxima vez em que mysql_fetch() chamado. Suponha que uma aplicao liga a coluna em um resultado e chama mysql_fetch(). O protocolo cliente/servidor retorna dados em buffers limitados. Agora suponha que a aplicao ligue a coluna a
um diferente cojunto de buffers, ento o protocolo no coloca os dados em um novo buffer limitado
at que a prxima chamada mysql_fetch() ocorra.
774
Para ligar uma coluna, uma aplicao chama mysql_bind_result() e passa o tipo, o endereo
e o endereo do buffer do tamanho. Os membros de cada elemento MYSQL_BIND que deve ser configurado esto descritos em Seco 12.1.5, Tipos de Dados de Instrues Preparadas da API C.
Valor Retornado
Zero se a ligao obteve sucesso. Diferente de zero se ocorreu um erro.
Erros
CR_NO_PREPARE_STMT
No existe instrues preparadas
CR_UNSUPPORTED_PARAM_TYPE
A converso no suportada. Possivelmente o buffer_type invlido ou no na lista dos tipos de buffers suportados
CR_OUT_OF_MEMORY
Falta de memria
CR_UNKNOWN_ERROR
Ocorreu um erro desconhecido
Exemplo
Para utilizar mysql_bind_result()
mysql_fetch()
consulta
exemplo
de
Seco
12.1.7.13,
12.1.7.8. mysql_stmt_store_result()
int mysql_stmt_store_result(MYSQL_STMT *stmt)
Descrio
Voc deve chamar mysql_stmt_store_result() para cada consulta que produz um resultado com sucesso (SELECT,SHOW,DESCRIBE, EXPLAIN), e s se voc quiser armazenar todo o resultado no buffer no cliente, assim que a chamada mysql_fetch() subsequente retornar os dados
em buffers.
Voc necessrio chamar mysql_stmt_store_result() para outras consultas, mas se voc
o fizer, no causar nenhum dano ou queda de performance em todo caso. Voc pode detectar se a
consulta produziu um resultado verificado se mysql_get_metadata() retorna NULL. Para
mais informaes consulte Seco 12.1.7.3, mysql_get_metadata().
Valor Retornado
Zero se o resultado foi armazenado em buffer com sucesso ou Diferente de zero em caso de erro.
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_OUT_OF_MEMORY
Falta de memoria.
775
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
12.1.7.9. mysql_stmt_data_seek()
void mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset)
Descrio
Busca um registro arbitrrio no resultado de uma instruo. O valor do offset um nmero de registro e deve estar na faixa de 0 a mysql_stmt_num_rows(stmt)-1.
Esta funo exige que a estrutura do resultado da instruo contenha todo o resultado da ltima consulta executada, assim mysql_stmt_data_seek() pode ser usada em conjunto apenas com
mysql_stmt_store_result().
Valor Retornado
Nenhum.
Erros
Nenhum.
12.1.7.10. mysql_stmt_row_seek()
MYSQL_ROW_OFFSET
mysql_stmt_row_seek(MYSQL_STMT
MYSQL_ROW_OFFSET offset)
*stmt,
Descrio
Define o cursor de linha com um registro arbitrrio em um resultado de instruo. O valor do offset um offset de registro e deve ser um valor retornado de mysql_stmt_row_tell() ou
mysql_stmt_row_seek(). Este valor no um nmero de linha; se voc quiser buscar um registro em um resultado usando um nmero de linha, utilize mysql_stmt_data_seek().
Esta funo exige que a estrutura do resultado contenha todo o resultado da consulta, assim
mysql_stmt_row_seek()
pode
ser
usado
em
conjunto
apenas
com
mysql_stmt_store_result().
Valor Retornado
O valor anterior do cursor de linha. Este valor pode ser passado a uma chamada subsequente de
mysql_stmt_row_seek().
Erros
Nenhum.
12.1.7.11. mysql_stmt_row_tell()
MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt)
776
Descrio
Retorna a posio corrente do cursor de linha para o ltimo mysql_fetch(). Este valor pode ser
usado como um argumento para mysql_stmt_row_seek().
Voc
deve
usar
mysql_stmt_row_tell()
mysql_stmt_store_result().
somente
depois
de
Valor Retornado
O offset atual do cursor de linha.
Erros
Nenhum.
12.1.7.12. mysql_stmt_num_rows()
my_ulonglong mysql_stmt_num_rows(MYSQL_STMT *stmt)
Descrio
Rertorna o nmero de registros no resultado.
O uso de mysql_stmt_num_rows() depende de se voc utilizou ou no
mysql_stmt_store_result() para armazenar todo o resultado no manipulador de instrues.
Se voc utilizou mysql_stmt_store_result(), mysql_stmt_num_rows() pode ser
chamado imediatamente.
Valor Retornado
O nmero de linhas no resultado.
Erros
Nenhum.
12.1.7.13. mysql_fetch()
int mysql_fetch(MYSQL_STMT *stmt)
Descrio
mysql_fetch() retorna o prximo registro no resultado. Ele pode ser chamado apenas enquanto
existir o conjunto de resultados. Per exemplo, depois de uma chamada de mysql_execute() que
cria o resultado ou depois de mysql_stmt_store_result(), que chamado depois de
mysql_execute() para armazenar todo o resultado.
mysql_fetch retorna os dados de uma linha usando o buffers limitado por
mysql_bind_result(). Ele retorna os dados neste buffer para todas as colunas no registro atual e os tamanhos so retornados para o apontador length.
Note que, todas as colunas devem ser limitadas pela aplicao antes de chamar mysql_fetch().
Se um valor do dado buscado um valor NULL, o valor *is_null da estrutura MYSQL_BIND
correspondente contm VERDADEIRO (1). Seno, o dado e seu tamanho retornado nos elementos
*buffer e *length baseados no tipo de buffer especificado pela aplicao. Cada tipo numrico
e temporal tem um tamanho fixo como mostrado na tabela a seguir. O tamano dos tipos strings dependem do tasmanho do valor dos dados atual, como indicado por data_length.
Type
Length
777
MYSQL_TYPE_TINY
MYSQL_TYPE_SHORT
MYSQL_TYPE_LONG
MYSQL_TYPE_LONGLONG
MYSQL_TYPE_FLOAT
MYSQL_TYPE_DOUBLE
MYSQL_TYPE_TIME
sizeof(MYSQL_TIME)
MYSQL_TYPE_DATE
sizeof(MYSQL_TIME)
MYSQL_TYPE_DATETIME
sizeof(MYSQL_TIME)
MYSQL_TYPE_STRING
tam_dado
MYSQL_TYPE_BLOB
tam_dado
Valor Retornado
Valor retornado
Descrio
MYSQL_NO_DATA
Erros
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_OUT_OF_MEMORY
Falta de memoria.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_SERVER_LOST
A conexo ao servidor MySQL foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
CR_UNSUPPORTED_PARAM_TYPE
O tipo de buffer MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, MYSQL_TYPE_DATETIME,
ou MYSQL_TYPE_TIMESTAMP, mas o tipo de dado no DATE, TIME, DATETIME ou TIMESTAMP.
de
converso
Exemplo
778
no
suportada
so
retornados
de
bind[0].length= &length[0];
/* STRING COLUMN */
bind[1].buffer_type= MYSQL_TYPE_STRING;
bind[1].buffer= (char *)str_data;
bind[1].buffer_length= STRING_SIZE;
bind[1].is_null= &is_null[1];
bind[1].length= &length[1];
/* SMALLINT COLUMN */
bind[2].buffer_type= MYSQL_TYPE_SHORT;
bind[2].buffer= (char *)&small_data;
bind[2].is_null= &is_null[2];
bind[2].length= &length[2];
/* TIMESTAMP COLUMN */
bind[3].buffer_type= MYSQL_TYPE_TIMESTAMP;
bind[3].buffer= (char *)&ts;
bind[3].is_null= &is_null[3];
bind[3].length= &length[3];
/* Bind the result buffers */
if (mysql_bind_result(stmt, bind))
{
fprintf(stderr, " mysql_bind_result() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
/* Now buffer all results to client */
if (mysql_stmt_store_result(stmt))
{
fprintf(stderr, " mysql_stmt_store_result() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
/* Fetch all rows */
row_count= 0;
fprintf(stdout, "Fetching results ...\n");
while (!mysql_fetch(stmt))
{
row_count++;
fprintf(stdout, " row %d\n", row_count);
/* column 1 */
fprintf(stdout, "
column1 (integer) : ");
if (is_null[0])
fprintf(stdout, " NULL\n");
else
fprintf(stdout, " %d(%ld)\n", int_data, length[0]);
/* column 2 */
fprintf(stdout, "
column2 (string)
: ");
if (is_null[1])
fprintf(stdout, " NULL\n");
else
fprintf(stdout, " %s(%ld)\n", str_data, length[1]);
/* column 3 */
fprintf(stdout, "
column3 (smallint) : ");
if (is_null[2])
fprintf(stdout, " NULL\n");
else
fprintf(stdout, " %d(%ld)\n", small_data, length[2]);
/* column 4 */
fprintf(stdout, "
column4 (timestamp): ");
if (is_null[3])
fprintf(stdout, " NULL\n");
else
fprintf(stdout, " %04d-%02d-%02d %02d:%02d:%02d (%ld)\n",
ts.year, ts.month, ts.day,
ts.hour, ts.minute, ts.second,
length[3]);
fprintf(stdout, "\n");
}
780
12.1.7.14. mysql_send_long_data()
my_bool mysql_send_long_data(MYSQL_STMT *stmt, unsigned int parameter_number, const char *data, ulong length)
Descrio
Permite que um aplicao envie os dados dos parmetros para o servidor em partes (ou ``blocos'').
Esta funo pode ser chamada vrias vezes parar enviar partes de valores de dados binrios e caracteres para uma coluna, que deve do tipo TEXT ou BLOB.
parameter_number indica a qual parmetro o dado associado. Os parmetros so numerados
comeando com 0. data um ponteiro para um buffer contendo dados a serem enviados, e
length indica a quantidade de bytes no buffer.
Valor Retornado
Zero se os dados so enviados com sucesso para o servidir. Diferente de zero se ocorrer um erro.
Erros
CR_INVALID_PARAMETER_NO
Nmero de parmetro invlido
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_OUT_OF_MEMORY
Falta de memoria.
CR_SERVER_GONE_ERROR
O servidor MySQL foi finalizado.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
Example
O exemplo seguinte demonstra como enviar os dados para um coluna do tipo TEXT em blocos. Ele
insere o dado ``MySQL - The most popular open source database'' na coluna text_column. A va781
MYSQL_BIND bind[1];
long
length;
if (!mysql_prepare(mysql, INSERT_QUERY, strlen(INSERT_QUERY))
{
fprintf(stderr, "\n prepare failed");
fprintf(stderr, "\n %s", mysql_error(mysql));
exit(0);
}
memset(bind, 0, sizeof(bind));
bind[0].buffer_type= MYSQL_TYPE_STRING;
bind[0].length= &length;
bind[0].is_null= 0;
/* Bind the buffers */
if (mysql_bind_param(stmt, bind))
{
fprintf(stderr, "\n param bind failed");
fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
exit(0);
}
/* Supply data in chunks to server */
if (!mysql_send_long_data(stmt,0,"MySQL",5))
{
fprintf(stderr, "\n send_long_data failed");
fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
exit(0);
}
/* Supply the next piece of data */
if (mysql_send_long_data(stmt,0," - The most popular open source database",40)
{
fprintf(stderr, "\n send_long_data failed");
fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
exit(0);
}
/* Now, execute the query */
if (mysql_execute(stmt))
{
fprintf(stderr, "\n mysql_execute failed");
fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
exit(0);
}
12.1.7.15. mysql_stmt_close()
my_bool mysql_stmt_close(MYSQL_STMT *)
Descrio
Fecha a instruo preparada. mysql_stmt_close() tambm desaloca o manipulador de instrues apontado por stmt.
Se a instruo atual tiver resultados pendentes ou no lidos, esta funo os cancela para que a prxima consulta possa ser executada.
Valor Retornado
Zero se a instruo for liberada com sucesso. Diferente de zero se ocorrer um erro.
Erros
CR_SERVER_GONE_ERROR
782
CR_UNKNOWN_ERROR
Ocorreu um erro desconhecido.
Exemplo
Para utilizar mysql_stmt_close()
mysql_execute().
consulte
exemplo
de
Seco
12.1.7.5,
12.1.7.16. mysql_stmt_errno()
unsigned int mysql_stmt_errno(MYSQL_STMT *stmt)
Descrio
Para a instruo especificada por stmt, mysql_stmt_errno() retorna o cdigo de erro para a
funo de instrues da API chamada mais recentemente. Um valor de retorno de zero significa que
no ocorreu nenhum erro. Nmeros de mensagens de erro do cliente esto listadas no arquivo cabelho errmsg.h do MySQL. Nmeros de mensagens de erro do servidor esto listado no arquivo
mysqld_error.h. Na distribuio fonte do MySQL voc pode encontrar uma lista completa de
mensagens de erros e nmero de erros no arquivo Docs/mysqld_error.txt. Os cdigos de erros do servidor tambm esto listados em Seco 13.1, Erros Retornados.
Valor Retornado
Um valor de cdigo de erro. Zero se no ocorreu erro.
Erros
Nenhum
12.1.7.17. mysql_stmt_error()
const char *mysql_stmt_error(MYSQL_STMT *stmt)
Descrio
Para a instruo especificada por stmt, mysql_stmt_error() retorna uma string terminada
em null contendo a mensagem de erro para a funo de instruo da API chamada mais recentemente. Um string vazia ("") retornado se no ocorreu nenhum erro. Isto significa que os seguintes comandos so equivalentes:
if (mysql_stmt_errno(stmt))
{
// an error occured
}
if (mysql_stmt_error(stmt)[0])
{
// an error occured
}
A linguagem da mensagem de erro do cliente pode ser alterada recompilando a biblioteca cliente do
MySQL. Atualmente voc pode escolher mensagem de erros em diversas linguagens.
Valor Retornado
Um string contendo a descrio do erro. Uma string vazia se no ocorrer erros.
Erros
783
Nenhum
12.1.7.18. mysql_stmt_sqlstate()
const char *mysql_stmt_sqlstate(MYSQL_STMT *stmt)
Descrio
Para a intruo especificada por stmt, mysql_stmt_sqlstate(), retorna uma string terminada em null contendo o cdigo de erro SQLSTATE para funo API de instrues preparadas mais
recentemente chamada que tenha obtido sucesso ou falhado. O cdigo de erro consiste de cinco caracteres. "00000" significa ``sem erros''. Os valores so especificados pelo ANSI SQL e ODBC.
Para uma lista de valores possveis, veja Seco 13.1, Erros Retornados.
Note que nem todos os erros j esto mapeados para SQLSTATE. O valor "HY000" (erro geral)
usado para erros no mapeados.
Valores Retornados
Uma string terminada em null contendo o cdigo de erro SQLSTATE.
Na estrutura MYSQL_BIND associado com o valor do dado, configure o membro buffer_type para o tipo que indique qual tipo de valor temporal voc est enviando. Para valores DATE, TIME, DATETIME, ou TIMESTAMP configure buffer_type para
MYSQL_TYPE_DATE,
MYSQL_TYPE_TIME,
MYSQL_TYPE_DATETIME,
ou
MYSQL_TYPE_TIMESTAMP repectivamente.
2.
3.
Preencha os membros da estrutura MYSQL_TIME que so apropriadas para o tipo de valor temporal que voc est passando.
ts;
bind[3];
*stmt;
12.1.10.1. my_init()
void my_init(void)
Descrio
Esta funo precisa ser chamada uma vez pelo programa antes de se chamar qualquer funo do
MySQL. Ela inicializa algumas varveis globais que o MySQL precisa. se voc est usando uma biblioteca cliente de thread segura, tambm ser feita uma chamada a mysql_thread_init() para esta thread.
Ela chamada automaticamente
mysql_connect().
por
mysql_init(),
mysql_server_init()
Valor Retornado
Nenhum
12.1.10.2. mysql_thread_init()
my_bool mysql_thread_init(void)
Descrio
Esta funo preisa aser chamada para cada thread criada para inicializar variveis especficas de threads.
Ela automaticamente chamada por my_init() e mysql_connect().
Valor Retornado
Zero se obtver sucesso. Diferente de zero se ocorrer um erro.
12.1.10.3. mysql_thread_end()
void mysql_thread_end(void)
Descrio
Esta funo precisa ser chamada antes da chamada de pthread_exit() para liberar a memria
alocada por mysql_thread_init().
Note que a funo no chamada automaticamente pela biblioteca cliente. Deve ser chamada explicitamente para evitar perda de memria.
Valor Retornado
Nenhum.
12.1.10.4. mysql_thread_safe()
unsigned int mysql_thread_safe(void)
Descrio
Esta funo indica se o cliente compilado como uma thread segura.
Valor Retornado
1 se o cliente possui thread segura, 0 em outro caso.
da API C
Voc deve utilizar as seguints funes se voc quiser permitir que a sua aplicao seja ligada a biblicoteca de servidor MySQL embutido. See Seco 12.1.15, libmysqld, a Biblioteca do Servidor Embutido MySQL.
Se o programa ligado com -lmysqlclient em vez de -lmysqld, estas funes no faro nada. Isto torna possvel escolher entre usar o servidor MySQL embutido e um servidor stand-alone
sem modificar nenhum cdigo.
12.1.11.1. mysql_server_init()
int mysql_server_init(int argc, char **argv, char **groups)
Descrio
Esta funo deve ser chamada uma vez no program usando o servidor embutido antes de se chamar
qualquer iutra funo do MySQL. Ela inicia o servidor e inicializa qualquer subsistema (mysys,
InnoDB, etc.) que o servidor utilize. Se esta funo no for chamada, o programa ir falhar. Se voc estiver usando o pacote DBUG que vem com o MySQL, voc deve chamar esta funo depois de
ter chamado MY_INIT().
Os argumentos argc e argv so anlogos ao argumentos para o main(). O primeiro elemento de
argv ignorado (ele contm normalmente, o nome do programa). por convenincia, argc pode
ser 0 (zero) se no houver argumentos de linha de comando para o servidor.
mysql_server_init() faz uma copia dos argumentos, assim seguro destruir argv ou
groups depois da chamada.
A lista de strings terminadas em NULL em groups seleciona qual grupo no arquivo de opes ser
ativado. See Seco 4.1.2, Arquivo de Opes my.cnf. Por convenincia, groups deve ser
NULL, caso no qual os grupos [server] d [emedded] estaro ativos.
Exemplo
#include <mysql.h>
#include <stdlib.h>
static char *server_args[] = {
"this_program",
/* this string is not used */
"--datadir=.",
"--key_buffer_size=32M"
};
static char *server_groups[] = {
"embedded",
"server",
"this_program_SERVER",
(char *)NULL
};
int main(void) {
mysql_server_init(sizeof(server_args) / sizeof(char *),
server_args, server_groups);
/* Use any MySQL API functions here */
mysql_server_end();
return EXIT_SUCCESS;
}
Valor Retornado
0 se okay, 1 se ocorrer um erro.
12.1.11.2. mysql_server_end()
void mysql_server_end(void)
Descrio
787
Esta funo deve ser chamada no programa depois de todas outra funes MySQL. Ela finaliza o srvidor embutido.
Valor Retornado
Nenhum.
A consulta no retornou dados (por exemplo, ela era um INSERT, UPDATE, ou DELETE).
Voc sempre pode verificar se a instruo devia produzir um resultado no vazio chamando
mysql_field_count(). Se mysql_field_count() retornar zero, o resultado est vazio e
a ltima consulta era uma instruo que no devia retorbar valor (por exemplo, um INSERT ou um
DELETE). Se mysql_field_count() retorna um valor diferente se zero, a instruo devia ter
produzido um resultado no vazio. Veja a descrio da funo mysql_field_count() para um
exemplo.
Voc pode testar um erro chamando mysql_error() ou mysql_errno().
Algumas consultas (LOAD DATA INFILE ..., INSERT INTO ... SELECT ..., UPDATE) retornam informaes adcionais. O resultado retornado por mysql_info(). Veja a
descrio de mysql_info() para o formato da string que ela returnou. mysql_info() retorna um ponteiro NULL se no houver informaes adicionais.
Se voc inserir um registro em uma tabela contendo uma coluna que tiver o atributo AUTO_INCREMENT, voc pode obter o ID gerado mais recentemente chamando a funo
mysql_insert_id().
Voc tambm pode recuperar o ID utilizando a funo LAST_INSERT_ID() em uma string de
consulta que foi passada a mysql_query().
Voc pode verificar se um ndice AUTO_INCREMENT usado executando o seguinte cdigo. Ele
tambm verifica se a consulta era um INSERT com um ndice AUTO_INCREMENT:
if (mysql_error(&mysql)[0] == 0 &&
mysql_num_fields(result) == 0 &&
mysql_insert_id(&mysql) != 0)
{
used_id = mysql_insert_id(&mysql);
}
O ID gerado mais recentemente mantido no servidor em uma base por conexo. Ele no ser alterado por outro cliente. Ele no ser alterado mesmo se voc atualizar outra coluna AUTO_INCREMENT com um valor no mgico (isto , um valor que no NULL e nem 0).
Se voc quiser utilizar o ID que foi gerado por uma tabela e inserido em uma segunda tabela, voc
ode utilizar instrues SQL como esta:
INSERT INTO foo (auto,text)
VALUES(NULL,'text');
INSERT INTO foo2 (id,text)
VALUES(LAST_INSERT_ID(),'text');
sh -c necessrio para fazer com que a sheel no trate a sada de mysql_config como uma
palavra.
Duas threads no podem enviar uma consaulta ao servidor MySQL ao mesmo tempo na mesma
conexo. Em particular, voc deve assegurar que entre um mysql_query() e
mysql_store_result() nenhuma outra thread est usando a mesma conexo.
Se voc utilizar mysql_use_result, voc ter que assegurar que nenhuma outra thread est
usando a mesma conexo at que o resultado seja fechado. No entanto, melhor para clientes
em threads que compartilham a mesma conexo utilizar mysql_store_result().
Se voc quiser utilizar mltiplas threads na mesma conexo, voc deve ter uma trava mutex na
combinao das chamadas mysql_query() e mysql_store_result(). Uma vez que
mysql_store_result() esteja pronto, a trva pode ser liberada e outras threads podem uti-
resultados
790
diferentes
que
so
recuperados
com
Se voc programa com threads POSIX, voc pode utilizar pthread_mutex_lock() e pthread_mutex_unlock() para estabelecer e liberar uma trava mutex.
Voc precisa saber o seguinte se voc tiver uma thread que estiver chamando funes MySQL que
no criaram a conexo ao banco de dados MySQL:
Quando voc chamar mysql_init() ou mysql_connect(), MySQL ir criar um varivel especica da thread para a thread que utilizada pela bibklioteca de depurao (entre outra coisas).
Se voc chamar uma funo MySQL, antes da thread chamar mysql_init() ou
mysql_connect(), a thread no ter as variveis especficas de thread necessrias alocadas e
voc acabar finalizando com uma descarga de memria mais cedo ou mais tarde.
Para fazer que as coisas funcionem suavemente voc tem que fazer o seguinte:
1.
Chama my_init() no incio do seu programa se for chamar qualquer outra funo MySQL
antes de chamar mysql_real_connect().
2.
3.
Na thread, chame mysql_thread_end() antes de chamar pthread_exit(). Isto ir liberar a memria usada pelas variveis especficas da thread do MySQL.
Voc pode obter alguns erros devido a smbolos indefinidos ao ligar seu cliente com libmysqlclient_r. Na maioria dos casos isto ocorre por no estar includa a biblioteca de threads na linha
de ligao/compilao.
Quando chamar
mysql_server_ini
t()
Deve ser chamada antes de qualquer outra funo MySQL, de preferncia no inicio da funo main().
mysql_server_end
()
mysql_thread_ini
t()
Deve ser chamada em cada thread que voc criar que acessar o
MySQL.
mysql_thread_end
()
791
No tem suporte a tabelas ISAM. (Isto feito para tornar a biblioteca menor)
Sem suporte a RAID interno. (Normalmente no necessrio j que a maioria dos SO possui suporte a arquivos grandes).
Voc no pode conectar ao servidor embutido de um processo externo com sockets ou TCP/IP.
Algumas desta limitaes podem ser alteradas editando o arquivo mysql_embed.h e recompilando o MySQL.
Coloque as sees comuns na seo [server]. Ela ser lida por ambas as verses do MySQL.
Estamos fornecendo opes para deixar de fora algumas partes do MySQL para tornar a biblioteca menor.
O erros so escritos no stderr. Adicionaremos uma opo para especificar um nome de arquivo para eles.
Temos que alterar o InnoDB para no ser to descritivo quando usado em um servidor embutido.
static void
die(MYSQL *db, char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
(void)putc('\n', stderr);
if (db)
db_disconnect(db);
exit(EXIT_FAILURE);
}
MYSQL *
db_connect(const char *dbname)
{
MYSQL *db = mysql_init(NULL);
if (!db)
die(db, "mysql_init failed: no memory");
/*
* Certifique-se que o cliente e o servidor utilizam grupos diferentes.
* Isto critico pois o servidor no aceitar as opes do
* cliente e vice versa.
*/
mysql_options(db, MYSQL_READ_DEFAULT_GROUP, "test_libmysqld_CLIENT");
if (!mysql_real_connect(db, NULL, NULL, NULL, dbname, 0, NULL, 0))
die(db, "mysql_real_connect failed: %s", mysql_error(db));
return db;
}
void
db_disconnect(MYSQL *db)
{
mysql_close(db);
}
void
db_do_query(MYSQL *db, const char *query)
{
if (mysql_query(db, query) != 0)
goto err;
if (mysql_field_count(db) > 0)
{
MYSQL_RES
*res;
MYSQL_ROW
row, end_row;
int num_fields;
if (!(res = mysql_store_result(db)))
goto err;
num_fields = mysql_num_fields(res);
while ((row = mysql_fetch_row(res)))
{
(void)fputs(">> ", stdout);
for (end_row = row + num_fields; row < end_row; ++row)
(void)printf("%s\t", row ? (char*)*row : "NULL");
(void)fputc('\n', stdout);
}
(void)fputc('\n', stdout);
mysql_free_result(res);
}
else
(void)printf("Affected rows: %lld\n", mysql_affected_rows(db));
return;
err:
die(db, "db_do_query failed: %s [%s]", mysql_error(db), query);
}
GNUmakefile
# This assumes the MySQL software is installed in /usr/local/mysql
inc
:= /usr/local/mysql/include/mysql
lib
:= /usr/local/mysql/lib
794
# If you have not installed the MySQL software yet, try this instead
#inc
:= $(HOME)/mysql-4.0/include
#lib
:= $(HOME)/mysql-4.0/libmysqld
CC
:= gcc
CPPFLAGS := -I$(inc) -D_THREAD_SAFE -D_REENTRANT
CFLAGS
:= -g -W -Wall
LDFLAGS := -static
# You can change -lmysqld to -lmysqlclient to use the
# client/server library
LDLIBS
= -L$(lib) -lmysqld -lz -lm -lcrypt
ifneq (,$(shell grep FreeBSD /COPYRIGHT 2>/dev/null))
# FreeBSD
LDFLAGS += -pthread
else
# Assume Linux
LDLIBS += -lpthread
endif
# This works for simple one-file test programs
sources := $(wildcard *.c)
objects := $(patsubst %c,%o,$(sources))
targets := $(basename $(sources))
all: $(targets)
clean:
rm -f $(targets) $(objects) *.core
Para conectar a uma mquina Unix de uma mquina Windows, com uma aplicao ODBC (uma
que no tenha suporte nativo as MySQL), voc deve primeiro instalar MyODBC em uma mquina Windows.
O usurio mquina Windows devem ter privilgios para acessar o servidor MySQL na mquina Unix. Isto pode ser feito om o comando GRANT. See Seco 4.4.1, A Sintaxe de GRANT e
REVOKE.
Selecione MySQL na tela Criar Nova Fonte de Dados e clique no boto Finalizar.
A tela de configurao padro do Driver MySQL mostrada. See Seco 12.2.2, Como
Preencher os Vrios Campos no Programa de Administrao do ODBC.
Agora inicie a sua aplicao e selcione o driver ODBC com o DSN que voc especificou no adminitrador ODBC.
796
Por exemplo:
194.216.84.21 meu_nome_maquina
test
This is my test database
test
194.216.84.21
monty
my_password
O valor para o campo Windows DSN name qualquer nome que seja nico em sua configurao
ODBC Windows.
Voc no precisa especificar valores para os campos Server, User, Password, ou Port ina tela de configurao do ODBC. No entanto, se voc o fizer, os valores sero utilizados como padro
posteriormente ao se tentar fazer uma nova conexo. Voc tem a opo de alterar os valores neste
momento.
Se o nmero da porta no dado, a porta padro (3306) utilizada.
Se voc especificar a opo Read options from C:\my.cnf, os grupos client e odbc
sero lidos do arquivo C:\my.cnf. Voc pode utilizar todas as opes que so teis a
mysql_options(). See Seco 12.1.3.40, mysql_options().
Valor padro
user
server
localhost
database
Comentrio
option
port
3306
stmt
password
socket
O argumento option usado para dizer ao MyODBC que o cliente no 100% compatvel com
ODBC. No Windows, o parmetro option normalmente definido mudando as diferentes opes na
tela de conexo mas tambm podem ser definidas no argumento option. As seguintes opes esto
listadas na mesma ordem em que aparecem na tela de conexo do MyODBC:
Bit
Descrio
797
O cliente no pode aceitar que MyODBC retorne a largura real de uma coluna.
O clinete n pode aceitr que MySQL retorne o valor real de colunas afetadas. Se este parmetro for definido o MySQL retornar 'registros encontrados'. necessriop o MySQL
3.21.14 ou posterior para funcionar.
16
32
64
128
256
512
1024
2048
4096
Diz ao seridor para ignorar espaos aps nome de funes e antes de '(' (necessrio para PowerBuilder). Torna todos os nomes de funes palavras-chaves!
8192
16384
Altera colunas LONGLONG para colunas INT (algumas aplicaes no podem tratar
LONGLONG).
32768
65536
131072
Adiciona algumas verificaes extras de segurana (no deve ser necessrio, mas...)
que
colocar
Se voc quiser ter muitas opes, voc deve somar os parmetros acima! Por exemplo, definir a opo como 12 (4+8) lhe permite debugar sem limite de pacotes.
O MYODBC.DLL padro compilado para um rendimento otimizado. Se voc quiser depurar o
MyODBC (por exemplo, habiliatr o trace), voc deve utilizar MYODBCD.DLL. Para instalar este arquivo copie MYODBCD.DLL sobre o arquivo MYODBC.DLL instalado.
S utilize campos double float. Alguns programa podem falhar quando comparam floats simples.
798
Se o exposto acima no ajudar, voc deve fazer um arquivo de rastreamento do MyODBC e tentar encontrar o que est dando errado.
Programa
Comentrio
Access
Para fazer o Access funcionar:
Se voc estiver usando Access 2000, voc deve obter e instalar o Microsoft MDAC (Microsoft Data Access Components) mais recente (verso 2.6 ou acima) em
http://www.microsoft.com/data/. Ele ir consertar o o seguinte bug no Access: quando voc
exporta dados para o MySQL, os nomes de tabelas e colunas no so especificados. Outro
modo de contornar este bug atualizar para MyODBC Verso 2.50.33 e MySQL Verso
3.23.x, que juntos fornecem um modo de contornar este erro!
Voc tambm deve obter e instalar Microsoft Jet 4.0 Service Pack 5 (SP5) que pode ser encontrado em http://support.microsoft.com/support/kb/articles/Q 239/1/14.ASP. Isto ir corrigir alguns casos onde colunas so marcadas como #deletadas# no Access.
Note que se voc estiver usando o MySQL Verso 3.22, voc deve aplicar o patch MDAC e
utilizar MyODBC 2.50.32 ou 2.50.34 e acima para contornar este problema.
Para todas as verses do Access, voc deve habilitar a opo do MyODBC Return matching rows. Para Access 2.0, voc tambm deve habilitar Simulate ODBC 1.0.
Voc deve ter um timestamp em todas as tabelas que voc deseja atualizar. Para maior portabilidade TIMESTAMP(14) ou apenas TIMESTAMP recomendado no lugar de outras variaes de TIMESTAMP(X).
Voc deve ter uma chave primia na tabela. Se no, registros novos ou atualizados podem
aparecer como #DELETED#.
S use campos DOUBLE float. O Access falaha ao comparar com campos single floats. Os
sintomas normais so que registros novos ou atualizados podem aparecer como
#DELETED# ou que voc no possa encontarar ou atualizar registros.
Se voc estiver ligando uma tabela com MyODBC, que tem BIGINT como uma de suas colunas, o resultado ser mostrado como #DELETED. A soluo para contornar este problema
:
Tenha um ou mais colunas modelos com TIMESTAMP como o tipo de dados, de preferncia TIMESTAMP(14).
Ele ainda mostra o registro anterior como #DELETADO#, mas novos registros adicionados/
atualizados sero mostrados apropriadamente.
Se voc ainda obter o erro Another user has changed your data depois de adicionar uma coluna TIMESTAMP, o seguinte truque pode lhe ajudar:
799
No utilize visualizar planilha de dados da tabela. Crie um formulario com os campos que
voc quer, e use visulizar planilha de dados de formulrio. Voc deve definir a propriedade DefaultValue para a coluna TIMESTAMP com NOW(). Esta pode ser uma boa
idia para oculta a coluna TIMESTAMP da visualizao para que seus usurios no fiquem
confusos.
Em alguns casos, o Access pode gerar consultas SQL invlidas que o MySQL no entende.
Voc pode arrumar isto selecionando "Query|SQLSpecific|Pass-Through" no
menu do Access.
No NT o Access ir mostrar colunas BLOB como OLE OBJECTS. Se voc quiser colunas
MEMO, voc deve alterar a coluna para TEXT com ALTER TABLE.
O Access no pode sempre tratar colunas DATE apropriadamente. Se voc tiver um problema com isto, mude as colunas para DATETIME.
Se voc tiver no Acces um coluna definida como BYTE, o Access tentar export-la como
TINYINT em vez de TINYINT UNSIGNED. Isto lhe tar problemas se voc tiver valores >
127 na coluna!
ADO
Quando voc est codificando com a API ADO e MyODBC voc precisa ter ateno com algumas propriedades padres que no so suportadas pelo servidor MySQL. Por exemplo, usando
CursorLocation Property como adUseServer retornar de RecordCount Property um resultado de -1. Para ter o valor correto, voc precisa definir esta propriedade a
adUseClient, como mostrado no cdigo VB abaixo:
Dim myconn As New ADODB.Connection
Dim myrs As New Recordset
Dim mySQL As String
Dim myrows As Long
myconn.Open "DSN=MyODBCsample"
mySQL = "SELECT * from user"
myrs.Source = mySQL
Set myrs.ActiveConnection = myconn
myrs.CursorLocation = adUseClient
myrs.Open
myrows = myrs.RecordCount
myrs.Close
myconn.Close
Outro modo de contornar o problea utilizar uma instruo SELECT COUNT(*) para uma
consulta parecida para obter a contagem de registros correta.
Aplicaes BDE
Para faze-las funcionar, voc deve definir os seguintes parmetros: Don't optimize column widths e Return matching rows.
Borland Builder 4
Qaundo voc inicia uma consulta, voc pode utilizar a propriedade Active ou utilizar o mtodo Open. Note que Active ir iniciar automaticamente executando uma consulta SELECT *
FROM ... que pode no ser algo bom se suas tabelas forem grandes.
800
DataJunction
Voc tem que alter-lo para uma sada VARCHAR em vez de ENUM, ja que ele exporta o ltimo
de uma maneira que cause um grief no MySQL.
Excel
Funciona. Algumas dicas:
Se voc tiver problema com datas, tente selecion-las como strings utilizando a funo
CONCAT(). Por exemplo:
select CONCAT(rise_time), CONCAT(set_time)
from sunrise_sunset;
Valores retornados deste modo como strings devem ser reconhecidos corretamente como valores time pelo Excel97.
O propsito de CONCAT() neste exemplo enganar o ODBC fazendo-o pensar que a coluna
do ``tipo string''. Sem o CONCAT(), ODBC sabe que a coluna do tipo time e o Excel no
entende isto.
Note que este um bug do Excel, pois ele converte automaticamente uma string para um time. Isto seria timo se a fonte fosse um arquivo texto, mas se torna um erro quando a fonte e
uma conexo ODBC que relata tipos exatos para cada coluna.
Word
Para recuperar os dados do MySQL para documentos Word/Excel, voc precisa utilizar o driver
MyODBC e a ajuda do Add-in Microsoft Query.
Por exemplo, crie um bd com uma tabela contendo 2 colunas de texto:
Crie um arquivo DSN usando o gerenciador ODBC, my, por exemplo, para o bd acima.
Utilizando a barra de ferramentas chamada Banco de Dados, pressione o boto insira banco
de dados.
801
No Ms Query crie uma Nova Fonte de Dados utilizando o arquivo DSN my.
Clique em Finalizar.
odbcadmin
Pograma teste para ODBC.
Delphi
Voc deve utilizar o BDE Verso 3.2 ou mais atual. Veja a opo i Don't optimize column width ao conectar no MySQL.
Aqui est um cdigo de Delphi potencialmente til que configura uma entrada ODBC e uma entrada BDE para para MyODBC (a entrada BDE exige de um Editor de Alias BDE que gratuito
em um site Delphi Super Page. (Obrigado a Bryan Brunton <bryan@flesherfab.com> por
isto):
fReg:= TRegistry.Create;
fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True);
fReg.WriteString('Database', 'Documents');
fReg.WriteString('Description', ' ');
fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll');
fReg.WriteString('Flag', '1');
fReg.WriteString('Password', '');
fReg.WriteString('Port', ' ');
fReg.WriteString('Server', 'xmark');
fReg.WriteString('User', 'winuser');
fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True);
fReg.WriteString('DocumentsFab', 'MySQL');
fReg.CloseKey;
fReg.Free;
Memo1.Lines.Add('DATABASE NAME=');
Memo1.Lines.Add('USER NAME=');
Memo1.Lines.Add('ODBC DSN=DocumentsFab');
Memo1.Lines.Add('OPEN MODE=READ/WRITE');
Memo1.Lines.Add('BATCH COUNT=200');
Memo1.Lines.Add('LANGDRIVER=');
Memo1.Lines.Add('MAX ROWS=-1');
Memo1.Lines.Add('SCHEMA CACHE DIR=');
Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
Memo1.Lines.Add('SQLQRYMODE=');
Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
802
Memo1.Lines.Add('ENABLE BCD=FALSE');
Memo1.Lines.Add('ROWSET SIZE=20');
Memo1.Lines.Add('BLOBS TO CACHE=64');
Memo1.Lines.Add('BLOB SIZE=32');
AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
C++ Builder
Testado com BDE verso 3.0. O nico problema conhecido que quando o esquema de tabelas
alterado, os campos da consulta no so atualizados. O BDE, no entanto, parece no reconhecer
chaves primrias, apenas o ndice PRIMARY, mas isto ser um problema.
Vision
Voc deve utilizar a opco Return matching rows.
Visual Basic
Para estar apto para habilitar uma tabela, voc deve definir uma chave primria para a tabela.
Visual Basic com ADO no pode manipular inteiros grandes. Isto significa que algumas consultas como SHOW PROCESSLIST no iro funcionar apropriadamente. A correo deifinir a
opo OPTION=16384 na string de conexo ODBC ou configurar a opo Change BIGINT
columns to INT na tela de conexo do MyODBC. Voc pode desejar definir a opo Return matching rows.
VisualInterDev
Se voc obtem o erro [Microsoft][ODBC Driver Manager] Driver does not
support this parameter a razo pode ser que voc tem um BIGINT em seu resultado.
Tente definir a opo Change BIGINT columns to INT na tela de conexo do
MyODBC.
Visual Objects
Voc deve utilizar a opo Don't optimize column widths.
803
Esteja certo de que voc est utilizando myodbcd.dll e no myodbc.dll. O modo mais
fcil de se fazer isto obter myodbcd.dll da distribuio MyODBC e copi-la sobre o
myodbc.dll, o qual estar, provavelmente, em seu diretrio C:\Windows\system32 ou
C:\winnt\system32.
Note que voc provavelmente deseja restaurar o myodbc.dll antigo ao finalizar o teste, j que
ele bem mais rpido que myodbcd.dll.
2.
3.
Verifique o arquivo de rastreamento do MyODBC, para saber o que pode estar errado.
Vioc deve estar apto a encontrar as consultas executadas buscando aps a string
>mysql_real_query no arquivo myodbc.log.
Voc tambm devev tentar duplicar as consultas no monitor mysql ou admndemo para descobrir
se o erro do MyODBC ou do MySQL.
Se voc encontar algo errado, envie-nos somente os registros relevantes (max 40 registros) para a
lista de email odbc do MySQL. See Seco 1.7.1.1, As Listas de Discusso do MySQL. Por favor, nunca envie todo o arquivo log do MyODBC ou ODBC!
Se voc no puder encontrar o que est errado, a ltima opo fazer um arquivo (tar ou zip) que
contenha um arquivo de rastreamento do MyODBC, o arquivo log do ODBC, e um arquivo README que explique o problema. Voc pode envi-lo para ftp://support.mysql.com/pub/mysql/secret/.
Somente ns da MySQL AB teremos acesso ao arquivo que voc enviar, a seremos bem discretos
com os dados!
Se voc pode criar um programa que tambm mostre este problema, nos envie ele tambm.
Se o programa funciona com algum outro servidor MySQL, voc deve fazer um arquivo de log do
MyODBC onde voc faz exatamente a mesma coisa no ouuto servidor SQL.
Lembre-se que quanto mais informaes voc nos fornecer, mais satisfatria ser a soluo encontrada para o problema!
MySQL Connector/J do MySQL AB, implementado 100% em Java nativo. Este produto era
formalmente conhecido como o driver mm.mysql. Voc pode fazer o doenload do MySQL
Connector/J em http://www.mysql.com/products/connector-j/.
804
O
driver
Resin
JDBC,
que
pode
http://www.caucho.com/projects/jdbc-mysql/index.xtp.
ser
encontrado
em
Para informao, consulte qualquer documentao JDBC, alm das documentao dos proprietrios
de cada driver para recursos especficos do MySQL.
Error: "Fatal error: Call to unsupported or undefined function mysql_connect() in .." Isto significa que sua verso do PHP no compilada com suporte ao MySQL. Voc tambm pode compilar um mdulo MySQL dinmico e carreg-lo no PHP ou recompilar o PHP com suporte ao
MySQL. Isto descrito em detalhes no manual PHP.
Error: "undefined reference to `uncompress'" Isto significa que a biblioteca cliente compilada
com suporte a um protocolo cliente/servidor compactado. A correo adicionar -lz por ltimo ao ligar com -lmysqlclient.
Descrio
connect
disconnect
prepare
execute
do
quote
fetchrow_array
fetchrow_arrayref
fetchrow_hashref
fetchall_arrayref
finish
rows
data_sources
ChopBlanks
NUM_OF_PARAMS
NULLABLE
trace
Descrio
mysql_insertid
is_blob
is_key
is_num
is_pri_key
is_not_null
length
max_length
NAME
Nomes de colunas.
NUM_OF_FIELDS
table
type
Os mtodos Perl so descritos em maiores detalhes nas sees seguintes. Variveis usadas em mtodos que retornam valor tem estes significados:
$dbh
806
$sth
Manipulador da Instruo
$rc
Cdigo de Retorno (geralmente um status)
$rv
Valor de Retorno (geralmente um contador de linhas)
mysql_read_default_file=file_name
L file_name como um arquivo de opo. Para informao sobre arquivo de opes veja
Seco 4.1.2, Arquivo de Opes my.cnf.
mysql_read_default_group=group_name
O grupo padro ao se ler uma arquivo de opes , normalamente, o grupo [client]. Especificando a aopo mysql_read_default_group, o grupo padro se torna o grupo
[group_name].
mysql_compression=1
Utiliza comunicao compactada enter o cliente e o servidor (MySQL Verso 3.22.3 ou posterior).
mysql_socket=/path/to/socket
Especifica o caminho do socket Unix que utilizado para se conectar ao servidor (MySQL
Verso 3.21.15 ou posterior).
Mliplos modificadores podem ser dados. Cada um deve ser precedido de ponto e vrgula.
Por exemplo, se voc quiser evitar colocar o nome de usurio e senha em um script DBI, voc
pode busc-los em um arquivo de opo ~/.my.cnf do usurio ao invs de escrever a sua chamada connect desta forma:
807
$dbh = DBI->connect("DBI:mysql:$database"
. ";mysql_read_default_file=$ENV{HOME}/.my.cnf",
$user, $password);
Esta chamado ir ler opes difinidas pelo grupo [client] no arquivo de opes. Se voc
quiser fazer a mesma coisa mas utilizar opes especificadas no grupo [perl], voc pode fazer:
$dbh = DBI->connect("DBI:mysql:$database"
. ";mysql_read_default_file=$ENV{HOME}/.my.cnf"
. ";mysql_read_default_group=perl",
$user, $password);
disconnect
O mtodo disconnect disconecta o manipulador de banco de dados do banco de dados. Ele
normalmente chamado pouco antes de voc sair do programa. Exemplo:
$rc = $dbh->disconnect;
prepare($statement)
Prepara uma instruo SQL para execuo pelo mecanismo de banco de dados e retorna um manipulador de instruo ($sth), que voc pode utilizar para chamar o mtodo execute.
Normalmente voc manipula a instruo SELECT (e instrues do tipo SELECT tais como
SHOW, DESCRIBE, e EXPLAIN) atravs de prepare e execute. Exemplo:
$sth = $dbh->prepare($statement)
or die "Can't prepare $statement: $dbh->errstr\n";
Se vo quiser ler grandes resultados em seu cliente, voc pode dizer ao Perl para utilizar
mysql_use_result() com:
my $sth = $dbh->prepare($statement { "mysql_use_result" => 1});
execute
O mtodo execute executa um instruo preparada. Para instruo no-SELECT, execute
retorna o nmero de linha afetadas. Se nenhuma linha foi afetada, execute retorna "0E0",
que o Perl trata como zero mas considera com true. Se um erro ocorrer, execute retorna undef. Para instrues SELECT, execute apenas inicia a consulta SQL no banco de dados; voc precisa utilizar um dos mtodos de fetch_* descritos aqui para recuperar dados. Exemplo:
$rv = $sth->execute
or die "can't execute the query: " . $sth->errstr;
do($statement)
O mtodo do prepara e executa uma instruo SQL e retorna o nmero linhas afetadas. Se nenhuma lina for afetada, do retorna "0E0", que o Perl trata como zero mas considera como true
808
(verdadeiro). Este mtodo geralmente usado por instrues no-SELECT que no podem ser
preparadas previamente (devida a limitaes do driver) ou que no precisa ser esecutada mais
que uma vez (inserts, deletes, etc.). Exemplo:
$rv = $dbh->do($statement)
or die "Can't execute $statement: $dbh- >errstr\n";
Geralamente a instruo 'do' mais rpida (e prefervel) que prepare/execute para instrues que
no contm parmetros.
quote($string)
O mtodo quote usada para "escapar" qualquer caracter especial contido na string e para adcionar as aspas necessrias na sada. Exemplo:
$sql = $dbh->quote($string)
fetchrow_array
Este mtodo busca a prxima linha de dados e a retorna como um vetor de valores de campo.
Exemplo:
while(@row = $sth->fetchrow_array) {
print qw($row[0]\t$row[1]\t$row[2]\n);
}
fetchrow_arrayref
Este mtodo busca a prxima linha de dados e a retorna como uma referncia a um vetor de valores de campos. Exemplo:
while($row_ref = $sth->fetchrow_arrayref) {
print qw($row_ref->[0]\t$row_ref->[1]\t$row_ref->[2]\n);
}
fetchrow_hashref
Este mtodo busca uma linha de dados e retorna uma referncia a uma tabela hash contendo pares nome de campos/valores. Este mtodo no to eficiente quanto utilizar referncias a vetor
como demostrado acima. Exemplo:
while($hash_ref = $sth->fetchrow_hashref) {
print qw($hash_ref->{firstname}\t$hash_ref->{lastname}\t\
$hash_ref->{title}\n);
}
fetchall_arrayref
Este mtodo usado para obter todos os dados (linhas) a serem retornados de uma instruo
SQL. Ele retorna uma referncia a um vetor de referncias a vetores para cada linha. Voc acessa ou imprime dados utilizando um loop aninhado. Exemplo:
my $table = $sth->fetchall_arrayref
or die "$sth->errstr\n";
my($i, $j);
for $i ( 0 .. $#{$table} ) {
809
for $j ( 0 .. $#{$table->[$i]} ) {
print "$table->[$i][$j]\t";
}
print "\n";
}
finish
Indica que mais nenhum dado ser buscado para este manipulador de instruo. Voc chama este mtodo para liberar o manipulador de instruo e qualquer recuros de sistema associado a ele.
Exemplo:
$rc = $sth->finish;
rows
Retorna o nmero de linhas alteradas (atualiadas, deletadas, etc.) pelo ltimo comando. Ele
normalmente utilizado aps uma instruo execute no-SELECT. Exemplo:
$rv = $sth->rows;
NULLABLE
Retorna uma referncia a um vetor de valores que indicam se colunas podem conter valores
NULL. Os valores possveis para cada element do vetor 0 ou uma string vazia se a coluna no
puder ser NULL, 1 se puder e 2 se a o estado NULL da coluna desconhecido. Exemplo:
$null_possible = $sth->{NULLABLE};
NUM_OF_FIELDS
este atributi indica o nmero de campos retornados pela instruo SELECT ou SHOW FIELDS.
Voc pode us-la para verificar se uma instruo retornou um resultado: Um valor zero indica
uma intruo no-SELECT como INSERT, DELETE, ou UPDATE. Exemplo:
$nr_of_fields = $sth->{NUM_OF_FIELDS};
data_sources($driver_name)
Este mtodo retorna um vetor contendo o nome dos bancos de dados disponveis no servidor
MySQL na mquina 'localhost'. Exemplo:
@dbs = DBI->data_sources("mysql");
ChopBlanks
Este atributo determina se o mtodo fetchrow_* ir apagar espaos em branco no inicio ou
no fim dos valores retornados. Exemplo:
$sth->{'ChopBlanks'} =1;
810
mysql_insertid
Se voc utilizar o recurso AUTO_INCREMENT do MySQL, os novos valores auto-increment sero armazenados aqui. Exemplo:
$new_id = $sth->{mysql_insertid};
Com verses antigas da interface DBI, voc pode usar $sth->{'insertid'}.
is_blob
Retorna uma referncia a um vetor de valores booleanos; para cada elemento do vetor, um valor
TRUE indica que a respectiva coluna um BLOB. Exemplo:
$keys = $sth->{is_blob};
is_key
Retorna um referncia a um vetor de valores booleanos; para cada elemento do vetor, um valor
de TRUE indica que a coluna respectiva uma chave. Exemplo:
$keys = $sth->{is_key};
is_num
Retorna uma referncia a um vetor de valores booleanos; para cada elemento do vetor, um valor
de TRUE indica que a coluna respectiva contm valores numricos. Exemplo:
811
$nums = $sth->{is_num};
is_pri_key
Retorna uma referncia a um vetor de valores booleanos; para cada elemento do vetor, um valor
de TRUE indica que a respectiva coluna uma chave primria. Exemplo:
$pri_keys = $sth->{is_pri_key};
is_not_null
Retorna uma referncia para um vetor de valores booleanos; para cada elemento do vetor, um
valor de FALSE indica que esta coluna pode conter valores NULL Exemplo:
$not_nulls = $sth->{is_not_null};
is_not_null est obsoleto; prefervel utilizar o atributo NULLABLE (descrito acima), porque ele um padro DBI.
length , max_length
Cada um destes mtodos retornam uma refercia a um vetor com tamanho de colunas. O vetor
length indica a tamanho mximo que cada coluna pode ter (como declarado na descrio da
tabela). O vetor max_length indica o tamanho mximo presente atualmente no resultado.
Exemplo:
$lengths = $sth->{length};
$max_lengths = $sth->{max_length};
NAME
Retorna um referncia a um vetor de nomes de colunas. Exemplo:
$names = $sth->{NAME};
table
Retorna um referncia a um vetor de nomes de tabelas. Exemplo:
$tables = $sth->{table};
type
Retorna uma referncia a um vetor com tipos de colunas. Exemplo:
$types = $sth->{type};
Voc pode utilizar o comando perldoc para conseguir mais informao sobre DBI.
perldoc DBI
perldoc DBI::FAQ
perldoc DBD::mysql
Vo tambm pode utilizar as ferramentas pod2man, pod2html, etc., para traduzir para outro formato.
Voc pode encontrar as ltimas informaes sobre DBI na pagina web DBI: http://dbi.perl.org/.
Voc pode utilizar bibliotecas MySQL estticas para Borland C++ que voc pode encontar em
http://www.mysql.com/downloads/os-win32.html.
S chame mysql_init() com NULL como um argumento, no uma struct MySQL prealocada.
813
Error Code
SQLSTATE
ER_HASHCHK
1000
HY000
ER_NISAMCHK
1001
HY000
ER_NO
1002
HY000
ER_YES
1003
HY000
ER_CANT_CREATE_FILE
1004
HY000
ER_CANT_CREATE_TABLE
1005
HY000
ER_CANT_CREATE_DB
1006
HY000
ER_DB_CREATE_EXISTS
1007
HY000
ER_DB_DROP_EXISTS
1008
HY000
ER_DB_DROP_DELETE
1009
HY000
ER_DB_DROP_RMDIR
1010
HY000
ER_CANT_DELETE_FILE
1011
HY000
ER_CANT_FIND_SYSTEM_REC
1012
HY000
ER_CANT_GET_STAT
1013
HY000
ER_CANT_GET_WD
1014
HY000
ER_CANT_LOCK
1015
HY000
ER_CANT_OPEN_FILE
1016
HY000
ER_FILE_NOT_FOUND
1017
HY000
ER_CANT_READ_DIR
1018
HY000
ER_CANT_SET_WD
1019
HY000
ER_CHECKREAD
1020
HY000
ER_DISK_FULL
1021
HY000
ER_DUP_KEY
1022
23000
814
ER_ERROR_ON_CLOSE
1023
HY000
ER_ERROR_ON_READ
1024
HY000
ER_ERROR_ON_RENAME
1025
HY000
ER_ERROR_ON_WRITE
1026
HY000
ER_FILE_USED
1027
HY000
ER_FILSORT_ABORT
1028
HY000
ER_FORM_NOT_FOUND
1029
HY000
ER_GET_ERRNO
1030
HY000
ER_ILLEGAL_HA
1031
HY000
ER_KEY_NOT_FOUND
1032
HY000
ER_NOT_FORM_FILE
1033
HY000
ER_NOT_KEYFILE
1034
HY000
ER_OLD_KEYFILE
1035
HY000
ER_OPEN_AS_READONLY
1036
HY000
ER_OUTOFMEMORY
1037
HY001
ER_OUT_OF_SORTMEMORY
1038
HY001
ER_UNEXPECTED_EOF
1039
HY000
ER_CON_COUNT_ERROR
1040
08004
ER_OUT_OF_RESOURCES
1041
08004
ER_BAD_HOST_ERROR
1042
08S01
ER_HANDSHAKE_ERROR
1043
08S01
ER_DBACCESS_DENIED_ERROR
1044
42000
ER_ACCESS_DENIED_ERROR
1045
42000
ER_NO_DB_ERROR
1046
42000
ER_UNKNOWN_COM_ERROR
1047
08S01
ER_BAD_NULL_ERROR
1048
23000
ER_BAD_DB_ERROR
1049
42000
ER_TABLE_EXISTS_ERROR
1050
42S01
ER_BAD_TABLE_ERROR
1051
42S02
ER_NON_UNIQ_ERROR
1052
23000
ER_SERVER_SHUTDOWN
1053
08S01
ER_BAD_FIELD_ERROR
1054
42S22
ER_WRONG_FIELD_WITH_GROUP
1055
42000
ER_WRONG_GROUP_FIELD
1056
42000
ER_WRONG_SUM_SELECT
1057
42000
ER_WRONG_VALUE_COUNT
1058
21S01
ER_TOO_LONG_IDENT
1059
42000
ER_DUP_FIELDNAME
1060
42S21
ER_DUP_KEYNAME
1061
42000
ER_DUP_ENTRY
1062
23000
ER_WRONG_FIELD_SPEC
1063
42000
ER_PARSE_ERROR
1064
42000
ER_EMPTY_QUERY
1065
42000
ER_NONUNIQ_TABLE
1066
42000
ER_INVALID_DEFAULT
1067
42000
815
ER_MULTIPLE_PRI_KEY
1068
42000
ER_TOO_MANY_KEYS
1069
42000
ER_TOO_MANY_KEY_PARTS
1070
42000
ER_TOO_LONG_KEY
1071
42000
ER_KEY_COLUMN_DOES_NOT_EXITS
1072
42000
ER_BLOB_USED_AS_KEY
1073
42000
ER_TOO_BIG_FIELDLENGTH
1074
42000
ER_WRONG_AUTO_KEY
1075
42000
ER_READY
1076
00000
ER_NORMAL_SHUTDOWN
1077
00000
ER_GOT_SIGNAL
1078
00000
ER_SHUTDOWN_COMPLETE
1079
00000
ER_FORCING_CLOSE
1080
08S01
ER_IPSOCK_ERROR
1081
08S01
ER_NO_SUCH_INDEX
1082
42S12
ER_WRONG_FIELD_TERMINATORS
1083
42000
ER_BLOBS_AND_NO_TERMINATED
1084
42000
ER_TEXTFILE_NOT_READABLE
1085
HY000
ER_FILE_EXISTS_ERROR
1086
HY000
ER_LOAD_INFO
1087
HY000
ER_ALTER_INFO
1088
HY000
ER_WRONG_SUB_KEY
1089
HY000
ER_CANT_REMOVE_ALL_FIELDS
1090
42000
ER_CANT_DROP_FIELD_OR_KEY
1091
42000
ER_INSERT_INFO
1092
HY000
ER_UPDATE_TABLE_USED
1093
HY000
ER_NO_SUCH_THREAD
1094
HY000
ER_KILL_DENIED_ERROR
1095
HY000
ER_NO_TABLES_USED
1096
HY000
ER_TOO_BIG_SET
1097
HY000
ER_NO_UNIQUE_LOGFILE
1098
HY000
ER_TABLE_NOT_LOCKED_FOR_WRITE
1099
HY000
ER_TABLE_NOT_LOCKED
1100
HY000
ER_BLOB_CANT_HAVE_DEFAULT
1101
42000
ER_WRONG_DB_NAME
1102
42000
ER_WRONG_TABLE_NAME
1103
42000
ER_TOO_BIG_SELECT
1104
42000
ER_UNKNOWN_ERROR
1105
HY000
ER_UNKNOWN_PROCEDURE
1106
42000
ER_WRONG_PARAMCOUNT_TO_PROCEDURE
1107
42000
ER_WRONG_PARAMETERS_TO_PROCEDURE
1108
HY000
ER_UNKNOWN_TABLE
1109
42S02
ER_FIELD_SPECIFIED_TWICE
1110
42000
ER_INVALID_GROUP_FUNC_USE
1111
42000
ER_UNSUPPORTED_EXTENSION
1112
42000
816
ER_TABLE_MUST_HAVE_COLUMNS
1113
42000
ER_RECORD_FILE_FULL
1114
HY000
ER_UNKNOWN_CHARACTER_SET
1115
42000
ER_TOO_MANY_TABLES
1116
HY000
ER_TOO_MANY_FIELDS
1117
HY000
ER_TOO_BIG_ROWSIZE
1118
42000
ER_STACK_OVERRUN
1119
HY000
ER_WRONG_OUTER_JOIN
1120
42000
ER_NULL_COLUMN_IN_INDEX
1121
42000
ER_CANT_FIND_UDF
1122
HY000
ER_CANT_INITIALIZE_UDF
1123
HY000
ER_UDF_NO_PATHS
1124
HY000
ER_UDF_EXISTS
1125
HY000
ER_CANT_OPEN_LIBRARY
1126
HY000
ER_CANT_FIND_DL_ENTRY
1127
HY000
ER_FUNCTION_NOT_DEFINED
1128
HY000
ER_HOST_IS_BLOCKED
1129
HY000
ER_HOST_NOT_PRIVILEGED
1130
HY000
ER_PASSWORD_ANONYMOUS_USER
1131
42000
ER_PASSWORD_NOT_ALLOWED
1132
42000
ER_PASSWORD_NO_MATCH
1133
42000
ER_UPDATE_INFO
1134
HY000
ER_CANT_CREATE_THREAD
1135
HY000
ER_WRONG_VALUE_COUNT_ON_ROW
1136
21S01
ER_CANT_REOPEN_TABLE
1137
HY000
ER_INVALID_USE_OF_NULL
1138
42000
ER_REGEXP_ERROR
1139
42000
ER_MIX_OF_GROUP_FUNC_AND_FIELDS
1140
42000
ER_NONEXISTING_GRANT
1141
42000
ER_TABLEACCESS_DENIED_ERROR
1142
42000
ER_COLUMNACCESS_DENIED_ERROR
1143
42000
ER_ILLEGAL_GRANT_FOR_TABLE
1144
42000
ER_GRANT_WRONG_HOST_OR_USER
1145
42000
ER_NO_SUCH_TABLE
1146
42S02
ER_NONEXISTING_TABLE_GRANT
1147
42000
ER_NOT_ALLOWED_COMMAND
1148
42000
ER_SYNTAX_ERROR
1149
42000
ER_DELAYED_CANT_CHANGE_LOCK
1150
HY000
ER_TOO_MANY_DELAYED_THREADS
1151
HY000
ER_ABORTING_CONNECTION
1152
08S01
ER_NET_PACKET_TOO_LARGE
1153
08S01
ER_NET_READ_ERROR_FROM_PIPE
1154
08S01
ER_NET_FCNTL_ERROR
1155
08S01
ER_NET_PACKETS_OUT_OF_ORDER
1156
08S01
ER_NET_UNCOMPRESS_ERROR
1157
08S01
817
ER_NET_READ_ERROR
1158
08S01
ER_NET_READ_INTERRUPTED
1159
08S01
ER_NET_ERROR_ON_WRITE
1160
08S01
ER_NET_WRITE_INTERRUPTED
1161
08S01
ER_TOO_LONG_STRING
1162
42000
ER_TABLE_CANT_HANDLE_BLOB
1163
42000
ER_TABLE_CANT_HANDLE_AUTO_INCREMENT
1164
42000
ER_DELAYED_INSERT_TABLE_LOCKED
1165
HY000
ER_WRONG_COLUMN_NAME
1166
42000
ER_WRONG_KEY_COLUMN
1167
42000
ER_WRONG_MRG_TABLE
1168
HY000
ER_DUP_UNIQUE
1169
23000
ER_BLOB_KEY_WITHOUT_LENGTH
1170
42000
ER_PRIMARY_CANT_HAVE_NULL
1171
42000
ER_TOO_MANY_ROWS
1172
42000
ER_REQUIRES_PRIMARY_KEY
1173
42000
ER_NO_RAID_COMPILED
1174
HY000
ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE
1175
HY000
ER_KEY_DOES_NOT_EXITS
1176
HY000
ER_CHECK_NO_SUCH_TABLE
1177
42000
ER_CHECK_NOT_IMPLEMENTED
1178
42000
ER_CANT_DO_THIS_DURING_AN_TRANSACTION
1179
25000
ER_ERROR_DURING_COMMIT
1180
HY000
ER_ERROR_DURING_ROLLBACK
1181
HY000
ER_ERROR_DURING_FLUSH_LOGS
1182
HY000
ER_ERROR_DURING_CHECKPOINT
1183
HY000
ER_NEW_ABORTING_CONNECTION
1184
08S01
ER_DUMP_NOT_IMPLEMENTED
1185
HY000
ER_FLUSH_MASTER_BINLOG_CLOSED
1186
HY000
ER_INDEX_REBUILD
1187
HY000
ER_MASTER
1188
HY000
ER_MASTER_NET_READ
1189
08S01
ER_MASTER_NET_WRITE
1190
08S01
ER_FT_MATCHING_KEY_NOT_FOUND
1191
HY000
ER_LOCK_OR_ACTIVE_TRANSACTION
1192
HY000
ER_UNKNOWN_SYSTEM_VARIABLE
1193
HY000
ER_CRASHED_ON_USAGE
1194
HY000
ER_CRASHED_ON_REPAIR
1195
HY000
ER_WARNING_NOT_COMPLETE_ROLLBACK
1196
HY000
ER_TRANS_CACHE_FULL
1197
HY000
ER_SLAVE_MUST_STOP
1198
HY000
ER_SLAVE_NOT_RUNNING
1199
HY000
ER_BAD_SLAVE
1200
HY000
ER_MASTER_INFO
1201
HY000
ER_SLAVE_THREAD
1202
HY000
818
ER_TOO_MANY_USER_CONNECTIONS
1203
42000
ER_SET_CONSTANTS_ONLY
1204
HY000
ER_LOCK_WAIT_TIMEOUT
1205
HY000
ER_LOCK_TABLE_FULL
1206
HY000
ER_READ_ONLY_TRANSACTION
1207
25000
ER_DROP_DB_WITH_READ_LOCK
1208
HY000
ER_CREATE_DB_WITH_READ_LOCK
1209
HY000
ER_WRONG_ARGUMENTS
1210
HY000
ER_NO_PERMISSION_TO_CREATE_USER
1211
42000
ER_UNION_TABLES_IN_DIFFERENT_DIR
1212
HY000
ER_LOCK_DEADLOCK
1213
40001
ER_TABLE_CANT_HANDLE_FULLTEXT
1214
HY000
ER_CANNOT_ADD_FOREIGN
1215
HY000
ER_NO_REFERENCED_ROW
1216
23000
ER_ROW_IS_REFERENCED
1217
23000
ER_CONNECT_TO_MASTER
1218
08S01
ER_QUERY_ON_MASTER
1219
HY000
ER_ERROR_WHEN_EXECUTING_COMMAND
1220
HY000
ER_WRONG_USAGE
1221
HY000
ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT
1222
21000
ER_CANT_UPDATE_WITH_READLOCK
1223
HY000
ER_MIXING_NOT_ALLOWED
1224
HY000
ER_DUP_ARGUMENT
1225
HY000
ER_USER_LIMIT_REACHED
1226
42000
ER_SPECIFIC_ACCESS_DENIED_ERROR
1227
HY000
ER_LOCAL_VARIABLE
1228
HY000
ER_GLOBAL_VARIABLE
1229
HY000
ER_NO_DEFAULT
1230
42000
ER_WRONG_VALUE_FOR_VAR
1231
42000
ER_WRONG_TYPE_FOR_VAR
1232
42000
ER_VAR_CANT_BE_READ
1233
HY000
ER_CANT_USE_OPTION_HERE
1234
42000
ER_NOT_SUPPORTED_YET
1235
42000
ER_MASTER_FATAL_ERROR_READING_BINLOG
1236
HY000
ER_SLAVE_IGNORED_TABLE
1237
HY000
ER_WRONG_FK_DEF
1238
42000
ER_KEY_REF_DO_NOT_MATCH_TABLE_REF
1239
HY000
ER_CARDINALITY_COL
1240
21000
ER_SUBSELECT_NO_1_ROW
1241
21000
ER_UNKNOWN_STMT_HANDLER
1242
HY000
ER_CORRUPT_HELP_DB
1243
HY000
ER_CYCLIC_REFERENCE
1244
HY000
ER_AUTO_CONVERT
1245
HY000
ER_ILLEGAL_REFERENCE
1246
42S22
ER_DERIVED_MUST_HAVE_ALIAS
1247
42000
819
ER_SELECT_REDUCED
1248
01000
ER_TABLENAME_NOT_ALLOWED_HERE
1249
42000
ER_NOT_SUPPORTED_AUTH_MODE
1250
08004
ER_SPATIAL_CANT_HAVE_NULL
1251
42000
ER_COLLATION_CHARSET_MISMATCH
1252
42000
ER_SLAVE_WAS_RUNNING
1253
HY000
ER_SLAVE_WAS_NOT_RUNNING
1254
HY000
ER_TOO_BIG_FOR_UNCOMPRESS
1255
HY000
ER_ZLIB_Z_MEM_ERROR
1256
HY000
ER_ZLIB_Z_BUF_ERROR
1257
HY000
ER_ZLIB_Z_DATA_ERROR
1258
HY000
ER_CUT_VALUE_GROUP_CONCAT
1259
HY000
ER_WARN_TOO_FEW_RECORDS
1260
01000
ER_WARN_TOO_MANY_RECORDS
1261
01000
ER_WARN_NULL_TO_NOTNULL
1262
01000
ER_WARN_DATA_OUT_OF_RANGE
1263
01000
ER_WARN_DATA_TRUNCATED
1264
01000
ER_WARN_USING_OTHER_HANDLER
1265
01000
ER_CANT_AGGREGATE_COLLATIONS
1266
42000
ER_DROP_USER
1267
42000
ER_REVOKE_GRANTS
1268
42000
ER_CANT_AGGREGATE_3COLLATIONS
1269
42000
ER_CANT_AGGREGATE_NCOLLATIONS
1270
42000
ER_VARIABLE_IS_NOT_STRUCT
1271
HY000
ER_UNKNOWN_COLLATION
1272
HY000
ER_SLAVE_IGNORED_SSL_PARAMS
1273
HY000
ER_SERVER_IS_IN_SECURE_AUTH_MODE
1274
HY000
ER_WARN_FIELD_RESOLVED
1275
HY000
ER_BAD_SLAVE_UNTIL_COND
1276
HY000
ER_MISSING_SKIP_SLAVE
1277
HY000
ER_UNTIL_COND_IGNORED
1278
HY000
820
A thread da conexo TCP/IP trata todas as requisies de conexo e cria uma nova thread dedicada para tratar a autenticao e consulta SQL processada por cada conexo.
No Windows NT existe um thread que trata named pipe que fazem o mesmo trabalho que as threads da conexo TCP/IP em pedidos de conexo de named pipe.
A thread de sinal trata todos os sinais. Esta thread tambm trata normalmente de alarmes e chamadas process_alarm() para forar um tempo limite em conexes que tm estado parados
por um tempo grande.
Se o mysqld compilado com -DUSE_ALARM_THREAD, uma thread dedicada que trata dos
alarmes criada. Ela s utilizadas em alguns sistemas onde h problemas com sigwait()
ou se deseja utilizar o cdigo thr_alarm() em aplicaes sem uma thread dedicada para tratar sianis.
Se utilizada a opo --flush_time=#, uma thread dedicada criada para descarregar todas
as tabelas em um dado intervalo.
Cada tabela diferente na qual utilizada INSERT DELAYED tem sua prpria thread.
Se voc quiser utilizar --master-host, uma thread de replicao slave ser iniciada para ler
e aplicar atualizaes do master.
Estendendo o MySQL
Windows usando um ambiente Cygwin. Eles no podem ser executados em um ambiente Windows
nativo.
O conjunto de testes de atual no testa tudo no MySQL, mas deve pegar os bugs mais bvios no cdigo de processamento SQL, detalhes de SO/biblioteca, e bem compleo em teste de replicaes.
Nosso objetivo eventual ter os testes cobrindo 100% do cdigo. Contibuies para o nosso pacote
de teste so benvindas. Voc pode desejar contribuir com testes que examinam a funcionalidade critica ao seu sistema, o que ir assegurar que todas as futuras verses do MySQL iro funcionar bem
com suas aplicaes.
Todas as consultas que produzem resultadosex., SELECT, SHOW, EXPLAIN, etc., devem ser
precedidas com @/path/to/result/file. O arquivo deve conter os resultados esperados.
Um modo fcil de gerar o arquivo resultante executar mysqltest -r < t/
test-case-name.test do diretrio mysql-test, e ento editar o arquivo resultante gerado e, se necessrio, ajust-los a sada esperada. Neste caso, tenha cuidado de no adicionar ou
deletar quaisquer caracteres invisveis - tenha certeza de apenas alterar o texto e/ou adicionar linhas deletadas. Se voc tiver que inserir uma linha, esteja certo que os campos so separados
com tabulao e que h uma tabulao no final. Voc pode querer utilizar od -c para ter certeza que seu editor de texto no bagunu nada durante a edio. Ns, claro, esperamos que voc
nunca tenha que editar a sada de mysqltest -r j que voc s dever faz-lo quando encontra um bug.
Para estar consistente com a nossa configurao, voc deve colocar seus arquivos de resultados
no diretrio mysql-test/r e o nomeie como test_name.result. Se o teste produzir
mais de um resultado, voc deve usar test_name.a.result, test_name.b.result,
etc.
Se uma instruo retornar um erro, voc eve espacificar na linha anterior a instruo com 822
Estendendo o MySQL
-error error-number. O nmero do erro pode ser uma lista de nmeros de erros possveis
separados com ','.
Se voc estiver escrevendo em teste de replicao, voc deve coloca source include/master-slave.inc; na primeira linha do arquivo. Para trocar entre master e slave, utilize connection master; e connection slave;. se voc precisar fazer alguma coisa em uma
conexo alternativa, voc pode fazer connection master1; para o master e connection slave1; para o slave.
Se voc precisar fazer alguma coisa em um loop, voc pode usar algo assim:
let $1=1000;
while ($1)
{
# do your queries here
dec $1;
}
Para 'dormir' entre consultas, use o comando sleep. Ele suporta fraes de um segundo, assim
voc pode fazer sleep 1.3;, por exemplo, para dormir 1.3 segundos.
Para executar o slave com opes adicionais para o seu caso de teste, coloque-os na formato de
linha de comando mysql-test/t/test_name-slave.opt. Para o master, coloque-os
em mysql-test/t/test_name-master.opt.
Se voc tiver uma questo sobre o pacote de testes, ou tiver um caso de teste para contribuir, envie um e-mail para lista de email ``internals'' do MySQL. See Seco 1.7.1.1, As Listas de Discusso do MySQL. Como a lista no aceita anexos, voc deve utilizar o ftp para enviar os arquivos relevantes: ftp://support.mysql.com/pub/mysql/Incoming/
No envie um relatrio de bug antes de ter feito tudo possvel para encontrar o que esta errado!
Quando o fizer, por favor, utilize o script mysqlbug assim podemoster informaes sobre o
seu sistema e a verso do MySQL. See Seco 1.7.1.3, Como relatar erros ou problemas.
Esteja certo de inluir a sada de mysql-test-run, assim como o contedoi de todos os arquivos .reject no diretrio mysql-test/r.
Se um pacote de teste falhar, verifique se o teste tambm falha quando executado sozinho:
cd mysql-test
mysql-test-run --local test-name
Se falhar, voc deve configurar o MySQL com --with-debug e executar mysqltest-run com a opo --debug. Se into tambm falhar envie o arquivo de rastreamento
var/tmp/master.trace para ftp://support.mysql.com/pub/mysql/secret assim ns podemos examin-los. Por favor, se lembre de tambm incluir uma descrio completa do seu sistema, a verso do binrio do mysqld e como voc o compilou.
Tente tambm executar mysql-test-run com a opo --force para ver se h qualquer
outro teste que tenha falhado.
Se voc prprio compilou o MySQL, verifique nosso manual sobre como compilar o MySQL na
sua platforma ou, de preferncia, use um dos binrios que ns compilamos para voc no
http://www.mysql.com/downloads/. Todos os seus binrios padres devem passar no pacote de
teste!
823
Estendendo o MySQL
Se voc obter um erro, como Result length mismatch ou Result content mismatch, significa que a sada do teste no igual a sada esperada. Este pode ser um bug no
MySQL ou que o seu verso do mysqld produz resultados um pouco diferentes sobre certas circuntncias.
Resultado de testes que falharam so colocados em um arquivo com o mesmo nome base que o
arquivo de resultado com a extenso .reject. Se o seu caso de teste est falhando, voc deve
fazer um diff nos dois arquivos. Se voc no puder ver como els so diferentes, examine ambos
com od -c e tamb verifique os seus tamanhos.
Se um teste falhar totalmente, voc deve verificar os arquivos de log no diretrio mysqltest/var/log para avisos sobre o que deu errado.
Se voc tiver compilado o MySQL com depurao voc pode tentar depur-lo executando
mysql-test-run com a opes --gdb e/ou --debug. See Seco E.1.2, Criando Arquivos Trace (Rastreamento).
Se voc no tiver compilado o MySQL com depurao voc deve, provavelmente, faz-lo. Apenas especifique a opo --with-debug no configure! See Seco 2.3, Instalando uma
distribuio com fontes do MySQL.
Voc pode adicionar novas funes atravs da interface de funes definidas por usurios - userdefinable function (UDF). Funes definidas por usurios so adicionadas e removidas dinamicamente usando as instrues CREATE FUNCTION e DROP FUNCTION. See Seco 14.2.1,
Sintaxe CREATE FUNCTION/DROP FUNCTION.
Voc pode adicionar as funes como uma funo nativa do MySQL. Funes nativas so compiladas no servidor mysqld e ficam disponveis em uma base permanente.
Se voc escreve uma funo definida pelo usurio, voc deve instalar o arquivo objeto no seu
servidor. Se voc compilou a sua funo dentro do servidor voc no precisar fazer isto.
Voc pode adicionar UDFs para um distribuio binria MySQL. Funes nativas exigem que
voc modifique a sua distribuio fonte.
Se voc atualizar a sua ditribuio MySQL, voc pode continuar a usar a sua UDF previamente
instalada. Para funes nativas, voc deve repetir as suas modificaes a cada vez que voc atualizar.
Seja qual for o mtodo que voc utilizou para adicionar novas funes, eles podem ser usados como
funes nativas tais como ABS() ou SOUNDEX().
Estendendo o MySQL
CONCAT().
AGGREGATE uma nova opo do MySQL Verso 3.23. Uma funo AGGREGATE funciona exatamente como uma funo GROUP nativa do MySQL como SUM ou COUNT().
CREATE FUNCTION salva o nome e o tipo da funo e o nome da biblioteca compartilhada na tabela do sistema mysql.func. Voc deve ter privilgios INSERT e DELETE no banco de dados
mysql para criar e deletar funes.
Todas as funes ativas so recarregadas a cada vez que o servidor reiniciado, a menos que voc
reinicie o mysqld com a opo --skip-grant-tables. Neste caso, a inicializao de UDF
ignorada e as UDFs esto indisponveis. (Uma funo ativa aquela que foi carregada com CREATE
FUNCTION e no foi removida com DROP FUNCTION.)
Para instrues sobre como escrever funes denidas por usurios, veja Seco 14.2, Adicionando
Novas Funes ao MySQL. Para o mecanisnmo UDF funcionar, as funes dever ser escritas em C
ou C++, seu sistema operacional deve suporta carregamento dinmico e voc deve compilar o
mysqld dinamicamente (e no estaticamente).
Note que para fazer AGGREGATE funcioanr, voc deve ter uma tabela mysql.func que contm a
coluna type. Se voc no tem esta tabela, voc deve executar o script
mysql_fix_privilege_tables para cri-la.
xxx() (exigido)
A funo principal. onde o resultado da funo computado. A correspondncia entre o tipo
SQL e o tipo retornado da sua funo C/C++ mostrada aqui:
Tipo SQL
Tipo C/C++
STRING
char *
INTEGER
long long
REAL
double
825
Estendendo o MySQL
xxx_init() (opcional)
A funo de inicializao para xxx(). Ela pode ser usada para:
xxx_deinit() (opicional)
A funo de finalizao para xxx(). Ela deve liberar qualquer memria alocada pela funo de
inicializao.
Quando uma instruo SQL invoka XXX(), o MySQL chama a funo de inicializao
xxx_init() para realizar qualquer configurao necessria, tais como verificao de argumentos
e alocao de memria. Se xxx_init() retorna um erro, a instruo SQL abortada com uma
mensagem e as funes principais e de finalizao no so chamadas. Seno, a funo principal
xxx() chamada uma vez para cada linha. Depois de todas as linhas tiverem sido processadas, a
funo de finalizao xxx_deinit() chamada, podendo assim realizar qualquer 'limpeza'.
Para funes agregadas (como SUM()), voc tambm deve fornecer as seguintes funes:
xxx_reset() (exigida)
Zera a soma e insere um argumento como o valor inicial para um novo grupo.
xxx_add() (exigida)
Adiciona o argumento a soma antiga.
Chama xxx_init() para deixar funes agregadas alocarem a memria necessria para armazenar os resultados.
2.
3.
4.
Para cada nova linha que pertence ao mesmo grupo, chame a funo xxx_add().
5.
Quando o grupo muda ou depois da ltima linha ter sido processada, chame xxx() para obter
o resultado para o conjunto.
6.
7.
Todas as funes devem ser seguras com thread (no apenas a funo principal, mas tambm as funes de inicializao e finalizao). Isto significa que voc no tem permisso para alocar qualquer
826
Estendendo o MySQL
varivel global ou esttica que alterou! Se voc precisa de memria, voc deve aloc-la em
xxx_init() e liber-la em xxx_deinit().
my_bool maybe_null
xxx_init() deve definir maybe_null com 1 se xxx() pode retornar NULL. O valor padro 1 se qualquer um dos argumentos so declarados como maybe_null.
char *ptr
827
Estendendo o MySQL
Um ponteiro que a funo pode usar para o seus propsitos. Por exemplo, funes pode usar
initid->ptr para comunicar memrias alocadas entre funes. Na xxx_init(), aloca a
memria e a atribui a este ponteiro:
initid->ptr = allocated_memory;
Em xxx() e xxx_deinit(), se refira a initid->ptr para usar ou liberar a memria.
828
Estendendo o MySQL
char **args
args->args informa a funo de inicializao sobre a natureza geral dos argumentos chamados com sua funo. Para um argumento constante i, args->args[i] aponta para o valor do
argumento. (Veja abaixo sobre instrues de como acessar o valor de forma apropriada). Para
um argumento no constante, args->args[i] 0. Um argumento constante uma expresso
uma expresso que utiliza apenas constante, tais como 3 ou 4*7-2 ou SIN(3.14). Um argumento no constante uma expresso que refere a valores que podem alterar a cada linha, tais
como nomes de coluna ou funes que so chamadas com argumentos no contantes.
829
Estendendo o MySQL
Para cada chamada da funo principal, args->args contm os argumentos atuais que so
passados pela linhas sendo processadas atualmente.
As funes podem se referir a um argumento i como a seguir:
Um argumento do tipo STRING_RESULT dado como um apontador string mais um tamanho, para permitir o tratamento de dados binrios de tamanho arbitrrio. Os contedo da
string esto disponveis como args->args[i] e o tamanho da string args>lengths[i]. Voc no deve assumir aue as strings so terminadas em null.
830
Estendendo o MySQL
*is_null = 1;
Para indicar um erro retornado na funo principal, atribua 1 ao parmetro error:
*error = 1;
Se xxx() definir *error com 1 para qualquer linha, o valor da funo NULL para a linha atual
e qualquer linha subsequente processada pela instruo na qual XXX() foi chamado. (xxx() nem
mesmo ser chamado para linhas subsequentes.) Nota: na verso do MySQL anterior a 3.22.10, voc deve configurar *error e *is_null:
*error = 1;
*is_null = 1;
metaphon() retorna uma string metafonica do argumento string. Ela algo como uma string
soundex, mas mais voltada para o ingls.
myfunc_double() retorna a soma de valores ASCII de caracteres e seus argumentos, dividido pela soma de tamanho de seus argumentos.
reverse_lookup() retorna o nome de mauina para um nmero IP. A funo pode ser chamada com uma string "xxx.xxx.xxx.xxx" ou quatro nmeros.
A arquivo carregvel dinamicamente deve ser compilado como um arquivo objeto compartilhvel
usando um comando como este:
shell> gcc -shared -o udf_example.so myfunc.cc
Voc pode encontrar facilmente as opes de compilador corretas para seu sistema executando este
comando no diretrio sql da sua rvore de fonte MySQL:
shell> make udf_example.o
Voc deve executar comando de compilador similar quele que o make mostra, exceto que voc deve remover a opo -c prxima ao fim da linha e adicionar -o udf_example.so. (Em alguns
sistemas voc pode precisar deixar o comando -c.)
Uma vez que voc tenha compilado um objeto compartilhado contendo UDFs, voc deve instal-lo
e avisar o MySQL sobre ele. Compilar um objeto compartilhado de udf_example.cc produz um
arquivo com nome parecido com udf_example.so (o nome exato pode variar de plataforma para
plataforma). Copie este arquivo para algum diretrio procurado com o ligador dinmico ld, tal como /usr/lib ou adicione o diretrio no qual voc colocou o objeto compartilhado ao arquivo de
configurao do ligador (e.g. /etc/ld.so.conf).
831
Estendendo o MySQL
CREATE
CREATE
CREATE
CREATE
CREATE
DROP
DROP
DROP
DROP
DROP
DROP
FUNCTION
FUNCTION
FUNCTION
FUNCTION
FUNCTION
FUNCTION
metaphon;
myfunc_double;
myfunc_int;
lookup;
reverse_lookup;
avgcost;
Adicionr uma linha a lex.h que defina o nome da funo no vetor sql_functions[].
2.
Na funo prottipo simples (utilize apenas zero, um, dois ou trs argumentos), voc deve especificar SYM(FUNC_ARG#) em lex.h (onde # o nmero de argumentos) como o segundo
argumento no vetor sql_functions[] e adicionar uma funo que cria um objeto de funo em item_create.cc. De uma olhada em "ABS" e create_funcs_abs() para um
exemplo disto.
Se o prottipo da funo for complicado (por exemplo, tiver um nmero varivel de argumentos), voc deve adicionar duas linhas a sql_yacc.yy. Uma indica o smbolo pre-processador
832
Estendendo o MySQL
que o yacc deve difinir (isto deve ser adicionado no comeo do arquivo). Ento defina os parmetros da funo e adicione um ``item'' com estes parmetros a regra simple_expr do
analizador. Por exemplo, verifique todas as acorrncias de ATAN em sql_yacc.yy para ver
como ele feito.
3.
ou
4.
Em item_func.cc, adicione uma das seguintes declaraes, dependendo se voc est definindo uma funo numrica ou string:
double
Item_func_newname::val()
longlong Item_func_newname::val_int()
String *Item_func_newname::Str(String *str)
Se voc herdar seu objeto de qualquer um dos itens padres (como Item_num_func), voc
provavelmente s dever definir uma das funes acima e deixar os objetos pais cuidar das outras funes. Por exemplo, a classe Item_str_func define uma funo val() que executa
atof() no valor retornado por ::str().
5.
Todas as funes devem ser seguras com thread (em outras palavras, no utilize qualquer varivel
global ou esttica nas funes sem protege-las com mutexes).
Se voc retornar NULL, de ::val(), ::val_int() ou ::str() voc deve definir
null_value com 1 e retornar 0.
Para funes objetos ::str(), existem algumas consideraes adicionais das quais voc deve estar ciente:
O arguemto String *str fornece um buffer string que pode ser utilizado para guardar o resultado. (Para mais informaes sobre o tipo String, d uma olhada no arquivo
sql_string.h.)
A funo ::str() deve retornar a string que guarda o resultado ou (char*) 0 se o resultado NULL.
Todas as funes string atuais tentam evitar a alocao de memria a menos que seja absolutamente necessrio!
Estendendo o MySQL
Adicionalmente recomendamos que voc de uma olhada em mylua. Com isto voc pode utilizar a
linguagem LUA para carregar um procedimento em tempo de execuo no mysqld.
max elements (padro 256) o nmero mximo de valores distintos que analyse notificar por coluna. Isto utilizado por analyse para verificar se o tipo timo da coluna deve ser do
tipo ENUM.
max memory (padro 8192) a memria mxima que analyse deve alocar por coluna enquanto tenta encontrar todos os valores distintos.
SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]])
sql/sql_analyse.cc
sql/procedure.h
sql/procedure.cc
sql/sql_select.cc
834
Apndice
Comuns
A.
Problemas
Erros
Este captulo lista alguns problemas e mensagens de erro comuns que os usurios encontram. Voc
aprender como entender o problema e o que fazer para resolv-lo. Voc tambm encontrar solues apropriadas para alguns prblemas comuns.
Se voc tiver um dos seguintes sintomas, ento provavel que haja um problema de hardware
(como memria, placa me, CPU ou disco rgido) ou kernel:
O teclado no funciona. Isto normalmente pode ser verificado pressionando CAPS LOCK.
Se a luz do CAPS LOCK no alterar, voc dever trocar o seu teclado. (Antes de fazer isto,
voc deve tentar reiniciar o seu computador e verificar todos os cabos do teclado.)
Se o seu sistema reiniciar inesperadamente (um programa de nvel do usurio nunca deve finalizar o seu sistema).
Neste caso voc deve inciar verificando todos os seus cabos e executando alguma ferramenta de
diagnstico para verificar o seu hardware. Voc tambm deve verificar se existem patches, atualizaes ou service packs para o seu sistema operacional que poderiam resolver o seu problema.
Verifique tambm que todas as suas bibliotecas (como glibc) esto atualizadas.
Sempre bom usar uma mquina com memria ECC para descobrir problemas de memria antecipadamente.
Se o seu teclado est travado, voc deve estar apto a consert-lo logando em sua mquina a partir de outra mquina e executando kbd_mode -a nela.
Por favor, examine o seu arquivo de log do sistema (/var/log/messages ou similar) procurando
pela razo de seus problemas. Se voc acha que o problema est no MySQL ento voc deve
examinar o arquivo de log do MySQL. See Seco 4.10.4, O Log Binrio.
Se voc acha que voc no tem problema de hardware, voc deve tentar encontrar qual o programa que est causando problemas.
Tente usar top, ps, taskmanager, ou algum programa parecido, para verificar qual programa est utilizando toda a CPU oui travando a mquina.
Verifique com top, df, ou um programa similar se voc excedeu a quantidade de memria, espao em disco, arquivos abertos ou algum outro recurso crtico.
Se o problema algum processo em execuo, voc sempre pode tentar mat-lo. Se ele no quiser morrer, provavelmente h um bug em seu sistema operacional.
835
Se depois de voc examinar todas as outras possibilidades e voc tiver concludo que o cliente
MySQL ou o servidor MySQL que est causando problemas, hora de fazer um relatrio de erro
para a nossa lista de emails ou nossa equipe de suporte. No relatrio de erro, tente dar uma descrio
bem detalhada de como o sistema se comporta e o que voc acha que est acontecendo. Voc tambm deve dizer porque voc acha que o MySQL que esta causando problemas. Lev em considerao todas as situaes neste captulo. Indique qualquer problema exatamente como ele aparece
quando voc examina o seu sistema. Use o mtodo 'cortar e colar' para qualquer sada e/ou mensagem de erro do programa e/ou arquivos de log!
Tente descrever em detalhes qual programa no est funcionando e todos os sintomas que voc v!
Ns recebemos muitos relatrios de erros que apenas indicavam "o sistema no funciona". Isto no
nos fornece qualquer informao sobre o que poderia ser o problema.
Se um programa falhar, sempre til saber:
O program aesta consumindo toda a CPU? Verifique com top. Deixe o programa rodar por um
tempo. Ele pode estar avaliando algo pesado.
Se o servidor mysqld que est causando problemas, voc pode fazer um mysqladmin -u
root ping ou mysqladmin -u root processlist?
O que o progrma cliente diz (tente com mysql, por exemplo) quando voc tenta conectar ao
servidor MySQL? O cliente travou? Voc obteve qualquer sada do programa?
Quando enviar um relatrio de erro, voc deve seguir o que descrito neste manual. See Seco 1.7.1.2, Fazendo perguntas ou relatando erros.
836
Cdigo de erro
Descrio
CR_SERVER_GONE_ERROR
CR_SERVER_LOST
Voc tambm ir obter este erro se algum tiver matado a thread em execuo com kill
#threadid#.
Voc pode verificar que o MySQL no morreu executando mysqladmin version e examinando o tempo em execuo. Se o problema que o mysqld falhou voc deve descobrir a razo da falha. Voc deve neste caso iniciar verificando se executar a consulta novamente ir finalizar o
MySQL novamente. See Seco A.4.1, O Que Fazer Se o MySQL Continua Falhando.
Voc tambm pode obter estes erros se voc enviar uma consulta incorreta ou muito grande ao servidor. Se mysqld recebe um pacote muito grande ou fora de ordem. ele assume que alguma coisa
saiu errado com o cliente e fecha a conexo. Se voc precisa de grandes consultas (por exemplo, se
voc est trabalhando com grandes colunas BLOB), voc pode aumentar o limite da consulta iniciando o mysqld com a opo -O max_allowed_packet=# (padro 1M). A memria extra alocada sobre demanda, assim o mysqld alocar mais memria apenas quando voc executar uma
grande consulta ou quando o mysqld deve retornar um grande registro de resultado!
Voc tambm obter uma conexo perdida se voc estiver enviando um pacote >= 16M e se seu cliente for mais antigo que a verso 4.0.8 e a verso do seu servidor 4.0.8 e acima ou vice versa.
Se voc quiser fazer um relatrio de erros descreendo este prolema, esteja certo de ter includo as seguintes informaes:
Informe se o MySQL morreu ou no. (Voc pode encontrar into no arquivo hostname.err).
See Seco A.4.1, O Que Fazer Se o MySQL Continua Falhando.
Se uma cosulta especfica matar o mysqld e as tabelas envolvidas foram verificadas com
CHECK TABLE antes que voc fizesse a consulta, voc pode fazer um caso de teste para isto?
See Seco E.1.6, Fazendo um Caso de Teste Se Ocorre um Corrompimento de Tabela.
Voc tentou executar mysqld com --log e verificou se a consulta executada apareceu no log?
connect
to
[local]
MySQL
Um cliente MySQL em Unix pode conectar ao servidor mysqld de dois modos diferentes: sockets
Unix, que conectam atravs de um arquivo no sistema de arquivos (padro /tmp/mysqld.sock)
ou TCP/IP, que conecta atravs um nmero de porta. Sockets Unix so mais rpidos que TCP/IP
mas s podem ser usados quando conectados ao servidor no mesmo computador. Sockets Unix so
usados se voc no especificar um nome de mquina ou se voc especificar o nome de mquina especial localhost.
No Windows, se o servidor mysqld est rodando no 9x/Me, voc s pode conectar via TCP/IP. Se
o servidor estiver rodando no NT/2000/XP e o mysqld iniciado com --enable-named-pipe,
voc tambm pode conectar com named pipes. O nome do named pipes MySQL. Se voc no der
um nome de mquina quando conectar ao mysqld, um cliente MySQL tentar conectar primeiro ao
named pipe, e se isto no funcionar ele ir conectar a porta TCP/IP. Voc pode forar o uso de named pipes no Windows usando . como nome de mquina.
837
O erro (2002) Can't connect to ... normalmente significa que no h um servidor MySQL
rodando no sistema ou que voc est usando um arquivo socket ou porta TCP/IP errado ao tentar conectar so servidor mysqld.
Inicie verificando (usando ps ou gerenciador de tarefas do Windows) que h um processo chamado
mysqld executando em seu sistema! Se no houver nenhum processo mysqld, voc deve iniciar
um. See Seco 2.4.2, Problemas Inicializando o Servidor MySQL .
Se um processo mysqld estiver em execuo, voc pode verificar o servidor tentando estas diferentes conexes (o nmero da porta e o caminho do socket devem ser diferente em sua consigurao,
claro):
shell>
shell>
shell>
shell>
shell>
shell>
mysqladmin
mysqladmin
mysqladmin
mysqladmin
mysqladmin
mysqladmin
version
variables
-h `hostname` version variables
-h `hostname` --port=3306 version
-h 'ip for your host' version
--protocol=socket --socket=/tmp/mysql.sock version
Note o uso de aspas para traz em vez de aspas para frente com o comando hostname; isto provoca
a sada de hostname (que , o nome de mquina atual) para ser substitudo no comando mysqladmin.
Aqui esto algumas razes pela quais o erro Can't connect to local MySQL server
pode ocorrer:
Voc est rodando em um sistema que usa MIT-pthreads. Se voc estiver executando em um sistema que no possui threads nativas, o mysqld usa o pacote MIT-pthreads. See Seco 2.2.3,
Sistemas Operacionais suportados pelo MySQL. No entanto, nem todas as verses de MITpthreads suportam sockets Unix. Em um sistema sem suporte a sockets voc sempre deve especificar o nome de mquina explicitamente ao conectar ao servidor. Tente usar este comando para
verificar a conexo com o servidor:
shell> mysqladmin -h `hostname` version
Algum removeu o socket Unix que o mysqld utiliza (por padro /tmp/mysqld.sock).
Voc deve ter um trabalho cron que remove o socket MySQL (por exemplo, um trbalhoque remove arquivos antigos do diretrio /tmp). Voc sempre pode executar mysqladmin version e verificar que o socket que o mysqladmin est tentando usar realmente existe. A correo neste caso alterar o trabalho cron para no remover mysqld.sock ou para colocar o
socket em outro local. See Seco A.4.5, Como Proteger ou AlterarHow to Protect or Change
the MySQL Socket File /tmp/mysql.sock.
Voc iniciou o servidor mysqld com a opo --socket=/path/to/socket. Se voc alterar o caminho do socket para o servidor, voc tambm deve notificar o cliente MySQL sobre o
novo caminho. Voc pode fazer isto fornecendo o caminho do socket como um argumento para
o cliente. See Seco A.4.5, Como Proteger ou AlterarHow to Protect or Change the MySQL
Socket File /tmp/mysql.sock.
Voc est usando Linux e uma thread finalizou (core dumped). Neste caso voc deve matar as
outras threads mysqld (por exemplo, com o script mysql_zap antes de voc poder iniciar um
novo servidor MySQL. See Seco A.4.1, O Que Fazer Se o MySQL Continua Falhando.
Voc pode no ter privilgios de leitura e escrita tanto no diretrio que guarda o arquivo de socket quanto no prprio arquivo de socket. Neste caso voc deve mudar o privilgio do diretrio/arquivo ou reiniciar mysqld para que ele use um diretorio que voc possa utilizar.
Verifique se o servidor est funcionando fazendo telnet seu-servidor num-porta-tcp-ip e pressione Enter algumas vezes. Se houver um servidor MySQL em execuo
nesta porta voc deve obter uma resposta que inclui o nmero da verso do servidor MySQL em
execuo. Se voc obter um erro como telnet: Unable to connect to remote
host: Connection refused, ento no h nenhum servidor rodando na porta dada.
Tente conectar ao daemon mysqld na mquina local e verifique a porta TCP/IP que o mysqld
est configurado para usar (varivel port) com mysqladmin variables.
Atualizar todos os progrmas clientes para usar a biblioteca cliente 4.1.1 ou mais nova.
Use uma conta com uma senha antiga ao conectar em clientes anteriores ao 4.1.
Reset o usurio que precisa de um cliente anterior ao 4.1 para usar a senha antiga:
mysql> UPDATE user SET Password = OLD_PASSWORD('mypass')
-> WHERE Host = 'some_host' AND User = 'some_user';
mysql> FLUSH PRIVILEGES;
2.
Defina a senha para todos os usurios que tenham senha longa. Voc pode encontrar estes
usurios com:
SELECT * FROM mysql.user WHERE LEN(password) > 16;
Para mais informaes sobre hash de senha e autenticao, veja Seco 4.3.11, Hashing de Senhas
no MySQL 4.1.
quina 'hostname' e que foram interrompidos no eio. Depois de max_connect_errors pedidos com falhas o mysqld assume que algo est errado (como um attack de um cracker), e bloqueia
o site para tais conexes at algum executar o comando mysqladmin flush-hosts.
Por padro, o mysqld bloqueia um host depois de 10 erros de conexo. Voc pode facilmente ajustar isto iniciando o servidor assim:
shell> mysqld_safe -O max_connect_errors=10000 &
Note que se voc obter esta mensagem de erro para uma dada mquina, voc deve primeiramente
verificar se no h nada errado com a conexo TCP/IP desta mquina. Se sua conexo TCP/IP no
estiver funcionando, no ser nada bom aumentar o valor da varivel max_connect_errors!
840
note que o erro se refere ao cliente MySQL mysql. A razo para este erro simplesmente que o cliente no possui memria suficente para armazenar todo o resultado.
Para solucionar o problema, primeiro verifique que sua consulta est correta. razovel que voc
deva retornar tantos registros? Se for, voc pode utilizar mysql --quick, que usa
mysql_use_result() para retornar o resultado. Isto coloca menos carga no cliente (mas mais
carga nop servidor).
841
Quando levar mais de connect_timeout segundos para obter um pacote de conexo. See
Seco 4.6.8.4, SHOW VARIABLES.
Note que o descrito acima podia indicar que algum est tentando derrubar o seu banco de dados.
Outras razes para problemas com Clientes abortados / Conexes abortadas.
O uso de protocolo Ethernet com Linux, tanto half quanto full duplex. Muitos drivers de Ethernet do Linux possui este bug. Voc deve test-lo transferindo um arquivo enorme via ftp entre
estas duas mquinas. Se uma transferncia entra no modo de estouro-pausa-esoturo-pausa... ento voc est experimentando uma sndorme de duplex no Linux A nica soluo trocar o modo duplex, tanto da placa de rede quanto do Hub/Switch entre full duplex e half duplex e testar
os resultados para decidir qual a melhor configurao.
Defeitos na rede, hub, switch, cabos, ... Isto pode ser diagnosticado de forma apropriada aomente atravs de reposio de hardware.
max_allowed_packet muito pequeno ou a consulta exige memria livre que voc alocou
para mysqld. See Seco A.2.9, Erro: Packet too large .
Voc est usando um verso mais antiga do MySQL (antes da 3.23.0) quando uma tabela temporria em memria se torna maior que tmp_table_size bytes. Para evitar este problema, voc
pode utilizar a opo -O tmp_table_size=# para fazer o mysqld aumentar o tamanho da
tabela temporria ou usar a opo SQL SQL_BIG_TABLES antes de disparar a consulta problematica. See Seco 5.5.6, Sintaxe de SET.
Voc tambm pode iniciar mysqld com a opo --big-tables. Isto extamente o mesmo
que usar SQL_BIG_TABLES para toadas as consultas.
842
No MySQL Verso 3.23, se uma tabelas temporrias em memria se torna maior que
tmp_table_size, o servido automaticamente a converte para tabelas em disco MyISAM.
Voc est usando tabelas InnoDB e fica sem espao no tablespace do InnoDB. Neste cado a
soluo extender o tablespace do InnoDB.
Voc est usando tabelas ISAM ou MyISAM em um SO que s suporta arquivos de 2G e voc alcanou este limite para os arquivos de dado ou ndice.
Voc est usando tabelas MyISAM e o dado necessrio ou tamanho do ndice maior que alqueles para os quais o MySQL alocou ponteiros. (Se voc no especificar MAX_ROWS para CREATE TABLE o MySQL s alocar ponteriros para guardar 4G de dados).
Voc pode verificar o tamanho mximo do dados/ndice fazendo
SHOW TABLE STATUS FROM database LIKE 'nome_tabela';
ou usando myisamchk -dv database/nome_tabela.
Se este o problema, voc pode corrig-lo fazendo algo como:
ALTER TABLE nome_tabela MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;
Voc s precisa especificar AVG_ROW_LENGTH para tabelas com campos BLOB/TEXT j que
neste caso o MySQL no pode otimizar o espao necessrio baseado apenas no nmero de linhas.
Voc pode executar uma nova verso do mysqld com uma tabela user antiga. Voc pode verificar isto executando mysqlshow mysql user para ver se o campo da senha menor que
16 caracteres. Se for, voc pode corrigir esta condio executando o script scripts/
add_long_password.
O usurio tem um senha antiga (8 caracteres) e voc no iniciou o mysqld com a opo -old-protocol. Atualize o usurio na tabela user com uma nova senha ou reinicie o
mysqld com --old-protocol.
Voc especificou uma senha na tabela de usurio user sem sar a funo PASSWORD(). Use
mysql para atualizar o usurio na tabela user com uma nova senha. Utilize a funo PASSWORD():
mysql> UPDATE user SET password=PASSWORD('your password')
->
WHERE user='XXX';
O conjunto de caracter multi-byte e voc no tem suporte para o conjunto de caracteres no cliente.
Neste caso voc precisa recompilar o cliente com --with-charset=xxx ou com -with-extra-charsets=xxx. See Seco 2.3.3, Opes tpicas do configure .
844
Todos
os
bionrios
MySQL
padres
so
compilados
com
-with-extra-character-sets=complex que habilita o suporte para todos os conjuntos de caracteres multi-byte. See Seco 4.7.1, O Conjunto de Caracteres Utilizado para Dados
e Ordenao.
Recompilar o cliente com suporte ao conjunto de caracteres. See Seco 2.3.3, Opes tpicas do configure .
Especificar para o cliente onde o arquivo de definio do conjuntos de caracteres est. Para
muitos
clientes
voc
pode
faz-lo
com
a
opo
-character-sets-dir=path-to-charset-dir.
Copie o arquivo de definio de caracteres no caminho onde o cliente espera que eles estejam.
reto quando voc pergunta pelo limite atual! Neste caso voc deve iniciar mysqld_safe com sh!
Se voc obter erros de undefined reference (referncia indefinida) para as funes descompactadas ou compactadas, adicione -lz no final sa sua linha de ligao e tente
novamente!
Se voc obter erros de undefined reference (referncia indefinida) para funes
que devem existir em seu sistema, como connect, verifique a pgina do man sobre a funo em
questo para saber quais bibiotecas voc deve adicionar a sua linha de ligao!
Se voc obter erros de undefined reference (referncia indefinida) para funes
que no existem em seu sistema, como o seguinte
mf_format.o(.text+0x201): undefined reference to `__lxstat'
normalmente significa que sua biblioteca compilada em um sistema que no 100% compatvel
com o seu. Neste caso voc de fazer o download da ltima distribuio fonte do MySQL e compilla voc mesmo. See Seco 2.3, Instalando uma distribuio com fontes do MySQL.
Se voc estiver tentando executar um programa e ento obter erros de smbolos sem referncia que
comeam com mysql_ ou que a biblioteca do mysqlclient no pode encontrar, significa que
seu sistema no pode encontrar a biblioteca compartilhada libmysqlclient.so.
A correo deste problema dizer ao seu sistema para buscar onde a biblioteca esta lacolizada usando um dos seguintes mtodos:
Copie libmysqlclient.so a algum local que pesquisado pelo seu sistema, como /lib, e
atualize a informao da biblioteca compartilhada executando ldconfig.
OUtro modo de resolver este problema ligar o seu programa estaticamente, com -static, ou removendo as bibliotecas dinmicas do MySQL antes de ligar o seu cdigo. Na prxima vez voc deve estar certo que nenhum outro programa esta usando bibliotecas dinmicas!
Normal
O servidor mysqld pode ser iniciado por qualquer usurio. Para fazer com que o mysqld execute
como um usurio nome_usurio do Unix, voc deve fazer o seguinte:
1.
2.
Altere o diretrio de banco de dados e arquivos para que nome_usurio tenha privilgios de
leitura e escrita do arquivo (voc pode precisar estar como o usurio root do Unix):
shell> chown -R nome_usuario /caminho/para/dir_dados/mysql
Se o diretrio ou arquivos dentro do diretrio de dados do MySQL so links simbolicos, voc
tambm precisar seguir estes links e alterar os diretrios e arquivos para os quais ele aponta.
chown -R pode no seguir o link simblico para voc.
3.
Inicie o servidor como o usurio nome_usurio, ou, se voc est usando o MySQL Verso
3.22 ou mais antiga, inicie o mysqld como o usurio root do Unix e use a opo -user=nome_usuario. mysqld trocar para executar como o usurio nome_usurio
do Unix antes de aceitar qualquer conexo.
4.
Para iniciar o servidor automaticamente com o nome de usurio dado na inicializao do sistema, adicione um linha user que especifica o nome do usurio ao 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=nome_usuario
Neste ponto, seu processo mysqld deve estar executando bem e redondo como usurio nome_usuario do Unix. No entanto algo no altera: o contedo da tabela de permisses. Por padro
(logo depois de executar o script de instalao das tabelas de permisses mysql_install_db), o
usurio MySQL root o nico com permisso para acessar o banco de dados mysql ou para criar
ou apagar banco de dados. A menos que voc tenha alterado estas permisses, elas ainda valem. Isto
no deve imped-lo de de acessar o MySQL como usurio root do MySQL quando voc est logado como outro usurio Unix deiferente de root; apenas especifique a opo -u root ao programa cliente.
Note que acessar o MySQL como root, fornecendo -u root na linha de comando diferente de
de executar o MySQL como o usurio root do Unix,or como outro Usurio Unix. A permisso de
acesso e nome de usurios do MySQL esto completamente separados dos nomes de usurio do
Unix. A nica conexo com os nomes de usurio do Unix que se voc no utilizar a opo -u
quando chamr o seu programa cliene, o cliente tentar conectar usando seu nome de login do Unix
como o seu nome de usurio do MySQL
Se a sua conta Unix no esta segura, voc deve pelo menos colocar uma senha no usurio root do
MySQL na tabela de acesso. Seno qualquer usurio com uma conta nesta mquina poder executar
mysql -u root nome_bd e fazer o que quiser.
Voc encontrou um bug no mysqld que faa com que ele finalize no meio de uma atualizao.
Algum est manipulando os arquivos de dados/ndices de fora do mysqld sem o bloqueio de tabela apropriado.
Se voc estiver executando muitos servidores mysqld no mesmo dado em um sistema que no
suporta bons bloqueios de sistema de arquivos (normalmente tartando o daemon lockd) ou se
voc est executando multiplos servidores com --skip-external-locking
848
Voc tem um arquivo de dados/ndices que contem muitos dados errados que deixam o mysqld
confuso.
Voc encontrou um bug no cdigo de armazenamento do dado. Isto no desejvel mas possvel. Neste caso voc ode tentar alterar o tipo de arquivo para outro mecanismo de armazenamento usando ALTER TABLE em uma cpia corrigida da tabela!
Por ser muito difcil saber o motivo das falhas, tente primeiro verificar se o que est funcionando para outros est falhando com voc. Por favor, tente o seguinte:
Finalize o daemon mysqld com mysqladmin shutdown, execute myisamchk --silent
--force */*.MYI em todas as tabelas e reinicie o daemon mysqld. Isto ir assegurar que voc
est executando de um estado ``limpo''. See Captulo 4, Administrao do Bancos de Dados
MySQL.
Use mysqld --log e tente determinar a partir da informao no log se alguma consulta especfica finalizou o servidor. Aproximadamente 95% de todos os erros so relacionados com um
consulta em particular! Normalmente ela uma das ltimas consultas no arquivo de log antes do
MySQL reiniciar See Seco 4.10.2, O Log de Consultas. Se voc puder finalizar o MySQL
repetidamente com uma das consultas, mesmo quando voc tiver verificado todas as tabelas logo
antes de realiz-la, ento voc estar apto a localizar o bug e deve fazer um relatrio de bug para
isto! See Seco 1.7.1.3, Como relatar erros ou problemas.
Tente fazer um caso de teste que possamos utilizar para reproduzir o problema. See Seco E.1.6, Fazendo um Caso de Teste Se Ocorre um Corrompimento de Tabela.
Tente executar o teste incluso mysql-test e o benchmark do MySQL. See Seco 14.1.2,
Pacotes de Teste do MySQL. Eles devem testar o MySQL bem. Voc tambm pode adicionar
ao benchmark um cdigo que simule a sua aplicao! O benchmark pode ser encontrado no diretrio bench na distribuio fonte ou, em uma distribuio binria, no diretrio sql-bench
sob o diretrio de instalao do seu MySQL.
Se voc configurar o MySQL para depurao, ser muito mais fcil para obter informaes sobre possveis erros se alguma coisa der errado. Reconfigure o MySQL com a opo -with-debug ou --with-debug=full no configure e ento recompile-o. See Seco E.1, Depurando um Servidor MySQL.
Configurar o MySQL para depurao faz com que um alocador de memria seja includo para
que se possa encontrar alguns erros. Ele tambm fornece muita informao sobre o que est
acontecendo.
Use a opo --skip-external-locking com o mysqld. Em alguns sistemas, o gerenciador de bloqueios lockd no funciona de forma apropriada; a opo -skip-external-locking faz com que mysqld no utilize bloqueio externo. (Isto significa que voc no pode executar 2 servidores mysqld sobre o memo dado e que voc deve ser
cuidadoso ao utilizar myisamchk, mas pode ser instrutivo tentar a opo como teste).
Voc tentou mysqladmin -u root processlist quando o mysqld parecia estar rodando mas no respondia? Algumas vezes o mysqld no est <<comatose>> mesmo quando
voc acha que no. O problema pode ser que todas as conexes esto em uso, o pode haver algum problema interno de bloqueio. mysqladmin processlist normalmente estar apto a
fazer uma conexo mesmo nestes casos e pode fornecer informao til sobre o nmero conexes atuais e os seus estados.
849
Experimente o seguinte:
1.
Inicie o mysqld a partir do gdb (ou em outro depurador). See Seco E.1.3, Depurando
o mysqld no gdb.
2.
3.
Imprima o <<backtrace>> e as varveis locais nos 3 nveis mais baixos. No gdb voc pode
faz-lo com o seguinte comando quando o mysqld falhar dentro do gdb:
backtrace
info local
up
info local
up
info local
Com gdb voc tambm pode examinar quais threads existem com info threads e troca
para uma thread especfica com thread #, onde # a ID da thread.
Tente simular a sua aplicao com um script Perl para forar o MySQL a falhar o mudar o seu
comportamento.
Envie um relatrio de bug normal. See Seco 1.7.1.3, Como relatar erros ou problemas. Seja
mais detalhista que o normal. Como o MySQL funciona para muitas pessoas, pode ser que as falhas resultem de algo que exista apenas em seu computador (por exemplo, um erro que relacionado a suas bibliotecas de sistemas em particular).
Se voc tiver um problema em tabelas com registros do tamanho dinmico e voc no est usando colunas BLOB/TEXT (mas apenas colunas VARCHAR, voc pode tentar alterar todas as colunas VARCHAR para CHAR com ALTER TABLE. Isto forara o MySQL a usar linhas de tamanho
fixo. Linhas de tamanho fixo utilizam um pouco mais de espao extra, mas so muito mais tolerante a corrompimento.
O cdigo de registro dinmico atual foi usado pela MySQL AB por pelo menos 3 anos em qualquer problema, mas por natureza os registro de tamanho dinmico so mais propensos a erros,
assim pode ser uma boa idia tentar o exposto acima para ver se ajuda.
Finalize o daemon mysqld enviando um kill (no kill -9) para o servidor mysqld. O
pid armazenado em um arquivo .pid, que normalmente est no diretrio de banco de dados
do MySQL:
shell> kill `cat /mysql-data-directory/hostname.pid`
Voc deve ser o usurio root do Unix ou o mesmo usurio com o qual o mysqld est executando para fazer isto.
2.
3.
4.
Agora voc tambm pode parar o mysqld e reinici-lo normalmente, ou apenas carregue a tabela de privilgios com:
shell> mysqladmin -h hostname flush-privileges
5.
Depois disto, voc deve estar apto para conectar usando a nova senha.
De forma alternativa, voc pode definir a nova senha usando o cliente mysql:
1.
2.
3.
4.
Depois disto, voc deve estar apto a conectar usando a nova senha.
5.
Ele verifica a cada minuto para ver se existe espao suficiente para escrever a linha atual. Se
houver espao suficiente, ele continua como se nada tivesse aconteciso.
A cada 6 minutos ele grava uma entrada no log de arquivo avisando sobre a condio de disco
cheio.
Para continuar, voc s tem que liberar espao suficiente em disco para inserir todos os registros.
Para abortar a thread, voc deve enviar um mysqladmin kill para a thread. A thread ser
abortada a prxima vez que ele verificar o disco (em 1 minuto).
Note que outra thread pode estar esperando pelas tabelas que provocaram a condio de disco
cheio. Se voc tiver diversas theads ``bloqueadas'', matar a que est esperando pela condio de
disco cheio ir permitir as outras threads de continuar.
A exceo ao comportamento acima quando voc usa REPAIR ou OPTIMIZE ou quando os ndices so criados em um grupo antes de um LOAD DATA INFILE ou depois de uma instruo ALTER TABLE.
Todos os comandos acima podem usar arquivos temporrios grandes que por si prprios poderiam
851
causar grandes problemas para o resto do sistema. Se o MySQL ficar sem espao em disco enquanto
faz qualquer uma das operaes acima, ele remover o arquivo temporrio grande e indicara que
houve falha na tabela (exceto para ALTER TABLE, no qual a tabela antiga ficar inalterada).
Especifique o caminho em uma arquivo de opo local ou global. Por exemplo, coloque em /
etc/my.cnf:
852
[client]
socket=path-for-socket-file
[mysqld]
socket=path-for-socket-file
See Seco 4.1.2, Arquivo de Opes my.cnf.
Especificando isto na linha de comando para o mysqld_safe e na maioria dos clientes com a
opo --socket=path-for-socket-file.
Definindo
o
caminho
com
a
opo
-with-unix-socket-path=path-for-socket-file do configure. See Seco 2.3.3, Opes tpicas do configure .
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
SELECT
SELECT
SELECT
SELECT
Se o MySQL pode armazenar e recuperar um data dada, a data errada acieta para colunas DATE e DATETIME.
Todos os valores de dia entre 0-31 so aceitos para qualquer data. Isto torna muito conveniente
para plicaes web nas quais voc pede ano, ms e dia em 3 campos diferentes.
O campo do dia ou ms pode ser zero. Isto conveniente se voc quiser armazenar uma data de
aniversrio em uma coluna DATE e voc no sabea parte da data.
Se a data no pode ser convertida para qualquer valor razovel, um 0 armazenado no campo
DATE, o qual ser recuperado como 0000-00-00. Isto uma questo tanto de velocidade quanto
de convenincia j que acreditamos que a responsabilidade do banco de dados recuperar a mesma
data que voc armazenou (mesmo se a data no era logicamente correta em todos os casos). Ns
pensamos que papel da aplicao verificar as datas, e no do servidor.
temente pensa que NULL a mesma coisa que uma string vazia "". Este no o caso! Por exemplo,
as seguintes intrues so completamente diferentes:
mysql> INSERT INTO minha_tabela (telefone) VALUES (NULL);
mysql> INSERT INTO minha_tabela (telefone) VALUES ("");
Ambas as intrues inserem um valor na coluna telefone, mas a primeira insere um valor NULL
e a segunda insere uma string vazia. O significado do primeiro pode ser considerado como ``telefone
no conhecido'' e o significado da segunda pode ser considerado como ``ela no tem telefone''.
Em SQL, o valor NULL sempre falso em coparao a qualquer outro valor, mesmo NULL. Uma
expresso que contm NULL sempre produz um valor NULL a menos que seja indicado na documentao para os operadores e funes involvidos na expresso. Todas as colunas no seguinte exemplo
retornam NULL:
mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);
Se voc quiser procurar por uma coluna cujo valor NULL, voc np pode usar o teste =NULL. A
seguinte instruo no retorna nenhuma linha, pois expr = NULL FALSO, para qualquer expresso:
mysql> SELECT * FROM minha_tabala WHERE phone = NULL;
Para procurar por valores NULL, voc deve usar o teste IS NULL. A seguir mostramos como encontrar o nmuro de telefone NULL e o nmero de telefone vazio:
mysql> SELECT * FROM minha_tabela WHERE telefone IS NULL;
mysql> SELECT * FROM minha_tabela WHERE telefone = "";
Note que voc pode adicionar um ndice a uma coluna que tenha valores NULL apenas se voc estiver usando o MySQL verso 3.23.2 ou mais novo e estiver usando tipos de tabelas NyISAM, InnoDB ou BDB. Em verses anteriores e com outros tipos de tabelas, voc deve declara tais colunas
como NOT NULL. Isto tambm significa que voc ento no poder inserir NULL em uma coluna
indexada.
Ao ler dados com LOAD DATA INFILE, colunas vazias so atualizadas com ''. Se voc quiser
um valor NULL em uma coluna, voc deve usar \N no arquivo texto. A palavra literal 'NULL' tambm pode ser usada em algumas circunstncias. See Seco 6.4.8, Sintaxe LOAD DATA
INFILE.
Ao usar ORDER BY, valores NULL so apresentados primeiro, ou por ltimo se voc especificar
DESC para armazenar em ordem decrescente. Exceo: Nos MySQL 4.0.2 at 4.0.10, se voc armazenar em ordem decrescente usando DESC, valores NULL so apresentados por ltimo.
Ao usar GROUP BY, todos os valores NULL so considerados iguais.
Funes de agrupamento (resumo) como COUNT(), MIN() e SUM() ignoram valores NULL. A
exceo a isto COUNT(*), que conta linhas e no colunas individuais. Por exemplo, a seguinte
instruo deve produzir duas contagens. A primeira a contagem do nmero de linhas na tabela e a
segunda a contagem do nmero de valores diferentes de NULL na coluna age:
mysql> SELECT COUNT(*), COUNT(age) FROM person;
Para ajudar com o tratamento de NULL, voc pode usar os operadores IS NULL e IS NOT NULL
e a funo IFNULL().
Para alguns tipos de colunas, valores NULL so tratados de forma especial, Se voc inserir NULL na
primeira coluna TIMESTAMP de uma tabela, a data e hora atual sero inseridos. Se voc isere NULL
em uma coluna AUTO_INCREMENT, o prximo nmero na sequncia inserida.
855
2.
3.
WHERE
coluna_relacionada
IN
Teste a consulta com EXPLAIN e verifique se voc pode encontrar alguma coisa que est errada. See Seco 5.2.1, Sintaxe de EXPLAIN (Obter informaes sobre uma SELECT).
2.
3.
Remova uma tabela por vez da consulta at que ela retorne alguns registros. Se as tabelas so
grandes, uma boa idia usar LIMIT 10 com a consulta.
4.
Faa um SELECT da coluna encontrou um registro com a tabela que foi removido por ltima
da consulta.
5.
Se voc estiver comparando colunas FLOAT ou DOUBLE com nmeros que tenham decimais,
voc no pode usar '='. Este problema comum na maioria das linguagens de computadores
856
porque valores de ponto-flutuante no so valores exatos. Na maioria dos casos, alterar o FLOAT por DOUBLE corrigir isto. See Seco A.5.7, Problemas com Comparao de Ponto Flutuante.
6.
Se voc ainda no pode imaginar o que est errado, crie um teste mnimo que possa ser executado com mysql test < query.sql e possa mostrar seus problemas. Voc pode criar
um arquivo de teste com mysqldump --quick banco_de_dados tabela >
query.sql. Abra o arquivo em um editor, remova algumas linhas inseridas (se houver muitas) e adicione sua instruo select no fim do arquivo.
Teste se voc ainda est tendo problemas fazendo:
shell> mysqladmin create test2
shell> mysql test2 < query.sql
Envie o arquivo de teste usando mysqlbug para lista de email gerais do MySQL. See Seco 1.7.1.1, As Listas de Discusso do MySQL.
|
6 | -51.40 | 0.00 |
+------+--------+-------+
assim que o nmero da coluna 'a' se parece:
mysql> SELECT i, ROUND(SUM(d1), 2)*1.0000000000000000 AS a,
-> ROUND(SUM(d2), 2) AS b FROM t1 GROUP BY i HAVING a <> b;
+------+----------------------+-------+
| i
| a
| b
|
+------+----------------------+-------+
|
1 | 21.3999999999999986 | 21.40 |
|
2 | 76.7999999999999972 | 76.80 |
|
3 |
7.4000000000000004 | 7.40 |
|
4 | 15.4000000000000004 | 15.40 |
|
5 |
7.2000000000000002 | 7.20 |
|
6 | -51.3999999999999986 | 0.00 |
+------+----------------------+-------+
Dependendo da arquitetura do computador voc pode ou no ver resultados similares. Cada CPU
pode avaliar um nmere de ponto flutuante de forma diferente. Por exemplo, em alguma mquinas
voc pode obter resultados 'corretos' multiplicando ambos argumentos por 1, como no exemplo a seguir.
AVISO: NUNCA CONFIE NESTE MTODO EM SUAS APLICAES, ESTE UM
EXEMPLO DE UM MTODO ERRADO!!!
mysql> SELECT i, ROUND(SUM(d1), 2)*1 AS a, ROUND(SUM(d2), 2)*1 AS b
-> FROM t1 GROUP BY i HAVING a <> b;
+------+--------+------+
| i
| a
| b
|
+------+--------+------+
|
6 | -51.40 | 0.00 |
+------+--------+------+
A razo pela qual o mtodo acima parece funcionar que na mquina onde o teste foi realizado, a
CPU de aritimtica de ponto flutuante realizada arredondando nmeros para serem iguais, mas no
h nenhuma regra que qualquer CPU deva fazer assim, ento isto no confivel.
O modo correto de fazermos comparaes de ponto flutuante primeiro decidir qual a tolerncia
desejada entre os nmeros e ento fazer a comparao com o nmero tolerado. Por exemplo, se ns
concordarmos que nmeros de ponto flutuante devem ser considerados o mesmo, se eles forem o
mesmo com preciso de quatro casas deciamis (0.0001), a comparao deve ser feita assim:
mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1
-> GROUP BY i HAVING ABS(a - b) > 0.0001;
+------+--------+------+
| i
| a
| b
|
+------+--------+------+
|
6 | -51.40 | 0.00 |
+------+--------+------+
1 row in set (0.00 sec)
E vice-versa, se ns quisermos obter registros onde os nmeros so o mesmo, o teste seria:
mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1
-> GROUP BY i HAVING ABS(a - b) < 0.0001;
+------+-------+-------+
| i
| a
| b
|
+------+-------+-------+
|
1 | 21.40 | 21.40 |
|
2 | 76.80 | 76.80 |
|
3 | 7.40 | 7.40 |
|
4 | 15.40 | 15.40 |
858
|
5 | 7.20 | 7.20 |
+------+-------+-------+
EXPLAIN. See Seco 5.2.1, Sintaxe de EXPLAIN (Obter informaes sobre uma SELECT).
USE INDEX, FORCE INDEX and IGNORE INDEX. See Seco 6.4.1, Sintaxe SELECT .
STRAIGHT JOIN a nvel de tabela e global. See Seco 6.4.1, Sintaxe SELECT .
A tabela to pequena que mais rpido fazer uma varredura na tabela que uma busca nas chaves. Isto um caso comum para tabelas com menos de 10 linhas e um tamanho de linha pequeno.
Voc est comparando colunas indexadas com constantes e o MySQL calculou (baseado na rvore de ndices) que a constante cobre uma parte muito grande da tabela e uma busca na tabela
seria mais rpido.. See Seco 5.2.4, Como o MySQL Otimiza Clusulas WHERE.
Voc est usando uma chave com baixa cardinalidade (= muitos registros coincidentes) atravs
de outra coluna. O MySQL assumir neste caso que usar a chave far muitas pesquisas de chave
e neste caso a varredura da tabela seria mais rpido.
O que voc pode fazer para evita uma busca 'errada' em tabelas grandes :
Use ANALYZE TABLE para a tabela em quasto atualizar a distribuio das chaves.. See Seco 4.6.2, Sintaxe de ANALYZE TABLE.
Use FORCE INDEX para a tabela em questo para dizer ao MySQL que uma busca na tabela
muito cara comparado com usar um dos ndices dados. See Seco 6.4.1, Sintaxe SELECT .
SELECT * FROM t1,t2 force index(index_for_column) WHERE t1.column=t2.column;
Inicie
o
mysqld
com
--max-seeks-for-key=1000
ou
faa
SET
MAX_SEEKS_FOR_KEY=1000 para dizer ao otimizador que nenhuma busca de chave far
mais que 1000 pesquisas nas chaves.
859
B-xxx deletada.
Se algo der errado com a operao de renomeao, o MySQL tenta desfazer a mudana. Se algo der
seriamente errado (isto no deve acontecer, claro), o MySQL pode deixar a tabela antiga como Bxxx, mas uma simples renomeao no nvel do sistema deve trazer o seus dados de volta.
2.
Execute
INSERT
INTO
tabela_nova
na-ordem-de-tabela_nova FROM tabela_antiga.
860
SELECT
campos-
3.
4.
Em uma aplicao, voc nunca deve usar SELECT * e recuperar as colunas baseado em suas posies, pois a ordem e a posio nas quais as colunas so retornadas no permanecer a mesma se voc adicionar/mover/deletar colunas. Uma simples alterao na estrutura de seu banco de dados causaria uma falha em sua aplicao. claro que SELECT * muito mais cabvel em testes de cosultas.
Uma tabela temporria s pode ser do tipo HEAP, ISAM, MyISAM, MERGE, ou InnoDB.
Voc no pode usar tabelas temporrias mais que uma vez na mesma consulta. Por exemplo, o
seguinte no funciona.
mysql> SELECT * FROM tabela_temporria, tabela_temporria AS t2;
Voc no pode usar RENAME em uma tabela temporria (TEMPORARY). Note que ALTER TABLE nome_orig RENAME nome_novo funciona!
861
Apndice
Programas
B.
Contribuio
de
Muitos usurios do MySQL tm contribudo com muitas ferramentas de suporte e add-ons teis.
Uma lista de alguns programas disponveis no website do MySQL (ou qualquer) mirror apresentada aqui.
Voc tambm pode visitar nosso nossa lista online de programas relacionados ao MySQL em
http://www.mysql.com/portal/software/. As facilidades da comunidade tambm permitem suas contribuies!
Se voc quiser construir suporte ao MySQL para interface Perl DBI/ DBD, voc deve buscar os arquivos Data-Dumper, DBI e DBD-mysql e instal-los. See Seco 2.7, Comentrios de Instalao do Perl.
Note: Os programas listados aqui podem ser baixados e usados livremente. Os direitos autorias pertencem aos seus respectivos donos. Por favor, veja a documentao de cada produto para maiores
detalhes sobre licenciamento e termos. A MySQL AB no assume responsabilidade sobre a validade
das informaes neste captulo ou sobre a operao apropriada dos programas listados aqui.
B.1. APIs
Perl Modules
OLEDB
C++
Contribuio de Programas
Delphi
http://www.mysql.com/Downloads/Contrib/DelphiMySQL2.zip
libmysql.dll, por <bsilva@umesd.k12.or.us>.
https://sourceforge.net/projects/zeoslib/ Zeos Library um conjunto de componentes de banco de dados para MySQL, PostgreSQL, Interbase, MS SQL, Oracle e DB/2. Tambm inclui
ferrementas de desenvolvimento tais como Database Explorer e Database Designer.
http://www.mysql.com/Downloads/Contrib/pike-mysql-1.4.tar.gz Modulo MySQL para pike. Para uso com o servidor web Roxen.
Interface
Delphi
para
Contribuio de Programas
http://www.mysql.com/Downloads/Contrib/mydsn-1.0.zip
Binrio
e
Fonte
para
mydsn.dll. mydsn deve ser usado para construir e remover o arquivo de registro DSN para o driver MyODBC am aplicaes Coldfusion. Por Miguel Angel Solrzano.
http://www.mysql.com/Downloads/Contrib/MySQL-ADA95_API.zip
ADA95 para a API do MySQL. Por Francois Fabien.
http://www.mysql.com/Downloads/Contrib/MyTool-DLL_for_VB_and_MySQL.zip Uma
DLL com a API C do MySQL para Visual Basic. Por Ken Menzel <kenm@icarz.com>.
http://www.mysql.com/Downloads/Contrib/MYSQLX.EXE Objeto ActiveX do MySQL para acesso direto do ser servidor MySQL atravs do IIS/ASP, VB, VC++ evitando o ODBC
que mais lento. Totalmente atualizvel, multi-thread com suporte total para todos os tipos
de campos do MySQL (verso 2001.1.1). Por SciBit http://www.scibit.com/.
http://www.fastflow.it/mylua/ Site do MyLUA; como utilizar a linguagem LUA para escrever PROCEDURE MySQL que podem ser carregados em tempo de execuo.
Uma
http://www.mysql.com/Downloads/Contrib/mylua-3.23.32.1.tar.gz
MySQL 3.23.32 para usar o LUA 4.0. Por Cristian Giussani.
interface
Correo
para
B.2. Conversores
http://www.mysql.com/Downloads/Contrib/mssql2mysql.txt Conversor
MySQL.
Por
Michael
Kofler.
O
site
do
http://www.kofler.cc/mysql/mssql2mysql.html.
http://www.mysql.com/Downloads/Contrib/dbf2mysql-1.13.tgz Converte arquivos .dbf em tabelas MySQL. Por Maarten Boekhold, <boekhold@cindy.et.tudelft.nl>, e Michael
Widenius. Este conversor no pode tratar campos MEMO.
http://www.mysql.com/Downloads/Contrib/dump2h-1.20.gz Converte a sada de um mysqldump em um arquivo de cabealho (.h) do C. Por Harry Brueckner,
<brueckner@mail.respublica.de>.
http://www.mysql.com/Downloads/Contrib/exportsql.txt
864
Um
script
do MS-SQL
mssql2mysql
parecido
com
para
ac-
Contribuio de Programas
cess_to_mysql.txt, exceto que ele totalmente configurvel, tem melhor converso de tipo (incluindo deteco de campos TIMESTAMP), fornece avisos e sugestes enquanto converte,
coloca todos os caracteres especiais em dados binrios e texto e assim por diante. Tambm converte para o mSQL v1 e v2, e no tem custo. Veja http://www.cynergi.net/exportsql/ para a ltima verso. Por Pedro Freire, <support@cynergi.net>. Note: No funciona com Access
2.0!
http://www.mysql.com/Downloads/Contrib/access_to_mysql.txt Cole esta funo em um mdulo Access de um banco de dados que possua as tabelas que voc deseja exportar. Veja tambm o
exportsql. Por Brian Andrews. Nota: No funciona com Access 2.0!
http://www.mysql.com/Downloads/Contrib/importsql.txt Um script que faz exatamente o contrrio do exportsql.txt. Ou seja, ele importa dados do MySQL para um banco de dado no
Access via ODBC. Ele bem acessvel quando combinado com exportsql, pois ele deixa voc
uar o Access para todo desenvolvimento e administrao do BD, e sincroniza com o seu servidor
MySQL. Sem custos. Veja http://www.netdive.com/freebies/importsql/ para atualizaes. Criado por Laurent Bossavit da NetDIVE. Nota: no funciona com Access2!
http://www.mysql.com/Downloads/Contrib/msql2mysqlWrapper-1.0.tgz Um wrapper C do
mSQL para MySQL. Por <alfred@sb.net>
http://www.mysql.com/Downloads/Contrib/sqlconv.pl Um script simples que pode ser usado para copiar campos de uma tabela MySQL para outro, em blocos. Basicamente voc pode rodar
mysqldump e canaliz-lo para o script sqlconv.pl. O script analisar a sada do mysqldump e rearranjar os campos para que sejam inseridosd em uma nova tabela. Um exemplo
quando voc quer criar uma nova tabela em local diferente do qual voc est trabalhando, mas a
tabela apenas um pouco diferente (isto - campos em ordem diferente, etc.). Por Steve Shreeve.
http://www.mysql.com/Downloads/Contrib/T2S_100.ZIP. Programa Windos para converter arquivos textos em banco de dados MySQL. Por Asaf Azulay.
B.3. Utilitrios
http://www.mysql.com/Downloads/Contrib/mysql_structure_dumper.tar.gz
http://www.mysql.com/Downloads/Contrib/mysql_structure_dumper.tgz Exibe a estrutura de toda a tabela em um banco de dados. Por Thomas Wana.
http://www.mysql.com/Downloads/Contrib/mysqlsync. Um script Perl para manter cpias remotas de uma banco de dados MySQL em sioncronia com uma cpia master central. Por Mark Jeftovic. <markjr@easydns.com>.
865
Contribuio de Programas
http://www.mysql.com/Downloads/Contrib/mybackup.
866
Apndice
MySQL
C.
Colaboradores
do
Este apndice lista o desenvolvedores, coolaboradores e responsveis por suporte que ajudaram a fazer o MySQL o que ele hoje.
As biblotecas ISAM e MyISAM (tratamento do arquivo de ndices em rvore-B e compactao do ndice e formato de regitsros diferentes).
A biblioteca HEAP. Um sistema de tabela em memria com nosso hashing totalmente dinmico. Em uso desde 1981 e publicado em 1984.
Correo de bugs nas MIT-pthreads para faz-la funcionar com o Servidor MySQL. E tambm Unireg, uma ferramenta com muitas utilidades.
David Axmark
Licenciamento.
Partes de todos os arquivos textos. (Hoje em dia apenas o README deixado. O reto includo no manual.)
Responsvel pela lista de email (que nunca tem tempo para faz-lo corretamente...).
Nossa portabilidade do cdigo original (mais de 10 anos). Hoje em dia apenas algumas par867
Colaboradores do MySQL
Algum para o Monty chamar no meio da noite que ele percebe que aquele novo recurso
funciona.
Jani Tolonen
mysqlimport
PROCEDURE ANALYSE()
Sinisa Milivojevic
INSERT multi-linhas
Opo -e domysqldump
Opo --max-user-connections=...
net_read e net_write_timeout
DELETE/UPDATE multi-tabelas
Sistema de arquivos do MySQL (um modo de usar banco de dados MySQL como arquivos e
diretrios).
A expresso CASE.
Sasha Pachev
868
Colaboradores do MySQL
mysql-bench
Matt Wagner
Coordenador do desenvolvimento.
Miguel Solorzano
WinMySQLAdmin
Sergei Golubchik
Pesquisa Full-text.
Jeremy Cole
Indrek Siitan
Desenvolvento do Win32
Venu Anuganti
869
Colaboradores do MySQL
Arjen Lentz
Zak Greant
Carsten Pedersen
Suporte.
Depurao.
Per-Erik Martin
Mark Matthews
Jim Winstead
Peter Zaitsev
Lenz Grimmer
Peter Gulutzan
Adequao aos padres SQL-99, SQL:2003.
870
Colaboradores do MySQL
Guilhem Bichot
Autor do mysql_tableinfo.
Antony T. Curtis
David J. Hughes
Pelo esforo para fazer um banco de dados SQL shareware. Na TcX, a predecessora da MySQL
AB, iniciamos com mSQL, mas achamos que ele no podia satisfazer os nossos propositos assim
escrevemos uma interface SQL para nossa aplicao Unireg. Os clientes mysqladmin e
mysql so programas que foram largamente influenciados pelo mSQL. Nos esforamos muito
tentando fazer da sintaxe do MySQL um superconjunto do mSQL. Muitas das idias de API
eram emprestadas do mSQL para tornar fcil de se portar programas livres para o mSQL para a
API do MySQL. O programa MySQL no contm nenhum cdigo do mSQL. Dois arquivos na
distribuio (client/insert_test.c e client/select_test.c) so baseados nos
arquivos correspondentes (sem direitos autorais) na distribuio do mSQL, mas so modificados
como exemplo mostrando as alteraes necessrias para converter um cdigo do mSQL para o
servidor MySQL.. (mSQL e de direito autora de David J. Hughes.)
Patrick Lynch
Por ajudar-nos a adquirir o http://www.mysql.com/.
Fred Lindberg
Por configurar o qmail para tratar a lista de email do MySQL e pela incrvel ajuda que obtemos
gerenciando a lista de emails do MySQL.
871
Colaboradores do MySQL
Yuri Dario
Por manter e expandir a portabilidade do MySQL para OS/2.
Tim Bunce
Autor do mysqlhotcopy.
"TAMITO" <tommy@valley.ne.jp>
O macro do conjunto de caracteres _MB e os conjuntos de caracteres ujis e sjis.
872
Colaboradores do MySQL
Wei He <hewei@mail.ied.ac.cn>
Diversas funcionalidades para o conjunto de casracteres chineses(GBK).
Steve Harvey
Por fazer mysqlaccess mais seguro.
Albert Chin-A-Young.
Atulizao do configure para Tru64, suporte a arquivos grandes e suporte a melhores wrappers
TCP.
John Birrell
873
Colaboradores do MySQL
Benjamin Pflugmann
Exetnso de tabelas MERGE para tratar INSERTS. Membro ativo na lista de emails do MySQL.
Jocelyn Fournier
Excelente ao mostrar e relatar inumerveis bugs. (especialmente no cdigo da subconsulta no
MySQL 4.1)
Marc Liyanage
Manuteno dos pacotes do Mac OS X e fornecimento de feedbacks sobre como criar pacotes
para Mac OS X.
Robert Rutherford
Por fornecer informaes e feedback sobre o port QNX.
Outros colaboradores, pesquisadores de bug e responsaveis por testes: James H. Thompson, Maurizio Menghini, Wojciech Tryc, Luca Berra, Zarko Mocnik, Wim Bonis, Elmar Haneke,
<jehamby@lightside>, <psmith@BayNetworks.com>, <duane@connect.com.au>,
Ted Deppner <ted@psyber.com>, Mike Simons, Jaakko Hyvatti.
E vrios relatos/correes de bugs do pessoal da lista de email.
Um grande tributo vai queles que nos ajudaram a responder dvidas na lista de email do MySQL.
Colaboradores do MySQL
Paul DuBois
Ajuda no progresso deste manual tornando-o correto e compreendivel. O que inclui rescrever o
ingls do Monty e David em um ingls que todo mundo conhece.
Kim Aldale
Ajudou a reescrever o ingls utilizado por Monty e Davis em ingls correto.
Yan Cailin
Primeiro tradutor do Manual de Referncia do MySQL em chins simplificado no incio de
2000, no qual a verso do cdigo Big5 e HK (http://mysql.hitstar.com/) foram baseadas. Pagina
pessoal em linuxdb.yeah.net [http://linuxdb.yeah.net].
875
Colaboradores do MySQL
Roy-Magne Mo <rmo@www.hivolda.no>
Mensagens de erro em noruegus e teste da verso 3.21.#.
Peter Feher
Mensagens de erro em hungaro.
Roberto M. Serqueira
Mensagens de erro em portugus.
Carsten H. Pedersen
Mensgens de erro em dinamarqus.
Arjen G. Lentz
Mensagens de erro em holands, completando a traduo parcial mais cedo. (tambm trabalhou
na consistencia e grafia).
Colaboradores do MySQL
para facilitar a compilao e instalao do MySQL. Somos muito agradecidos a todos os indivduos
que as criaram e tm feito a nossa vida mais fcil.
Fred Fish
Pela sua excelente depurao de C e biblioteca trace. Monty fez pequenas melhoras nesta biblioteca (velocidade e opes adicionais).
Richard A. O'Keefe
Por sua biblioteca string de domnio pblico.
Henry Spencer
Pela sua biblioteca regex, usada em WHERE column REGEXP regexp.
Chris Provenzano
Pthreads portveis no nvel de usurio. Do direito de uso: Este produto inclui software desenvolvido por Chris Provenzano, pela Univesidade da Califrnia, Berkeley e colaboradores. Atualmente estamos usando a verso 1_60_beta6 corrigida pelo Monty (veja mit-pthreads/Changes-mysql).
Bjorn Benson
Por seu pacote safe_malloc (verificador de memria) que usado quando voc configura o
MySQL com --debug.
877
Colaboradores do MySQL
Georg Richter
Teste do MySQL 4.1 e ``caador'' de bugs. Nova extenso (API) mysqli do PHP 5.0 para uso
com o MySQL 4.1 e acima.
Julian Seward
Author of valgrind, an excellent memory checker tool that has helped us find a lot of otherwise hard to find bugs in MySQL.
VA Linux / Andover.net
Replicaes de fundos.
878
Colaboradores do MySQL
NuSphere
Edio do manual MySQL.
Intel
Contribuio para desenvolvimento nas plataformas Windows e Linux.
Compaq
Contribuio no desenvolvimento do Linux/Alpha
SWSoft
Desenvolvimento da verso embutida do mysqld.
FutureQuest
--skip-show-database
879
D.1. Alteraes
(Development)
na
distribuio
5.0.0
No momento, a verso 5.0 s est disponvel em seu cdigo fonte. See Seco 2.3.4, Instalando pela rvore de fontes do desenvolvimento.
O seguinte log de alteraes mostra o que j foi feito na rvore 5.0:
Adicionado SELECT INTO lista_de_vars, que pode ser misturados, p.ex.: tipos locais e
globais.
O log de atualizao est obsoleto (no mais suportado). Ele est totlalmente substitudo pelo
log binrio.
Nomes de variveis de usurios agora esto em caso insensitivo: se voc fizer SET @a=10;
ento SELECT @A; retornar 10. claro que o contedo da varivel ainda caso sensitivo,
apenas o seu nome caso insensitivo.
Subqueries:
SELECT * FROM t1 WHERE t1.a=(SELECT t2.b FROM t2);
SELECT * FROM t1 WHERE (1,2,3) IN (SELECT a,b,c FROM t2);
Tabelas derivadas:
SELECT t1.a FROM t1, (SELECT * FROM t2) t3 WHERE t1.a=t3.a;
880
Sintaxe INSERT ... ON DUPLICATE KEY UPDATE .... Ela lhe permite fazer um UPDATE de um registro existente se a insero criasse um valor duplicado em uma chave PRIMARY ou UNIQUE. (REPLACE lhe permite sobrescrever um registro existente, o que totalmente diferente). See Seco 6.4.3, Sintaxe INSERT.
Uma nova funo de agrupamento GROUP_CONCAT(). See Seco 6.3.7, Funes e Modificadores para Usar com Clusulas GROUP BY.
Os conjuntos de caracteres podem ser definidos por colunas, tabelas e bancos de dados.
Nova cache de chaves para tabelas MyISAM com vrios parmetros de ajustes. Voc pode tem
multiplas caches de cahves, ndices precarregados em caches para batches ...
Suporte a OpenGIS (Dados Geogrficos). See Captulo 10, Extenses Espacias em MySQL.
SHOW WARNINGS exibe avisos para o ltimo comando. See Seco 4.6.8.9, SHOW WARNINGS | ERRORS.
Protocolo binrio mais rpido com instrues prepardas e ligao de parmetros. See Seco 12.1.4, Instrues Preparadas da API C.
Agora voc pode executar vrias instrues com uma nica chamada a API C e de uma vez e ento ler o resultado See Seco 12.1.8, Tratando a Execuo de Mltiplas Consultas na API C.
Create Table: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tabela LIKE
tabela.
Comando HELP baseado no servidor que pode ser usado no cliente mysql de linha de comando
(e outros clientes) para obter ajuda para comandos SQL.
Para uma lista completa das atualizaes, veja a seo de alteraes para cada distribuio 4.1.x individual.
ENGINE is now a synonym for the TYPE option for CREATE TABLE and ALTER TABLE.
Added init_connect and init_slave server variables. The values should be SQL statements to be executed when each client connects or each time a slave's SQL thread starts, respectively.
C
API
enhancement:
SERVER_QUERY_NO_INDEX_USED
and
SERVER_QUERY_NO_GOOD_INDEX_USED flags are now set in server_status field of
MYSQL structure. It is these flags that make the query to be logged as slow if mysqld was started with --log-slow-queries --log-queries-not-using-indexes.
Bugs fixed:
Fixed a bug with the INTERVAL() function when 8 or more comparison arguments are provi881
Packaging: Added missing file mysql_create_system_tables to the server RPM package. This bug was fixed for the 4.1.1 RPMs by updating the MySQL-server RPM from MySQLserver-4.1.1-0 to MySQL-server-4.1.1-1. The other RPMs were not affected by
this change.
Fixed a bug in myisamchk and CHECK TABLE that sometimes resulted in a spurious error
Found key at page ..... that points to record outside datafile for
a table with a FULLTEXT index. (Bug #1977)
Fixed a hang in full-text indexing of strings in multi-byte (all besides utf8) charsets. (Bug
#2065)
Replication: a rare race condition in the slave SQL thread that could lead to an incorrect complaint that the relay log is corrupted. (Bug #2011)
Replication: in the slave SQL thread, a multi-table UPDATE could produce an incorrect complaint that some record was not found in one table, if the UPDATE was preceded by a INSERT
... SELECT. (Bug #1701)
The MySQL source distribution now also includes the MySQL Internals Manual internals.texi.
The mysql_next_result() C API function now returns -1 if there are no more result sets.
Renamed
CLIENT_MULTI_QUERIES
connect
option
flag
to
CLIENT_MULTI_STATEMENTS. To allow for a transition period, the old option will continue to be
recognized for a while.
Require DEFAULT before table and database default character set. This enables us to use ALTER TABLE table_name ... CHARACTER SET=... to change the character set for all
CHAR, VARCHAR, and TEXT columns in a table.
Full-text search now supports multi-byte character sets and the Unicode utf8 character set.
882
QUERY
Phrase search in MATCH ... AGAINST ( ... IN BOOLEAN MODE) no longer matches
partial words.
The START SLAVE statement now supports an UNTIL clause for specifying that the slave SQL
thread should be started but run only until it reaches a given position in the master's binary logs
or in the slave's relay logs.
Produce warnings even for single-row INSERT statements, not just for multiple-row INSERT
statements. Previously, it was necessary to set SQL_WARNINGS=1 to generate warnings for single-row statements.
Added delimiter (\d) command to the mysql command-line client for changing the statement delimiter (terminator). The default delimiter is semicolon.
CHAR, VARCHAR, and TEXT columns now have lengths measured in characters rather than in
bytes. The character size depends on the column's character set. This means, for example, that a
CHAR(n) column for a multi-byte character set will take more storage than before. Similarly,
index values on such columns are measured in characters, not bytes.
LIMIT no longer accepts negative arguments (they used to be treated as very big positive numbers before).
The DATABASE() function now returns NULL rather than the empty string if there is no database selected.
Added MySQL Server option and global variable 'secure-auth' that disallows authentication for
accounts that have old (pre-4.1.1) passwords.
Added MySQL command line client option 'secure-auth'. If this option is set, client will refuse
to send password in old (pre-4.1.1) format.
Warning: Incompatible change! Renamed the C API mysql_prepare_result() function to mysql_get_metadata() as the old name was confusing.
The interface to aggregated UDF functions has changed a bit. You must now declare a
xxx_clear() function for each aggregate function XXX().
Added new ADDTIME(), DATE(), DATEDIFF(), LAST_DAY(), MAKEDATE(), MAKETIME(), MICROSECOND(), SUBTIME(), TIME(), TIMEDIFF(), TIMESTAMP(),
UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP(), and WEEKOFYEAR() functions.
Added new syntax for ADDDATE() and SUBDATE(). The second argument now may be a
number representing the number of days to be added to or subtracted from the first date argument.
883
Added new type values DAY_MICROSECOND, HOUR_MICROSECOND, MINUTE_MICROSECOND, SECOND_MICROSECOND, and MICROSECOND for DATE_ADD(), DATE_SUB(), and EXTRACT().
All queries in which at least one SELECT does not use indexes properly now are written to the
slow query log when long log format is used.
It is now possible to create a MERGE table from MyISAM tables in different databases. Formerly,
all the MyISAM tables had to be in the same database, and the MERGE table had to be created in
that database as well.
Adicionada as novas
SED_LENGTH().
Ao fazer SQL SQL_MODE=#, para um modo complexo (como ANSI) agora atualizamos a varivel SQL_MODE para incluir todas as opes que o modo exige.
Colunas TIME com valor de horas maior do que 24 eram retornadas incorretamente para o cliente.
Nova varivel global RELAY_LOG_PURGE para habilitar ou desabilitar automaticamente a remoo de relay logs.
LOAD DATA agora produz avisos que podem ser buscados com SHOW WARNINGS.
Disabled the PURGE LOGS statement that was added in in version 4.1.0. The statement now
should be issued as PURGE MASTER LOGS or PURGE BINARY LOGS.
Added SHOW MASTER LOGS (which had been deleted in version 4.1.0) as an alias for SHOW
BINARY LOGS.
funes
COMPRESS(),
884
UNCOMPRESS()
TABLE
nome_tabela
UNCOMPRES-
(LIKE
no-
Bugs corrigidos:
Fixed a bug in privilege handling that caused connections from certain IP addresses to be assigned incorrect database-level privileges. A connection could be assigned the database privileges
of the previous successful authentication from one of those IP addresses, even if the IP address
username and database name were different. (Bug #1636)
Error-handling functions were not called properly when an error resulted from [CREATE |
REPLACE| INSERT] ... SELECT statements.
HASH, BTREE, RTREE, ERRORS, and WARNINGS no longer are reserved words. (Bug #724)
Fix for bug in ROLLUP when all tables were const tables. (Bug #714)
Fixed a bug in UNION that prohibited NULL values from being inserted into result set columns
where the first SELECT of the UNION retrieved NOT NULL columns.
Fixed memory overrun in subqueries in select list with WHERE clause bigger than outer query
WHERE clause. (Bug #726)
Fixed a bug that caused MyISAM tables with FULLTEXT indexes created in 4.0.x to be unreadable in 4.1.x.
Fixed a data loss bug in REPAIR TABLE ... USE_FRM when used with tables that contained TIMESTAMP columns and were created in 4.0.x.
Fixed a crash when a SELECT that required a temporary table (marked by Using temporary in EXPLAIN output) was used as a derived table in EXPLAIN command. (Bug #251)
Fixed a rare table corruption bug in DELETE from a big table with a new (created by MySQL4.1) fulltext index.
LAST_INSERT_ID() now returns 0 if the last INSERT statement didn't insert any rows.
Corrigido um erro de replicao raro quando um transao extendia em dois ou mais relay logs e
o escravo era parada enquanto ele estava executando a parte da transao que estava no segundo
relay log ou em um adicional. Ento a replicao parava no inicio do segundo relay log ou adicional, o que estava incorreto. (ele deve parar no BEGIN, no primeiro relay log). (Bug #53)
885
Corrigido um erro de falha em DERIVED TABLES quando EXPLAIN usado em um DERIVED TABLES com um join
Corrigido um erro de falha no DELETE com ORDER BY e LIMIT causado pala inicializao do
vetor do ponteiro de referncias.
Corrigido um erro na funo USER() causado pelo erro no tamanho da string alocada
Corrigido um erro de falha quando se tentava criar uma tabela com coluna do tipo GEOMETRY
com um mecanismo de armazenamenti que no a suporta.
Corrigido um erro de falha no UNION causado pela lista de select vazia e um campo no existente sendo usado em algumas das instrues SELECTs individuais.
Corrigido um erro de replicao com um master na verso 3.23 e um slave na 4.0: o slave perdia
a replicao de tabelas temporrias se FLUSH LOGS era executado no master (Bug #254).
Corrigido um bug de segurana: Um servidor compilado ser suporte a SSL ainda permitia conexes de usurios que possuiam a opo REQUIRE SSL especificado para as suas contas.
Quando um usurio indefinido era usado em uma atualizao de consulta no master (como INSERT INTO t VALUES(@a) onde @a nunca havia sido definido por esta conexo), ento o
slave podia replicar a consulta de forma incorreta se uma transao anterior no master usava
uma varivel de usurio de mesmo nome. (Bug #1331)
Corrigido um erro com instrues preparadas: depois da chamada de mysql_stmt_prepare, colchetes so permitidos em todas as instrues consequentes, mesmo se eles no forem preparados
(bug #1946)
Nova autenticao do cliente, mais segura, baseada em senha de 45-byte na tabela user.
No Windows, agora estamos usando memria compartilhada para comunicar entre servidor e
cliente quando eles esto executando na mesma mquina e voc est conectando a localhost.
REPAIR das tabelas MyISAM agora usam menos espao temporrio em disco ao ordenar as colunas de caracteres.
Ajuda do lado do servidor para todas as funes do MySQL. Pode-se agora digitar help week
no cliente mysql e conseguir ajuda para a funo week().
886
Agora pode se matar EXPLAIN SELECT. See Seco 4.6.7, Sintaxe de KILL.
Agora pode se matar REPAIR TABLE. See Seco 4.6.7, Sintaxe de KILL.
Permiti-se especificar lista de chaves vazias para USE INDEX, IGNORE INDEX e FORCE
INDEX.
Agora DROP TEMPORARY TABLE apenas apaga tabelas temporrias e no finaliza transaes.
Warning: Alterao imcompatvel! TIMESTAMP agora retornado comi uma string do tipo
'YYYY-MM-DD HH:MM:SS' e tamanhos de timestamp diferentes no so suportados.
Esta alterao era necessria para compatibilidade com o padro SQL. Em uma verso futura,
uma alterao adicional ser feita (compatvel co esta alterao), permitindo que o tamanho do
timestamp indique o nmero de dgitos desejado para a frao de segundos.
Novo protocolo cliente/servidor mais rpido que suporta instrues preparadas, limitar parmetros e colunas de resultados, transferncia binaria de dados, avisos.
Adicionado nome de banco de dados e de nomes reais de tabela (no caso de alias) estrutura
MYSQL_FIELD.
Consultas multi linhas: Agora voc pode executar diversas consultas de uma vez e ento ler o resultados.
Em CREATE TABLE foo (a INT not null primary key) a palavra PRIMARY
agora opcional.
Em CREATE TABLE o atributo SERIAL agora um alias para BIGINT NOT NULL AUTO_INCREMENT UNIQUE.
SELECT ... FROM DUAL um alias para SELECT .... (Para ser compatvel com alguns
outros bancos de dados).
887
Pode-se especificar muitos diretrios temporrios para serem usados de modo round-robin com:
--tmpdir=nomedir1:nomedir2:nomedir3.
Tabelas derivadas:
Nova sintaxe CONVERT(... USING ...) para converso de valores strings entre conjunto
de caracteres.
ALTER DATABASE.
Suporte a GIS (dados geometricos). See Captulo 10, Extenses Espacias em MySQL.
Pode se especificar um tipo de coluna para em um CREATE TABLE ... SELECT definindo
a coluna na parte CREATE.
CREATE TABLE foo (um tinyint no nulo) SELECT b+1 AS 'a' FROM bar;
Pode se criar um tabela a partir de uma existente usando CREATE [TEMPORARY] TABLE
[IF NOT EXISTS] tabela (LIKE tabela). A tabela tambm pode ser normal ou
temporria.
Novas opes --reconnect e --disable-reconnect para o cliente mysql, para reconectar automaticamente ou no se a conexo for perdida.
START SLAVE (STOP SLAVE) no retorna mais um erro se o slave j est iniciado (parado);
ele retorns um aviso.
SLAVE START e SLAVE STOP no mais aceitada pelo analisador de consulta; use START
SLAVE e STOP SLAVE em seu lugar.
888
D.3. Alteraes
(Production)
na
distribuio
4.0.x
O tipo de tabela InnoDB agora est includo no binrio padro, adicionando transaes, lock de
linha e chaves estrangeiras. See Seco 7.5, Tabelas InnoDB.
Uma cache de consultas, oferecendo um grande aumento da performance para muitas aplicaes.
Armazenando resultados completos, mais tarde consultas idnticas podem ser retornadas instataneamente. See Seco 6.9, Cache de Consultas do MySQL.
Melhora na indexao full-text com modo booleano, truncamento e busca de frase. See Seco 6.8, Pesquisa Full-text no MySQL.
Melhor das tabelas MERGE, suportando INSERTs e AUTO_INCREMENT. See Seco 7.2,
Tabelas MERGE.
Opes adicionais para o privilgio GRANT para maior controle e segurana. See Seco 4.4.1,
A Sintaxe de GRANT e REVOKE.
Gerenciamento dos recursos dos usurios no sistema GRANT, particularmente til para provedores e outro fornecedores de hospedagem. See Seco 4.4.7, Limitando os Recursos dos Usurios.
Variveis de servidores dinmicas, permitindo que alteraes na configurao sejam feitas ser
precisar derrubar o servidor. See Seco 5.5.6, Sintaxe de SET.
Melhora do cdigo da replicao e seus recursos. See Seco 4.11, Replicao no MySQL.
Para uma lista completa de alteraes, visite a seo para cada distribuio 4.0.x individual.
Changed the default Windows service name for mysqld from MySql to MySQL. This should
not affect usage, because service names are not case sensitive.
When you install mysqld as a service on Windows systems, mysqld will read startup options
in option files from the option group with the same name as the service name. (Except when the
service name is MySQL).
889
Bugs fixed:
Fixed bug #1335 when filesort was never shown in EXPLAIN if query contained ORDER BY
NULL clause.
Fixed bug in range optimizer that caused wrong results for some not likely AND/OR queries.
(Bug #1828)
Fixed a crash in ORDER BY when ordering by expression and identifier. (Bug #1945)
Fixed a crash in an open HANDLER when an ALTER TABLE was executed in a different connection. (Bug #1826)
Fixed a bug in trunc* operator of full-text search which sometimes caused MySQL not to find
all matched rows.
Fixed optimiser bug, introduced in 4.0.16, when REF access plan was preferred to more efficient
RANGE on another column.
Fixed problem when installing a MySQL server as a Windows service using a command of the
form mysqld --install mysql --defaults-file=path-to-file.
Fixed an incorrect result from a query that uses only const tables (such as one-row tables) and
non-constant expression (such as RAND()). (Bug #1271)
Fixed bug when the optimiser did not take SQL_CALC_FOUND_ROWS into account if LIMIT
clause was present. (Bug #1274)
mysqlbinlog now asks for a password at the console when the -p or --password option is
used with no argument. This is consistent with the way that other clients such mysqladmin
and mysqldump already behave. Note: A consequence of this change is that it is no longer possible to invoke mysqlbinlog as mysqlbinlog -p pass_val (with a space between the
-p option and the following password value). (Bug #1595)
Bug accidentally introduced in 4.0.16 where the slave SQL thread deleted its replicated temporary tables when STOP SLAVE was issued.
In a ``chain'' replication setup A->B->C, if 2 sessions on A updated temporary tables of the same name at the same time, the binary log of B became incorrect, resulting in C becoming confused. (Bug #1686)
In a ``chain'' replication setup A->B->C, if STOP SLAVE was issued on B while it was replicating a temporary table from A, then when START SLAVE was issued on B, the binary log of B
became incorrect, resulting in C becoming confused. (Bug #1240)
Fixed bug when BIT_AND() and BIT_OR() group functions returned incorrect value if SELECT used a temporary table and no rows were found. (Bug #1790).
890
BIT_AND() is now unsigned in all contexts. This means that it will now return
18446744073709551615 (= 0xffffffffffffffff) instead of -1 if there were no rows in the result.
Fixed bug with BIT_AND() still returning signed value for an empty set in some cases. (Bug
#1972)
Fixed bug with ^ (XOR) and >> (bit shift) still returning signed value in some cases. (Bug
#1993)
Replication: a rare race condition in the slave SQL thread, which could lead to a wrong complain that the relay log is corrupted. (Bug #2011)
Replication: in the slave SQL thread, a multi-table UPDATE could produce a wrong complain
that some record was not found in one table, if the UPDATE was preceded by a INSERT ...
SELECT. (Bug #1701)
Write memory allocation information to error log when doing mysqladmin debug. This
only works on system that support the mallinfo() call (like newer Linux systems).
Added the following new server variables to allow more precise memory allocation: range_alloc_block_size, query_alloc_block_size, query_prealloc_size,
transaction_alloc_block_size, and transaction_prealloc_size.
mysqlbinlog now reads option files. To make this work one must now specify -read-from-remote-server when reading binary logs from a MySQL server. (Note that
using a remote server is deprecated and may disappear in future mysqlbinlog versions).
Block SIGPIPE signals also for non-threaded programs. The blocking is moved from
mysql_init() to mysql_server_init(), which is automatically called on the first call
to mysql_init().
New `> prompt for mysql. This prompt is similar to the '> and "> prompts, but indicates that
an identifier quoted with backticks was begun on an earlier line and the closing backtick has not
yet been seen.
A documentation change: Added a note that when backing up a slave, it is necessary also to back
up the master.info and relay-log.info files, as well as any SQL_LOAD-* files located in the directory specified by the --slave-load-tmpdir option. All these files are needed when the slave resumes replication after you restore the slave's data.
Bugs corrigidos:
Fixed a spurious error ERROR 14: Can't change size of file (Errcode: 2)
on Windows in DELETE FROM table_name without a WHERE clause or TRUNCATE TA891
Fixed a bug that resulted in thr_alarm queue is full warnings after increasing the
max_connections variable with SET GLOBAL. (Bug #1435)
Made LOCK TABLES to work when Lock_tables_priv is granted on the database level
and Select_priv is granted on the table level.
Fixed crash of FLUSH QUERY CACHE on queries that use same table several times (Bug
#988).
Fixed core dump bug when setting an enum system variable (such as SQL_WARNINGS) to
NULL.
Extended the default timeout value for Windows clients from 30 seconds to 1 year. (The timeout
that was added in MySQL 4.0.15 was way too short). This fixes a bug that caused ERROR
2013: Lost connection to MySQL server during query for queries that lasted longer than 30 seconds, if the client didn't specify a limit with mysql_options(). Users
of 4.0.15 on Windows should upgrade to avoid this problem.
Fixed and documented a problem when setting and using a user variable within the same SELECT statement. (Bug #1194).
Fixed bug in overrun check for BLOB values with compressed tables. This was a bug introduced
in 4.0.14. It caused MySQL to regard some correct tables containing BLOB values as corrupted.
(Bug #770, Bug #1304, and maybe Bug #1295)
SHOW GRANTS showed USAGE instead of the real column-level privileges when no table-level
privileges were given.
When copying a database from the master, LOAD DATA FROM MASTER dropped the corresponding database on the slave, thus erroneously dropping tables that had no counterpart on the
master and tables that may have been excluded from replication using replicate-*-table
rules. Now LOAD DATA FROM MASTER no longer drops the database. Instead, it drops only
the tables that have a counterpart on the master and that match the replicate-*-table rules. replicate-*-db rules can still be used to include or exclude a database as a whole from
LOAD DATA FROM MASTER. A database will also be included or excluded as a whole if there
are some rules like replicate-wild-do-table=db1.% or replicatewild-ignore-table=db1.%, as is already the case for CREATE DATABASE and DROP
DATABASE in replication. (Bug #1248)
Fixed a bug where mysqlbinlog crashed with a segmentation fault when used with the -h or
--host option. (Bug #1258)
Fixed a bug where mysqlbinlog crashed with a segmentation fault when used on a binary log
containing only final events for LOAD DATA. (Bug #1340)
Fixed compilation problem when compiling with OpenSSL 0.9.7 with disabled old DES support
(If OPENSSL_DISABLE_OLD_DES_SUPPORT option was enabled).
Fixed a bug when two (or more) MySQL servers were running on the same machine, and they
were both slaves, and at least one of them was replicating some LOAD DATA INFILE command from its master. The bug was that one slave MySQL server sometimes deleted the
SQL_LOAD-* files (used for replication of LOAD DATA INFILE and located in the slaveload-tmpdir directory, which defaults to tmpdir) belonging to the other slave MySQL server of this machine, if these slaves had the same slave-load-tmpdir directory. When that
happened, the other slave could not replicate LOAD DATA INFILE and complained about not
being able to open some SQL_LOAD-* file. (Bug #1357)
If LOAD DATA INFILE failed for a small file, the master forgot to write a marker (a Delete_file event) in its binary log, so the slave could not delete 2 files (SQL_LOAD-*.info
892
On Windows, the slave forgot to delete a SQL_LOAD-*.info file from tmpdir after successfully replicating a LOAD DATA INFILE command. (Bug #1392)
When a connection terminates, MySQL writes DROP TEMPORARY TABLE statements to the
binary log for all temporary tables which the connection had not explicitely dropped. MySQL
forgot to backquote the database and table names in the statement. (Bug #1345)
On some 64-bit machines (some HP-UX and Solaris machines), a slave installed with the 64-bit
MySQL binary could not connect to its master (it connected to itself instead). (Bug #1256, Bug
#1381)
Code was introduced in MySQL 4.0.15 for the slave to detect that the master had died while writing a transaction to its binary log. This code reported an error in a legal situation: When the slave I/O thread was stopped while copying a transaction to the relay log, the slave SQL thread
would later pretend that it found an unfinished transaction. (Bug #1475)
O mysqldump agora coloca todos os identificadores corretamente entre aspas ao conectar com
o servidor. Isto assegura que durante o processo de dump, O mysqldump nunca enviar consultas ao servidor que resultam em um erro de sintaxe. Este problema no est relacionado a sada
do programa mysqldump, que no foi alterado. (Bug #1148)
Altera a informao de metadados do resultado e assim MIN() e MAX() informamm que eles
podem retornar NULL (isto verdade porque um conjunto vazio retornar NULL). (Bug #324)
SHOW CREATE TABLE agora exibe as opes INDEX DIRECTORY e DATA DIRECTORY,
se eles fossem especificados quando a tabela era criada.
MATCH ... AGAINST() em modo de linguagem natural agora tratam de palavra presentes
em mais de 2,000,000 linhas como stopwords.
As imagens do disco de instalao do Mac OS X agora incluem um pacote MySQLStartupItem.pkg adicional que habilita a inicializao automtica do MySQL no boot do sistema. See
Seco 2.1.3, Instalando o MySQL no Mac OS X.
893
A maioria da documentao includa na distribuio tar do binrio (.tar.gz) foi movida para
o subdiretrio docs. See Seco 2.2.5, Layouts de Instalao.
O manual agora est includo com um arquivo info tradicional na distribuio binria. (Bug
#1019)
A distribuio binria agora incluem a biblioteca do servidor embutido (libmysqld) por padro. Devido a problemas de ligao com compiladores diferentes do gcc, ele no estava includo em todos os pacotes da distribuio inicial da verso 4.0.15. Os pacotes afetados forma reconstruidos e distribuidos como 4.0.15a. See Seco 1.5.1.2, Servidor Embutido MySQL.
O MySQL agora pode usar o otimizador de faixa para BETWEEN com limites no constantes.
(Bug #991)
Mensagens de erro de replicao agora incluem o banco de dados padro, assim os usurios podem verificar em qual banco de dados a consulta com erro est rodando.
Uma alterao da documentao: Adicionado um pargrafo sobre como as opes binlogdo-db e binlog-ignore-db so testadas em um banco de dados no master (see Seco 4.10.4, O Log Binrio), e um pargrafo sobre como replicate-do-db, replicate-do-table e opes anlogas so testadas em bancos de dados e tabelas no slave (see Seco 4.11.6, Opes de Inicializao da Replicao).
Agora o slave no replica SET PASSWORD se estiver configurado para excluir o banco de dados
mysql
da
replicao
(usando,
por
exemplo,
replicatewild-ignore-table=mysql.%). Este j era o caso para GRANT e REVOKE desde a verso
4.0.13 (embora houvesse o Bug #980 nas verses 4.0.13 & 4.0.14, que foi corrigido na verso
4.0.15).
Rewrote the information shown in the State column of SHOW PROCESSLIST for replication
threads and for MASTER_POS_WAIT() and added the most common states for these threads to
the documentation, see Seco 4.11.3, Detalhes de Implementao da Replicao.
Adiciona um teste na replicao para detectar o caso no qual o master morre no meio da gravao de uma transao no log binrio; tal transao inacabada agora dispara uma mensagem de
erro no slave.
Um comando GRANT que cria um usurio annimo (isto , uma conta com nome de usurio vazio) no exige mais FLUSH PRIVILEGES para a conta ser conhecida no servidor. (Bug #473)
Bugs corrigidos:
Corrigido o overflow do buffer no tratamewnto de senhas, que podia potencialmente ser explorardo pelo usurio MySQL com privilgios na tabela mysql.user para executar cdigo aleatrios para obter acessi com o UID do processo mysqld (obrgado a Jedi/Sector One por detectar
e reportar este erro.)
Corrigido um falha do servidor com FORCE INDEX em uma consulta contendo "Range checked for each record" na sada do EXPLAIN. (Bug #1172)
Corrigido o tratamento de permisso de tabelas/colunas - a ordenao apropriada (do mais especfico para o menos especfico, see Seco 4.3.10, Controle de Acesso, Estgio 2: Verificao
da Requisio) no era respeitada (Bug #928)
894
Corrigido um bug raro no MYISAM introduzido na verso 4.0.3 onde o handler do arquivo de
ndice no era diretamente atualizado depois de um UPDATE de registros dinamicos separados.
Corrigido o erro Can't unlock file ao executar myisamchk --sort-index no Windows. (Bug #1119)
Corrigido um bug de overflow em MyISAM e ISAM quando um registro era atualiado na tabela
com um grande nmero de colunas e pelo meno uma coluna BLOB/TEXT.
Corrigido um resultado incorreto ao fazer UNION e LIMIT #,# quando no era usado parenteses na parte SELECT.
Corrigidos um erro de pilha indesejado quando tinhamos uma grande expresso do tipo
1+1-1+1-1... de uma ceta combinao. (Bug #871)
Corrigido o erro que algumas vezes fazia uma tabela com um ndice FULLTEXT estar marcada
como "analyzed".
Corrigido o MySQL para que o tamanho do campo (na API C) para a segunda coluna em SHOW
CREATE TABLE seja sempre maior que o tamanho do dado. A nica aplicao conhecida que
era afetada pelo comportamento anterior era o Borland dbExpress, que truncava a sada do comando. (Bug #1064)
Corrigido um erro no tratamento de tabelas MyISAM compactadas que algumas vezes torna impossvel se reparar tabelas compactadas no modo "Repair by sort". "Repair with keycache"
(myisamchk --safe-recover) funcionad. (Bug #1015)
Correo de um erro na propagao do nmero da verso do manual includo no arquivo de distribuio. (Bug #1020)
Adicionado alguns arquivos que faltavam na arquivo de especificao do RPM e corrigido alguns erros de criao do RPM que ocorriam no Red Hat Linux 9. (Bug #998)
Corrigido um erro com processamento na cache de consultas com tabelas unidas a partir de mais
de 255 tabelas. (Bug #930)
895
Correo dos resultados incorretos da consulta outer join (ex. LEFT JOIN) quando a condio
ON sempre falsa, e a faixa de busca usada. (Bug #926)
Corrigido um erro que fazia uma tabela vazia ser marcada como "analyzed". (Bug #937)
Corrigido o ALTER TABLE lento (quando comparado a verso 3.23) e comandos relacionados
tais como CREATE INDEX. (Bug #712)
Correo de segmentation fault resultante de LOAD DATA FROM MASTER quando o mestre
estava executando sem a opo --log-bin. (Bug #934)
Corrigido um erro de segurana: Um servidor compilado com suporte a SSL ainda permitia conexes por usurios que tinham a opo REQUIRE SSL especificadas por suas contas.
Corrigido um erro aleatrio: Algumas vezes o slave replicava consultas GRANT ou REVOKE
mesmo se estivesse configurado para excluir o banco de dados mysql da replicao (por exemplo, usando replicate-wild-ignore-table=mysql.%). (Bug #980)
Os campos Last_Errno e Last_Error na sada de SHOW SLAVE STATUS agora so limpadas por CHANGE MASTER e quando a thread slave de SQL inicia. (Bug #986)
Um erro de documentao: ela dizia que RESET SLAVE no altera a informao de conexo
(master host, port, user e password), embora ela o fizesse. A instruo retorna estes valores para
a opo de inicializao (master-host etc) se houvesse alguma. (Bug #985)
SHOW SLAVE STATUS agora exibe a informao correta (master host, port, user e password)
depois de RESET SLAVE (isto , ela mostra os novos valores, que so copiados das opes de
inicializao se houver alguma). (Bug #985)
Disabilitada a propagao da posio original do log do master para eventos porque isto gerava
valores inesperados para Exec_Master_Log_Pos e problemas com MASTER_POS_WAIT() em configuraes de replicao A->B->C. (Bug #1086)
Corrigido uma segmentation fault no mysqlbinlog quando --position=x era usado com
x estando entre um evento Create_file e o evento Append_block, Exec_load ou Delete_file. (Bug #1091)
mysqlbinlog exibia avisos superfluos quando se usava --database, o que causava erro de
sintaxe quando enviado para mysql. (Bug #1092)
Quando, em uma transao, um tabela transacional (como uma tabela InnoDB) era atualizada, e
posteriormente na mesma transao um tabela no transacional (como um tabela MyISAM) era
atualizada usando o contedo atualizado da tabela transacional (com INSERT ... SELECT
por exemplo), as consultas eram escritas no log binrio em uma ordem incorreta. (Bug #873)
896
Quando em uma transao, INSERT ... SELECT atualizava uma tabela no transacional, e
um ROLLBACK era executado, nenhum erro era atualizado para o cliente. Agora o cliente avisado que no se pode fazer roll back de algumas alteraes, como j era o caso para um INSERT normal. (Bug #1113)
Corrigido um erro portencial: Quando STOP SLAVE era executado enquanto a thread slave de
SQL estava no meio de uma transao, e ento CHANGE MASTER era usado para direcionar para o slave para alguma instruo no transacional, a thread slave de SQL ficava confusa (porque
ela ainda podia achar que estava em uma transao).
InnoDB agora suporta indexao pelo prefixo de um campo. Isto significa, em particularm que
as colunas BLOB e TEXT pode ser indexadas em tabelas InnoDB, o que no era possvel antes.
Alterado levemente o otimizador para preferir busca de ndice sobre busca em toda a tabela em
alguns casos limites.
Adicionado uma varivel especifica da thread, max_seeks_for_key, que pode ser usada para forar a otimizao para usar chaves em vez de varrer a tabela, mesmo se a cardinalidade do
ndice for baixa.
Adicionada a otimizao que converte LEFT JOIN para joins normais em alguns casos.
Uma alterao de documentao: adicionado avisos sobre uso seguro do comando CHANGE
MASTER. See Seco 4.11.8.1, CHANGE MASTER TO.
O MySQL agora envia um aviso (e no um erro, como na verso 4.0.13) quando ele abre uma
tabela que foi criada com o MySQL 4.1.
Adicionada a opo --nice para mysqld_safe para permitir configurar a exatido do processo mysqld. (Obrigado a Christian Hammers por fornecer o patch inicial.) (Bug #627)
SHOW BINLOG EVENTS FROM x onde x menor que 4, agora converte silenciosamente x
para 4 em vez de exibir um erro. A mesma alterao foi feita para CHANGE MASTER TO
MASTER_LOG_POS=x e CHANGE MASTER TO RELAY_LOG_POS=x.
mysqld agora s adiciona um tratamento de interrupo para o sinal SIGINT se voc comelo com a nova opo --gdb. Isto porque alguns usurios MySQL encontraram alguns proble897
FLUSH LOGS agora rotaciona os relay logs em adio aos outros tipos de logs que ele j rotacionava.
Bugs corrigidos:
ALTER TABLE ... UNION=(...) para uma tabela MERGE agora permitida mesmo que
alguma tabela MyISAM seja somente leitura. (Bug #702)
Corrigida um estouro de memria ao se fazer REPAIR em uma tabela com uma chave auto incremento multi-partes onde uma parte era um pacote CHAR.
Corrigida uma provvel condio de corrida no cdigo da replicao que podia levar potencialmente a instrues INSERT no sendo replicadas no evento de um comando FLUSH LOGS ou
quando o log binrio excede max_binlog_size. (Bug #791)
Corrigido um bug que pode levar a falha em INTERVAL e GROUP BY ou DISTINCT. (Bug
#807)
Corrigido um bug no mysqlhotcopy, assim ele agora aborta em operaes de cpia de tabelas sem sucesso. Corrigido outro bug, assim ele obtem sucesso quando houver milhares de tabelas para copiar. (Bug #812)
Corrigido o problema com mysqlhotcopy que falhava ao ler opes do arquivo de opo.
(Bug #808)
Corrigido um bug no otimizador que algumas vezes prevenia o MySQL de usar ndices FULLTEXT mesmo se fosse possvel (por exemplo, em SELECT * FROM t1 WHERE MATCH
a,b AGAINST("index") > 0).
Corrigido um problema de segurana no qual usurios habilitados sem privilgios obtinham informaes na lista de banco de dados existentes usando SHOW TABLES e comandos parecidos.
898
HANDLER sem um ndice agora funciona apropriadamente quando uma tabela tem registros deletados. (Bug #787)
Corrigida a falha do servidor em PURGE MASTER LOGS ou SHOW MASTER LOGS quando o
log binrio estava desligado. (Bug #733)
Corrigido um erro na comparao de uma coluna DATETIME e uma constante inteira. (Bug
#504)
Corrigido ERROR 1105: Unknown error que ocorria para algumas consultas SELECT,
onde uma coluna declarada como NOT NULL era comparada com uma expresso que podia tomar o valor NULL.
Corrigido resultados incorretos de MATCH ... AGAINST usado com uma consulta LEFT
JOIN.
Corrigido um bug que limitava o valor mximo para variveis mysqld em 4294967295 quando
eles eram especificados na linha de comando.
Corrigido um bug que algumas vezes causavam falsos erros de ``Access denied'' nas instrues
HANDLER ... READ, quando uma tabela referenciada via um alias.
Corrigido um problema de portabilidade com safe_malloc, o qual fazia com que o MySQL
para enviar erros de "Freeing wrong aligned pointer" no SCO 3.2.
ALTER TABLE ... ENABLE/DISABLE KEYS podia causar um core dump quando feito
depois de uma instruo INSERT DELAYED na mesma tabela.
Corrigido um problema com converso da hora local para GMT onde algumas vezes resultava
em diferentes (mas corretos) timestamps. Agora o MySQL deve usar o menor valor de possvel
neste caso. (Bug #316)
Uma cache de consultas muito pequena podia fazer o mysqld falhar. (Bug #549)
Corrigido um bug (acidentalemnte introduzida por ns mas presente apenas na verso 4.0.13)
que faz INSERT ... SELECT em uma coluna AUTO_INCREMENT que no replica bem. Este bug est no master, no no slave. (Bug #490)
Corrigido um bug: Quando uma instruo INSERT ... SELECT inseria linhas em uma tabela no transacional, mas falhava no mesmo ponto (por exemplo, devido a erros de ``Duplicate
key''), a consulta no era escrita no log binrio. Agora ela escrita no log binrio, com seus cdigos de erros, como todas as outras cosultas so. Sobre a opo slave-skip-errors para
como tratar consultas completadas parcialmente no slave, veja Seco 4.11.6, Opes de Inicializao da Replicao. (Bug #491)
SET FOREIGN_KEY_CHECKS=0 no era replicado apropriadamente. A correo provavelmente no ser feita para 3.23.
Em um slave, LOAD DATA INFILE sem clusulas IGNORE ou REPLACE no master, era replicada com IGNORE. Enquanto isto no for um problemase os dados do master e slave so
899
identicos (em LOAD que no produz conflitos de duplicao no master no produzir nada no
slave de qualquer forma), o que verdade em operaes normais, para depurao melhor no
adicionar silenciosamente o IGNORE. Deste modo, voc pode obter uma mensagem de erro no
slave e descobrir que por alguma razo, os dados no master e slave so diferentes e investigar o
porque. (Bug #571)
Em um slave, LOAD DATA INFILE exibia uma mensagem incomplete ``Duplicate entry
'%-.64s' for key %d''' (o nome e valor da chave no eram mencionados) no caso de conflito de
duplicao (o que no acontece em operaes normais). (Bug #573)
Ao fazer um LOCK TABLES WRITE em uma tabela InnoDB, o commit podia no acontecer,
se a consulta no era escrita no log binrio (por exemplo, se --log-bin no era usado, ou
binlog-ignore-db era usado). (Bug #578)
Se um master na verso 3.23 tivesse aberto tabelas temporrias que tinham sido replicadas para
um slave na verso 4.0, e o log binrio rotacionado, estas tabelas temporrias eram automaticamente removidas pelo slave (o que causa problemas se o master os utiliza subsequecialmente).
Este erro foi corrigido na verso 4.0.13, mas de um modo que cria um incovenincia indesejada:
se o master na verso 3.23 morrer brutalmente. (queda de fora), sem tempo suficiente para escrever automaticamente instrues DROP TABLE em seu log binrio. ento o slave na verso
4.0.13 no notificaria que as tabelas temporrias tinham sido removidas, at o servidor mysqld
slave ter sido reiniciado. Este pequeno incoveniente est corrigido na verso 3.23.57 e 4.0.14
(significando que o master deve ser atualizado para a verso 3.23.57 e o slave para a 4.0.14 para
remover o incoveniente). (Bug #254)
Se uma consulta era ignorada no slave (devido a replicate-ignore-table e outras regras similares), o escravo ainda verifica se a consulta consegue o mesmo cdigo de erro (0, sem
erro) como no master. Assim se o master tiver um erro na consulta (por exemplo, ``Duplicate
entry'' em uma insero de mltiplas linhas), ento o slave parava e avisava que cdigo de erro
no coincidia. (Bug #797)
TO
RE-
O pacote de binrios do Windows agora est compilado com --enable-local-infile encontrar a configurao de construo do Unix.
SHOW MASTER STATUS e SHOW SLAVE STATUS exigem o privilgio SUPER; agora eles
aceitam REPLICATION CLIENT. (Bug #343)
Adicionada otimizao de reparao do MyISAM em multi-threads e a varivel myisam_repair_threads para habilit-lo. See Seco 4.6.8.4, SHOW VARIABLES.
900
Adicionada a varivel innodb_max_dirty_pages_pct que controla a quantidade de pginas ``sujas'' permitidas na rea de buffer do InnoDB.
As mensagens de erro CURRENT_USER() e Access denied agora relatam o nome de mquina exatamente como ele est especificado no comando GRANT.
Removido os resultados de benchmark das distribuies fonte e binrias. Eles ainda esto disponveis na rvore fonte do BK.
O MySQL agora envia um erro quando ele abre uma tabela que foi criada com o MySQL 4.1.
A opo --new agora altera altera os itens binrios (0xFFDF) para serem tratados como strings
binrias em vez de nmeros por padro. Isto corrige alguns problemas com conjunto de caracteres onde conveniente colocar a string como um item binrio. Depois destas alteraes voc deve converter a string binria para INTEGER com um CAST se voc quiser comparar dois itens
binrios, um com o outro, e saber qual maior. SELECT CAST(0xfeff AS UNSIGNED)
< CAST(0xff AS UNSIGNED). Este ser o comportamento padro no MySQL 4.1. (Bug
#152)
Alterado o UPDATE ... LIMIT para aplicar o limite as linhas encontradas, independente de
terem sido alteradas. Anteriormente o limite era aplicado como uma restrio no nmero de linhas alteradas.
Adicionado avisos ao log de erro do porqu de um falha em uma conexo segura (quando executando com --log-warnings).
Adicionado o recurso para SHOW KEYS para mostrar chaves que esto disabilitadas pelo comando ALTER TABLE DISABLE KEYS.
Ao usar um tipo de tabela no existente com CREATE TABLE, primeiro v se o tipo de tabela
padro existe antes de utilizar MyISAM.
Renomeada a funo rnd para my_rnd j que o nome era muito genrico e um smbolo exportado no libmysqlclient (obrigado a Dennis Haney pelo patch inicial).
mysqldump no deleta mais o log binrio sem aviso quando chamado com --master-data
ou --first-slave; enquanto este comportamento era conveniente para alguns usurios, outros podia sofrer com ele. Agora deve perguntar explicitamente pela sua deleo com a nova opo --delete-master-logs.
Se
slave
configurado
901
(usando,
por
exemplo,
replicate-
A mensagem de erro Access denied ao logar tinha um valor Using password incorreto.
(Bug #398)
Corrigido um bug com NATURAL LEFT JOIN, NATURAL RIGHT JOIN e RIGHT JOIN
quando usadas muitas tabelas em joins. O problema era que o mtodo JOIN no era sempre associoado com as tabelas envolvida no mtodo JOIN. Se voc tiver uma consulta que usa muitos
RIGHT JOIN ou NATURAL ... JOINS voc deve verificar se eles funcionam como voc
espera depois de atualizar o MySQL para esta versa. (Bug #291)
O cliente de linha de comando mysql no olha mais os comnados \* dentro de stringd com aspas invertidas.
Corrigido o problema com o modo ANSI e GROUP BY com constantes. (Bug #387)
Executa mysql_install_db com a opo -IN-RPM para a instalao do Mac OS X no falhar em sistemas com a configurao de nome de mquina feita de forma inapropriada.
LOAD DATA INFILE agora ir ler 000000 como uma data zerada em vez de
"2000-00-00".
Corrigido um erro que fazia que DELETE FROM table WHERE const_expression
sempre deletasse toda a tabela (mesmo se o resultado da expresso fosse falso). (Bug #355)
Fixed a crash in REPAIR ... USE_FRM command, when used on read-only, nonexisting table or a table with a crashed index file.
Fixed a crashing bug in mysql monitor program. It occurred if program was started with -no-defaults, with a prompt that contained hostname and connection to non-existing db
was requested
Fixed problem when comparing a key for a multi-byte-character set. (Bug #152)
Fixed bug in LEFT, RIGHT and MID when used with multi-byte character sets and some
GROUP BY queries. (Bug #314)
Fix problem with ORDER BY being discarded for some DISTINCT queries. (Bug #275)
Fixed that SET SQL_BIG_SELECTS=1 works as documented (This corrects a new bug introduced in 4.0)
Fixed some serious bugs in UPDATE ... ORDER BY. (Bug #241)
902
Fixed unlikely problem in optimising WHERE clause with constant expression like in WHERE 1
AND (a=1 AND b=1).
FULLTEXT index stopped working after ALTER TABLE that converts TEXT column to CHAR.
(Bug #283)
Fixed a security problem with SELECT and wildcarded select list, when user only had partial
column SELECT privileges on the table.
Mark a MyISAM table as "analyzed" only when all the keys are indeed analyzed.
Only ignore world-writeable my.cnf files that are regular files (and not, for example, named
pipes or character devices).
SUM() didn't return NULL when there was no rows in result or when all values was NULL.
On Unix symbolic links handling was not enabled by default and there was no way to turn this
on.
Fixed a bug in ALTER TABLE ENABLE / DISABLE KEYS which failed to force a refresh
of table data in the cache.
Fixed bugs in replication of LOAD DATA INFILE for custom parameters (ENCLOSED, TERMINATED and so on) and temporary tables. (Bug #183, Bug #222)
Fixed a replication bug when the master is 3.23 and the slave 4.0: the slave lost the replicated
temporary tables if FLUSH LOGS was issued on the master. (Bug #254)
Fixed a bug when doing LOAD DATA INFILE IGNORE: When reading the binary log,
mysqlbinlog and the replication code read REPLACE instead of IGNORE. This could make
the slave's table become different from the master's table. (Bug #218)
Fixed a deadlock when relay_log_space_limit was set to a too small value. (Bug #79)
Fixed a bug in HAVING clause when an alias is used from the select list.
Fixed overflow bug in MyISAM when a row is inserted into a table with a large number of columns and at least one BLOB/TEXT column. Bug was caused by incorrect calculation of the needed buffer to pack data.
Fixed a bug when SELECT @nonexistent_variable caused the error in client - server protocol
due to net_printf() being sent to the client twice.
Fixed a bug in SHOW PROCESSLIST which only displayed a localhost in the "Host" column.
903
This was caused by a glitch that only used current thread information instead of information
from the linked list of threads.
Removed unnecessary Mac OS X helper files from server RPM. (Bug #144)
Fixed a bug in multiple-table updates that caused some rows to be updated several times.
Fixed a bug in mysqldump when it was called with --master-data: the CHANGE MASTER TO commands appended to the SQL dump had incorrect coordinates. (Bug #159)
Fixed a bug when an updating query using USER() was replicated on the slave; this caused segfault on the slave. (Bug #178). USER() is still badly replicated on the slave (it is replicated to
"").
SHOW PROCESSLIST will now include the client TCP port after the hostname to make it easier to know from which client the request originated.
Bugs fixed:
INSERT INTO u SELECT ... FROM t was written too late to the binary log if t was very
frequently updated during the execution of this query. This could cause a problem with mysqlbinlog or replication. The master must be upgraded, not the slave. (Bug #136)
Fixed a bug with multiple-table updates with InnoDB tables. This bug occurred as, in many cases, InnoDB tables cannot be updated ``on the fly,'' but offsets to the records have to be stored
in a temporary table.
Fixed a bug with multi-table UPDATE statements when user had all privileges on the database
where tables are located and there were any entries in tables_priv table, that is,
grant_option was true.
Fixed a bug that allowed a user with table or column grants on some table, TRUNCATE any table
in the same database.
Fixed deadlock when doing LOCK TABLE followed by DROP TABLE in the same thread. In
904
this case one could still kill the thread with KILL.
LOAD DATA LOCAL INFILE was not properly written to the binary log (hence not properly
replicated). (Bug #82)
RAND() entries were not read correctly by mysqlbinlog from the binary log which caused
problems when restoring a table that was inserted with RAND(). INSERT INTO t1 VALUES(RAND()). In replication this worked ok.
SET SQL_LOG_BIN=0 was ignored for INSERT DELAYED queries. (Bug #104)
LOAD DATA INFILE was not replicated by the slave if replicate_*_table was set on
the slave. (Bug #86)
After RESET SLAVE, the coordinates displayed by SHOW SLAVE STATUS looked un-reset
(though they were, but only internally). (Bug #70)
Fixed a bug in handling CHAR(0) columns that could cause incorrect results from the query.
Fixed rare bug with incorrect initialisation of AUTO_INCREMENT column, as a secondary column in a multi-column key (see Seco 3.6.9, Usando AUTO_INCREMENT), when data was
inserted with INSERT ... SELECT or LOAD DATA into an empty table.
On Windows, STOP SLAVE didn't stop the slave until the slave got one new command from
the master (this bug has been fixed for MySQL 4.0.11 by releasing updated 4.0.11a Windows
packages, which include this individual fix on top of the 4.0.11 sources). (Bug #69)
Fixed a crash when no database was selected and LOAD DATA command was issued with full
table name specified, including database prefix.
Fixed a crash when shutting down replication on some platforms (for example, Mac OS X).
Fixed the bigint test to not fail on some platforms (for example, HP-UX and Tru64) due to
different return values of the atof() function.
Fixed the rpl_rotate_logs test to not fail on certain platforms (e.g. Mac OS X) due to a
too long file name (changed slave-master-info.opt to .slave-mi).
NULL is now sorted LAST if you use ORDER BY ... DESC (as it was before MySQL 4.0.2).
This change was required to comply with the SQL-99 standard. (The original change was made
because we thought that SQL-99 required NULL to be always sorted at the same position, but
this was incorrect).
Added START TRANSACTION (SQL-99 syntax) as alias for BEGIN. This is recommended to
use instead of BEGIN to start a transaction.
905
Added support for some new INNER JOIN and JOIN syntaxes. For example, SELECT *
FROM t1 INNER JOIN t2 didn't work before.
Novell NetWare 6.0 porting effort completed, Novell patches merged into the main source tree.
Bugs fixed:
Fixed a problem with BLOB NOT NULL columns used with IS NULL.
Re-added missing pre- and post(un)install scripts to the Linux RPM packages (they were missing after the renaming of the server subpackage).
Fixed that table locks are not released with multi-table updates and deletes with InnoDB storage
engine.
Fixed integer-wraparound when giving big integer (>= 10 digits) to function that requires an unsigned argument, like CREATE TABLE (...) AUTO_INCREMENT=#.
MIN(key_column) could in some cases return NULL on a column with NULL and other values.
MIN(key_column) and MAX(key_column) could return incorrect values if one of the tables was empty.
Fixed bug in using aggregate functions as argument for INTERVAL, CASE, FIELD, CONCAT_WS, ELT and MAKE_SET functions.
When running with --lower-case-table-names (default on Windows) and you had tables or databases with mixed case on disk, then executing SHOW TABLE STATUS followed
with DROP DATABASE or DROP TABLE could fail with Errcode 13.
Added optimization that if one does GROUP BY ... ORDER BY NULL then result is not
sorted.
906
New --ft-stopword-file command-line option for mysqld to replace/disable the builtin stopword list that is used in full-text searches. See Seco 4.6.8.4, SHOW VARIABLES.
Changed default stack size from 64K to 192K; This fixes a core dump problem on Red Hat 8.0
and other systems with a glibc that requires a stack size larger than 128K for gethostbyaddr() to resolve a hostname. You can fix this for earlier MySQL versions by starting
mysqld with --thread-stack=192K.
Added mysql_waitpid to the binary distribution and the MySQL-client RPM subpackage
(required for mysql-test-run).
Renamed the main MySQL RPM package to MySQL-server. When updating from an older
version, MySQL-server.rpm will simply replace MySQL.rpm.
If a slave is configured with replicate_wild_do_table=db.% or replicate_wild_ignore_table=db.%, these rules will be applied to CREATE/DROP DATABASE too.
Bugs fixed:
Fixed initialisation of the random seed for newly created threads to give a better rand() distribution from the first call.
Fixed a bug that caused mysqld to hang when a table was opened with the HANDLER command and then dropped without being closed.
Fixed bug in logging to binary log (which affects replication) a query that inserts a NULL in an
AUTO_INCREMENT column and also uses LAST_INSERT_ID().
Fixed an unlikely bug that could cause a memory overrun when using ORDER BY constant_expression.
On some 64 bit systems, show status reported a strange number for Open_files and
Open_streams.
Fixed bug in LEFT JOIN that caused zero rows to be returned in the case the WHERE condition
was evaluated as FALSE after reading const tables. (Unlikely condition).
FLUSH
PRIVILEGES didn't
mysql.tables_priv is empty.
Fixed bug in replication when using LOAD DATA INFILE one a file that updated an AUTO_INCREMENT column with NULL or 0. This bug only affected MySQL 4.0 masters (not slaves or MySQL 3.23 masters). Note: If you have a slave that has replicated a file with generated
AUTO_INCREMENT columns then the slave data is corrupted and you should reinitialise the affected tables from the master.
Fixed possible memory overrun when sending a BLOB value larger than 16M to the client.
Fixed incorrect error message when setting a NOT NULL column to an expression that returned
NULL.
correctly
907
flush
table/column
privileges
when
Fixed core dump bug in str LIKE "%other_str%" where str or other_str contained
characters >= 128.
Fixed bug: When executing on master LOAD DATA and InnoDB failed with table full error the binary log was corrupted.
OPTIMIZE TABLE will for MyISAM tables treat all NULL values as different when calculating cardinality. This helps in optimising joins between tables where one of the tables has a lot
of NULL values in a indexed column:
SELECT * from t1,t2 where t1.a=t2.key_with_a_lot_of_null;
Added join operator FORCE INDEX (key_list). This acts likes USE INDEX
(key_list) but with the addition that a table scan is assumed to be VERY expensive. One
bad thing with this is that it makes FORCE a reserved word.
Reset internal row buffer in MyISAM after each query. This will reduce memory in the case you
have a lot of big blobs in a table.
Bugs fixed:
A security patch in 4.0.8 causes the mysqld server to die if the remote hostname can't be resolved. This is now fixed.
Fixed crash when replication big LOAD DATA INFILE statement that caused log rotation.
One
can
now
specify
max_allowed_packet
in
mysql_options(MYSQL_READ_DEFAULT_FILE). for clients.
When sending a too big packet to the server with the not compressed protocol, the client now
gets an error message instead of a lost connection.
We now send big queries/result rows in bigger hunks, which should give a small speed improvement.
Fixed some bugs with the compressed protocol for rows > 16M.
InnoDB tables now also support ON UPDATE CASCADE in FOREIGN KEY constraints. See
the InnoDB section in the manual for the InnoDB changelog.
Bugs fixed:
908
file
ready
by
Fixed a bug in handling communication packets bigger than 16M. Unfortunately this required a
protocol change; If you upgrade the server to 4.0.8 and above and have clients that uses packets
>= 255*255*255 bytes (=16581375) you must also upgrade your clients to at least 4.0.8. If you
don't upgrade, the clients will hang when sending a big packet.
Fixed bug in GROUP BY when used on BLOB column with NULL values.
mysqlbug now also reports the compiler version used for building the binaries (if the compiler
supports the option --version).
Bugs fixed:
Fixed some optimization problems when compiling MySQL with -DBIG_TABLES on a 32 bit
system.
mysql_drop_db() didn't check permissions properly so anyone could drop another users database. DROP DATABASE is checked properly.
Added syntax support for CHARACTER SET xxx and CHARSET=xxx table options (to be
able to read table dumps from 4.1).
Fixed replication bug that caused the slave to loose its position in some cases when the replication log was rotated.
Fixed that a slave will restart from the start of a transaction if it's killed in the middle of one.
Moved the manual pages from man to man/man1 in the binary distributions.
The default type returned by IFNULL(A,B) is now set to be the more 'general' of the types of
A and B. (The order is STRING, REAL or INTEGER).
Added Qcache_lowmem_prunes status variable (number of queries that were deleted from
cache because of low memory).
Bulk insert optimization (see Seco 4.6.8.4, SHOW VARIABLES) is no longer used when inserting small (less than 100) number of rows.
Optimization added for queries like SELECT ... FROM merge_table WHERE indexed_column=constant_expr.
The CURRENT_USER() function can be used to get a user@host value as it was matched in
the GRANT system. See Seco 6.3.6.2, Funes Diversas.
Fixed CHECK constraints to be compatible with SQL-99. This made CHECK a reserved word.
(Checking of CHECK constraints is still not implemented).
Added PostgreSQL compatible LIMIT syntax: SELECT ... LIMIT row_count OFFSET offset
mysql_change_user() will now reset the connection to the state of a fresh connect (Ie,
ROLLBACK any active transaction, close all temporary tables, reset all user variables etc..)
CHANGE MASTER and RESET SLAVE now require that slave threads be both already stopped;
these commands will return an error if at least one of these two threads is running.
Bugs fixed:
A fix for the bug in a SELECT with joined tables with ORDER BY and LIMIT clause when filesort had to be used. In that case LIMIT was applied to filesort of one of the tables, although it
could not be. This fix also solved problems with LEFT JOIN.
mysql_server_init() now makes a copy of all arguments. This fixes a problem when
using the embedded server in C# program.
Fixed buffer overrun in libmysqlclient library that allowed a malicious MySQL server to
crash the client application.
Fixed security-related bug in mysql_change_user() handling. All users are strongly recommended to upgrade to version 4.0.6.
Fixed bug that prevented --chroot command-line option of mysqld from working.
Fixed bug that caused OPTIMIZE TABLE to corrupt the table under some rare circumstances.
Part rewrite of multi-table-update to optimise it, make it safer and more bug free.
Port number was added to host name (if it is known) in SHOW PROCESSLIST command
Changed handling of last argument in WEEK() so that one can get week number according to
the ISO 8601 specification. (Old code should still work).
Fixed that INSERT DELAYED threads doesn't hang on Waiting for INSERT when one
sends a SIGHUP to mysqld.
Change that AND works according to SQL-99 when it comes to NULL handling. In practice, this
only affects queries where you do something like WHERE ... NOT (NULL AND 0).
mysqld will now resolve basedir to its full path (with realpath()). This enables one to
use relative symlinks to the MySQL installation directory. This will however cause show variables to report different directories on systems where there is a symbolic link in the path.
Fixed that MySQL will not use index scan on index disabled with IGNORE INDEX or USE
INDEX. to be ignored.
Added --use-frm option to mysqlcheck. When used with REPAIR, it gets the table structure from the .frm file, so the table can be repaired even if the .MYI header is corrupted.
Fixed bug in MAX() optimization when used with JOIN and ON expressions.
BETWEEN behaviour changed (see Seco 6.3.1.2, Operadores de Comparao). Now datetime_col BETWEEN timestamp AND timestamp should work as expected.
DELETE FROM myisam_table now shrinks not only the .MYD file but also the .MYI file.
When one uses the --open-files-limit=# option to mysqld_safe it's now passed on
to mysqld.
Changed output from EXPLAIN from 'where used' to 'Using where' to make it more
in line with other output.
Updated source tree to be built using automake 1.5 and libtool 1.4.
Fixed an inadvertently changed option (--ignore-space) back to the original -ignore-spaces in mysqlclient. (Both syntaxes will work).
Added support for DROP TEMPORARY TABLE ..., to be used to make replication safer.
When transactions are enabled, all commands that update temporary tables inside a BEGIN/
COMMIT are now stored in the binary log on COMMIT and not stored if one does ROLLBACK.
This fixes some problems with non-transactional temporary tables used inside transactions.
911
Allow braces in joins in all positions. Formerly, things like SELECT * FROM (t2 LEFT
JOIN t3 USING (a)), t1 worked, but not SELECT * FROM t1, (t2 LEFT JOIN
t3 USING (a)). Note that braces are simply removed, they do not change the way the join is
executed.
InnoDB now supports also isolation levels READ UNCOMMITTED and READ COMMITTED.
For a detailed InnoDB changelog, see Seco 7.5.16, Histrico de Alteraes do InnoDB in
this manual.
Bugs fixed:
Fixed bug in MAX() optimization when used with JOIN and ON expressions.
Fixed that INSERT DELAY threads don't hang on Waiting for INSERT when one sends a
SIGHUP to mysqld.
Fixed that MySQL will not use an index scan on an index that has been disabled with IGNORE
INDEX or USE INDEX.
Fixed error message issued when storage engine cannot do CHECK or REPAIR.
Fixed rare core dump problem in complicated GROUP BY queries that didn't return any result.
Fixed mysqlshow to work properly with wildcarded database names and with database names
that contain underscores.
Portability fixes to get MySQL to compile cleanly with Sun Forte 5.0.
Fixed MyISAM crash when using dynamic-row tables with huge numbers of packed fields.
Fixed bug in full-text search IN BOOLEAN MODE that made MATCH to return incorrect relevance value in some complex joins.
Fixed a bug that limited MyISAM key length to a value slightly less that 500. It is exactly 500
now.
Fixed that GROUP BY on columns that may have a NULL value doesn't always use disk based
temporary tables.
The filename argument for the --des-key-file argument to mysqld is interpreted relative
to the data directory if given as a relative pathname.
Removed a condition that temp table with index on column that can be NULL has to be
MyISAM. This was okay for 3.23, but not needed in 4.*. This resulted in slowdown in many queries since 4.0.2.
Fixed a newly introduced bug that caused ORDER BY ... LIMIT row_count to not return all rows.
Fixed a bug in multi-table deletes when outer join is used on an empty table, which gets first to
be deleted.
912
Fixed bug that caused REPAIR TABLE and myisamchk to corrupt FULLTEXT indexes.
Fixed bug with caching the mysql grant table database. Now queries in this database are not cached in the query cache.
Give error if a MyISAM MERGE table has more than 2 ^ 32 rows and MySQL was not compiled
with -DBIG_TABLES.
Fixed bug where GRANT/REVOKE failed if hostname was given in non-matching case.
Don't give warning in LOAD DATA INFILE when setting a timestamp to a string value of
'0'.
One didn't get an error message if mysqld couldn't open the privilege tables.
SET PASSWORD FOR ... closed the connection in case of errors (bug from 4.0.3).
Fixed bug when doing a multi-line INSERT on a table with an AUTO_INCREMENT key which
was not in the first part of the key.
Changed LOAD DATA INFILE to not recreate index if the table had rows from before.
--skip-ssl can now be used to disable SSL in the MySQL clients, even if one is using other
SSL options in an option file or previously on the command line.
Fixed bug in MATCH ... AGAINST( ... IN BOOLEAN MODE) used with ORDER BY.
Added LOCK TABLES and CREATE TEMPORARY TABLES privilege on the database level.
One must run the mysql_fix_privilege_tables script on old installations to activate
these.
Fixed problem in replication that FLUSH LOGS in a circular replication setup created an infinite
number of binary log files. Now a rotate-binary-log command in the binary log will not
cause slaves to rotate logs.
Removed STOP EVENT from binary log when doing FLUSH LOGS.
Disable the use of SHOW NEW MASTER FOR SLAVE as this needs to be completely reworked
in a future release.
Fixed a bug with constant expression (for example, field of a one-row table, or field from a ta913
FLUSH LOGS removed numerical extension for all future update logs.
GRANT ... REQUIRE didn't store the SSL information in the mysql.user table if SSL
was not enabled in the server.
GRANT ... REQUIRE NONE can now be used to remove SSL information.
REQUIRE option was not properly saved, which could cause strange output in SHOW GRANTS.
Fixed that mysqld --help reports correct values for --datadir and --bind-address.
Fixed that one can drop UDFs that didn't exist when mysqld was started.
Fixed core dump problem with SHOW VARIABLES on some 64 bit systems (like Solaris sparc).
Fixed a bug in my_getopt(); --set-variable syntax didn't work for those options that
didn't have a valid variable in the my_option struct. This affected at least the default-table-type option.
Fixed a bug from 4.0.2 that caused REPAIR TABLE and myisamchk --recover to fail on
tables with duplicates in a unique key.
Fixed a bug from 4.0.3 in calculating the default datatype for some functions. This affected queries of type CREATE TABLE table_name SELECT expression(),...
Fixed bug in queries of type SELECT * FROM table-list GROUP BY ... and SELECT DISTINCT * FROM ....
Fixed bug with the --slow-log when logging an administrator command (like FLUSH TABLES).
Fixed a bug that OPTIMIZE of locked and modified table, reported table corruption.
Fixed a bug in my_getopt() in handling of special prefixes (--skip-, --enable-). -skip-external-locking didn't work and the bug may have affected other similar options.
Fixed bug in checking for output file name of the tee option.
Added some more optimization to use index for SELECT ... FROM many_tables ..
ORDER BY key limit #
Fixed problem in SHOW OPEN TABLES when a user didn't have access permissions to one of
the opened tables.
Fixed a bug in mysqladmin shutdown when pid file was modified while mysqladmin
914
was still waiting for the previous one to disappear. This could happen during a very quick restart
and caused mysqladmin to hang until shutdown_timeout seconds had passed.
Don't increment warnings when setting AUTO_INCREMENT columns to NULL in LOAD DATA
INFILE.
Fixed all boolean type variables/options to work with the old syntax, for example, all of these
work: --lower-case-table-names, --lower-case-table-names=1, -O lower-case-table-names=1, --set-variable=lower-case-table-names=1
Fixed shutdown problem (SIGTERM signal handling) on Solaris. (Bug from 4.0.2).
SHOW MASTER STATUS now returns an empty set if binary log is not enabled.
SHOW SLAVE STATUS now returns an empty set if slave is not initialised.
Added QUOTE() function that performs SQL quoting to produce values that can be used as data
values in queries.
Fixed security bug when having an empty database name in the user.db table.
mysqld now has the option --temp-pool enabled by default as this gives better performance with some operating systems.
Fixed problem with too many allocated alarms on slave when connecting to master many times
(normally not a very critical error).
Fixed hang in CHANGE MASTER TO if the slave thread died very quickly.
Big cleanup in replication code (less logging, better error messages, etc..)
If the --code-file option is specified, the server calls setrlimit() to set the maximum
allowed core file size to unlimited, so core files can be generated.
Added --count=N (-c) option to mysqladmin, to make the program do only N iterations.
To be used with --sleep (-i). Useful in scripts.
Fixed bug in multi-table UPDATE: when updating a table, do_select() became confused
about reading records from a cache.
Fixed bug in multi-table UPDATE when several fields were referenced from a single table
Fixed bug in GRANT for the new CREATE TEMPORARY TABLE privilege.
Fixed bug in multi-table DELETE when tables are re-ordered in the table initialisation method
and ref_lengths are of different sizes.
Fixed bug in query cache initialisation with very small query cache size.
The
startup
parameters
myisam_max_sort_file_size
and
sam_max_extra_sort_file_size are now given in bytes, not megabytes.
External system locking of MyISAM/ISAM files is now turned off by default. One can turn this
on with --external-locking. (For most users this is never needed).
Fixed client hangup bug when using some SQL commands with incorrect syntax.
New SET [GLOBAL | SESSION] syntax to change thread-specific and global server variables at runtime.
Renamed some SQL variables, but old names will still work until 5.0. See Seco 2.5.2,
Atualizando da Verso 3.23 para 4.0.
Fixed a bug that made the pager option in the mysql client non-functional.
Extended LOG() function to accept an optional arbitrary base parameter. See Seco 6.3.3.2,
Funes Matematicas.
Added LOG2() function (useful for finding out how many bits a number would require for storage).
Added LN() natural logarithm function for compatibility with other databases. It is synonymous
with LOG(X).
myi-
Changed --chroot=path option to execute chroot() immediately after all options have
been parsed.
Added XOR operator (logical and bitwise XOR) with ^ as a synonym for bitwise XOR.
Added SHA1() function to calculate 160 bit hash value as described in RFC 3174 (Secure Hash
Algorithm). This function can be considered a cryptographically more secure equivalent of
MD5(). See Seco 6.3.6.2, Funes Diversas.
Fixed a bug in optimiser with merge tables when non-unique values are used in summing up
(causing crashes).
Fixed a bug in optimiser when a range specified makes index grouping impossible (causing
crashes).
Fixed a rare bug when FULLTEXT index is present and no tables are used.
Added privileges CREATE TEMPORARY TABLES, EXECUTE, LOCK TABLES, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES and SUPER. To use these, you
must have run the mysql_fix_privilege_tables script after upgrading.
Added missing mutex in TRUNCATE TABLE; This fixes some core dump/hangup problems
when using TRUNCATE TABLE.
Fixed that ALTER TABLE table_name RENAME new_table_name is as fast as RENAME TABLE.
Fixed bug in GROUP BY with two or more fields, where at least one field can contain NULL values.
Fixed bug that caused duplicated rows when using truncation operator * in boolean full-text search.
917
Fixed bug in truncation operator of boolean full-text search (incorrect results when there are
only +word*s in the query).
Fixed bug in boolean full-text search that caused a crash when an identical MATCH expression
that did not use an index appeared twice.
Fixed bug in boolean full-text search that caused MySQL to ignore queries of
ft_min_word_len characters.
Memory allocation strategy for ``root memory'' changed. Block size now grows with number of
allocated blocks.
INET_NTOA() now returns NULL if you give it an argument that is too large (greater than the
value corresponding to 255.255.255.255).
Fix SQL_CALC_FOUND_ROWS to work with UNIONs. It will work only if the first SELECT
has this option and if there is global LIMIT for the entire statement. For the moment, this requires using parentheses for individual SELECT queries within the statement.
Fixed SIGINT and SIGQUIT problems in mysql.cc on Linux with some glibc versions.
DOUBLE and FLOAT columns now honor the UNSIGNED flag on storage.
InnoDB now retains foreign key constraints through ALTER TABLE and CREATE/DROP
INDEX.
InnoDB now allows foreign key constraints to be added through the ALTER TABLE syntax.
Added --ignore-lines=n option to mysqlimport. This has the same effect as the IGNORE n LINES clause for LOAD DATA.
Fixed bug in UNION with last offset being transposed to total result set.
Fixed that some SELECT options can appear only in the first SELECT.
Fixed bug with LIMIT with UNION, where last select is in the braces.
918
Fixed bug that sometimes appeared when full-text search was used with const tables.
Fixed incorrect error value when doing a SELECT with an empty HEAP table.
Use ORDER BY column DESC now sorts NULL values first. (In other words, NULL values
sort first in all cases, whether or not DESC is specified.) This is changed back in 4.0.10.
Allow value of --user=# option for mysqld to be specified as a numeric user ID.
Fixed a bug where SQL_CALC_ROWS returned an incorrect value when used with one table and
ORDER BY and with InnoDB tables.
Fixed some problems with USE/IGNORE INDEX when using many keys with the same start
column.
Don't use table scan with BerkeleyDB and InnoDB tables when we can use an index that covers the whole row.
Fixed problem with TRUNCATE and InnoDB tables that produced the error Can't execute
the given command because you have active locked tables or an
active transaction.
Added NO_UNSIGNED_SUBTRACTION to the set of flags that may be specified with the -sql-mode option for mysqld. It disables unsigned arithmetic rules when it comes to subtraction. (This will make MySQL 4.0 behave more like 3.23 with UNSIGNED columns).
The result returned for all bit functions (|, <<, ...) is now of type unsigned integer.
Added detection of nan values in MyISAM to make it possible to repair tables with nan in float
or double columns.
Fixed new bug in myisamchk where it didn't correctly update number of ``parts'' in the MyISAM index file.
Fixed optimization problem where the MySQL Server was in ``preparing'' state for a long time
when selecting from an empty table which had contained a lot of rows.
Fixed bug in complicated join with const tables. This fix also improves performance a bit
when referring to another table from a const table.
INSERT ... SELECT did a full rollback in case of an error. Fixed so that we only roll back
the last statement in the current transaction.
919
Use index for ORDER BY in queries of type: SELECT * FROM t WHERE key_part1=1
ORDER BY key_part1 DESC,key_part2 DESC
Added CAST() and CONVERT() functions. The CAST and CONVERT functions are nearly
identical and mainly useful when you want to create a column with a specific type in a CREATE
... SELECT statement. For more information, read Seco 6.3.5, Funes de Converso.
CREATE ... SELECT on DATE and TIME functions now create columns of the expected type.
Fixed bug when HANDLER was used with some unsupported table type.
mysqldump now puts ALTER TABLE tbl_name DISABLE KEYS and ALTER TABLE
tbl_name ENABLE KEYS in the sql dump.
Fixed stack overrun problem with LOAD DATA FROM MASTER on OSF/1.
Changed SELECT ... IN SHARE MODE to SELECT ... LOCK IN SHARE MODE (as
in MySQL 3.23).
Fixed core dump bug on 64-bit machines when it got an incorrect communication packet.
MATCH ... AGAINST(... IN BOOLEAN MODE) can now work without FULLTEXT index.
Added support for MATCH ... AGAINST(... IN BOOLEAN MODE). Note: you must rebuild your tables with ALTER TABLE tablename TYPE=MyISAM to be able to use boolean full-text search.
LOCATE() and INSTR() are now case-sensitive if either argument is a binary string.
Changed RAND() initialisation so that RAND(N) and RAND(N+1) are more distinct.
In 3.23, INSERT INTO ... SELECT always had IGNORE enabled. Now MySQL will stop
(and possibly roll back) by default in case of an error unless you specify IGNORE.
Extended MODIFY and CHANGE in ALTER TABLE to accept the FIRST and AFTER keywords.
Added
full-text
variables
ft_min_word_len,
ft_max_word_len_for_sort.
Added documentation for libmysqld, the embedded MySQL server library. Also added
example programs (a mysql client and mysqltest test program) which use libmysqld.
Support for communication packets > 16M. In 4.0.1 we will extend MyISAM to be able to handle these.
921
ft_max_word_len,
and
Unsigned BIGINT constants now work. MIN() and MAX() now handle signed and unsigned
BIGINT numbers correctly.
STRCMP() now uses the current character set when doing comparisons, which means that the
default comparison behaviour now is case-insensitive.
TRUNCATE TABLE and DELETE FROM tbl_name are now separate functions. One bonus
is that DELETE FROM tbl_name now returns the number of deleted rows, rather than zero.
DROP DATABASE now executes a DROP TABLE on all tables in the database, which fixes a
problem with InnoDB tables.
Added support for INSERT on MERGE tables. Patch from Benjamin Pflugmann.
Renamed safe_mysqld to mysqld_safe to make this name more in line with other
MySQL scripts/commands.
Added support for symbolic links to MyISAM tables. Symlink handling is now enabled by default for Windows.
922
Added ALTER TABLE tbl_name DISABLE KEYS and ALTER TABLE tbl_name
ENABLE KEYS commands.
Implemented ``repair by sort'' for FULLTEXT indexes. REPAIR TABLE, ALTER TABLE, and
OPTIMIZE TABLE for tables with FULLTEXT indexes are now up to 100 times faster.
Cleaned up global lock handling for FLUSH TABLES WITH READ LOCK.
3.23.x
Please note that since release 4.0 is now production level, only critical fixes are done in the 3.23 release series. You are recommended to upgrade when possible, to take advantage of all speed and feature improvements in 4.0. See Seco 2.5.2, Atualizando da Verso 3.23 para 4.0.
The 3.23 release has several major features that are not present in previous versions. We have added
three new table types:
MyISAM
A new ISAM library which is tuned for SQL and supports large files.
InnoDB
A transaction-safe storage engine that supports row level locking, and many Oracle-like features.
BerkeleyDB or BDB
Uses the Berkeley DB library from Sleepycat Software to implement transaction-safe tables.
923
If a query was ignored on the slave (because of replicate-ignore-table and other similar rules), the slave still checked if the query got the same error code (0, no error) as on the master. So if the master had an error on the query (for example, ``Duplicate entry'' in a multiple-row
insert), then the slave stopped and warned that the error codes didn't match. This is a backport of
the fix for MySQL 4.0. (Bug #797)
mysqlbinlog now asks for a password at console when the -p/--password option is used
with no argument. This is how the other clients (mysqladmin, mysqldump..) already behave.
Note that one now has to use mysqlbinlog -p<my_password>; mysqlbinlog -p
<my_password> will not work anymore (in other words, put no space after -p). (Bug #1595)
On some 64-bit machines (some HP-UX and Solaris machines), a slave installed with the 64-bit
MySQL binary could not connect to its master (it connected to itself instead). (Bug #1256,
#1381)
Fixed a Windows-specific bug present since MySQL version 3.23.57 and 3.23.58, which caused
Windows slaves to crash when they started replication if a master.info file existed. (Bug
#1720)
Fixed buffer overflow in password handling which could potentially be exploited by MySQL
users with ALTER privilege on the mysql.user table to execute random code or to gain shell
access with the UID of the mysqld process (thanks to Jedi/Sector One for spotting and reporting
this bug).
mysqldump now correctly quotes all identifiers when communicating with the server. This assures that during the dump process, mysqldump will never send queries to the server that result
in a syntax error. This problem is not related to the mysqldump program's output, which was
not changed. (Bug #1148)
Fixed table/column grant handling - proper sort order (from most specific to less specific, see
Seco 4.3.10, Controle de Acesso, Estgio 2: Verificao da Requisio) was not honored.
(Bug #928)
Fixed overflow bug in MyISAM and ISAM when a row is updated in a table with a large number
of columns and at least one BLOB/TEXT column.
Fixed MySQL so that field length (in C API) for the second column in SHOW CREATE TABLE
is always larger than the data length. The only known application that was affected by the old
behaviour was Borland dbExpress, which truncated the output from the command. (Bug #1064)
Fixed Unknown error when doing ORDER BY on reference table which was used with
NULL value on NOT NULL column. (Bug #479)
Fixed problem in alarm handling that could cause problems when getting a packet that is too large.
Fixed problem when installing MySQL as a service on Windows when one gave 2 arguments
(option file group name and service name) to mysqld.
924
SHOW TABLE STATUS displayed incorrect Row_format value for tables that have been
compressed with myisampack. (Bug #427)
Fixed security problem where mysqld didn't allow one to UPDATE rows in a table even if one
had a global UPDATE privilege and a database SELECT privilege.
Fixed a security problem with SELECT and wildcarded select list, when user only had partial
column SELECT privileges on the table.
Fixed unlikely problem in optimising WHERE clause with a constant expression such as in WHERE 1 AND (a=1 AND b=1).
Fixed problem with too many allocated alarms on slave when connecting to master many times
(normally not a very critical error).
Fixed a bug when doing LOAD DATA INFILE IGNORE: When reading the binary log,
mysqlbinlog and the replication code read REPLACE instead of IGNORE. This could make
the slave's table become different from the master's table. (Bug #218)
Fixed overflow bug in MyISAM when a row is inserted into a table with a large number of columns and at least one BLOB/TEXT column. Bug was caused by incorrect calculation of the needed buffer to pack data.
The binary log was not locked during TRUNCATE table_name or DELETE FROM table_name statements, which could cause an INSERT to table_name to be written to the log
before the TRUNCATE or DELETE statements.
Fixed rare bug in UPDATE of InnoDB tables where one row could be updated multiple times.
mysqldump no longer silently deletes the binary logs when invoked with the -master-data or --first-slave option; while this behaviour was convenient for some
users, others may suffer from it. Now one has to explicitly ask for binary logs to be deleted by
using the new --delete-master-logs option.
Fixed a bug in mysqldump when it was invoked with the --master-data option: The
CHANGE MASTER TO statements that were appended to the SQL dump had incorrect coordinates. (Bug #159)
Fixed a rare bug when using a date in HAVING with GROUP BY.
Security enhancement: mysqld no longer reads options from world-writeable config files.
Security enhancement: mysqld and safe_mysqld now only use the first --user option
specified on the command line. (Normally this comes from /etc/my.cnf)
Fixed unlikely deadlock bug when one thread did a LOCK TABLE and another thread did a
DROP TABLE. In this case one could do a KILL on one of the threads to resolve the deadlock.
LOAD DATA INFILE was not replicated by slave if replicate_*_table was set on the
slave.
Fixed a bug in handling CHAR(0) columns that could cause incorrect results from the query.
Fixed a bug in SHOW VARIABLES on 64-bit platforms. The bug was caused by incorrect declaration of variable server_id.
The Comment column in SHOW TABLE STATUS now reports that it can contain NULL values
(which is the case for a crashed .frm file).
Fixed the rpl_rotate_logs test to not fail on certain platforms (e.g. Mac OS X) due to a
too long file name (changed slave-master-info.opt to .slave-mi).
Fixed a problem with BLOB NOT NULL columns used with IS NULL.
Fixed bug with connect timeout. This bug was manifested on OS's with poll() system call,
which resulted in timeout the value specified as it was executed in both select() and
poll().
Fixed bug in SELECT * FROM table WHERE datetime1 IS NULL OR datetime2 IS NULL.
Fixed bug in using aggregate functions as argument for INTERVAL, CASE, FIELD, CONCAT_WS, ELT and MAKE_SET functions.
When running with --lower-case-table-names (default on Windows) and you had tables or databases with mixed case on disk, then executing SHOW TABLE STATUS followed
with DROP DATABASE or DROP TABLE could fail with Errcode 13.
Fixed bug in logging to binary log (which affects replication) a query that inserts a NULL in an
auto_increment field and also uses LAST_INSERT_ID().
On some 64 bit systems, show status reported a strange number for Open_files and
Open_streams.
926
Fixed double free'd pointer bug in mysql_change_user() handling, that enabled a specially hacked version of MySQL client to crash mysqld. Note, that one needs to login to the server by using a valid user account to be able to exploit this bug.
Fixed bug with the --slow-log when logging an administrator command (like FLUSH TABLES).
Fixed bug in GROUP BY when used on BLOB column with NULL values.
Bugfix for --chroot (see Seco D.4.6, Alteraes na distribuio 3.23.54 (05 Dec 2002))
is reverted. Unfortunately, there is no way to make it to work, without introducing backwardincompatible changes in my.cnf. Those who need --chroot functionality, should upgrade to
MySQL 4.0. (The fix in the 4.0 branch did not break backward-compatibility).
Fixed a very unlikely bug that could cause SHOW PROCESSLIST to core dump in pthread_mutex_unlock() if a new thread was connecting.
Forbid SLAVE STOP if the thread executing the query has locked tables. This removes a possible deadlock situation.
Fixed a bug, that allowed to crash mysqld with a specially crafted packet.
Fixed a rare crash (double free'd pointer) when altering a temporary table.
Fixed buffer overrun in libmysqlclient library that allowed malicious MySQL server to
crash the client application.
Fixed security-related bug in mysql_change_user() handling. All users are strongly recommended to upgrade to the version 3.23.54.
Fixed bug that prevented --chroot command-line option of mysqld from working.
Fixed bug that made OPTIMIZE TABLE to corrupt the table under some rare circumstances.
Fixed bug with comparing an indexed NULL field with <=> NULL.
Fixed bug that caused IGNORE INDEX and USE INDEX sometimes to be ignored.
Fixed rare core dump problem in complicated GROUP BY queries that didn't return any result.
Fixed a bug where MATCH ... AGAINST () >=0 was treated as if it was >.
927
Fixed core dump in SHOW PROCESSLIST when running with an active slave (unlikely timing
bug).
Make it possible to use multiple MySQL servers on Windows (code backported from 4.0.2).
Fixed reference to freed memory when doing complicated GROUP BY ... ORDER BY queries. Symptom was that mysqld died in function send_fields.
Fixed memory allocation bug when storing BLOB values in internal temporary tables used for
some (unlikely) GROUP BY queries.
Fixed a bug in key optimising handling where the expression WHERE column_name =
key_column_name was calculated as true for NULL values.
Fixed core dump bug when doing LEFT JOIN ... WHERE key_column=NULL.
Fixed MyISAM crash when using dynamic-row tables with huge numbers of packed fields.
Updated source tree to be built using automake 1.5 and libtool 1.4.
Fixed crash when SHOW INNODB STATUS was used and skip-innodb was defined.
Fixed possible memory corruption bug in binary log file handling when slave rotated the logs
(only affected 3.23, not 4.0).
Fixed problem in LOCK TABLES on Windows when one connects to a database that contains
upper case letters.
Fixed core dump bug when using the BINARY cast on a NULL value.
Fixed race condition when someone did a GRANT at the same time a new user logged in or did a
USE database.
Fixed bug in ALTER TABLE and RENAME TABLE when running with -O lower_case_table_names=1 (typically on Windows) when giving the table name in uppercase.
Fixed unlikely core dump with SELECT ... ORDER BY ... LIMIT.
Changed AND/OR to report that they can return NULL. This fixes a bug in GROUP BY on
AND/OR expressions that return NULL.
Fixed a bug that OPTIMIZE of locked and modified MyISAM table, reported table corruption.
928
Fixed a BDB-related ALTER TABLE bug with dropping a column and shutting down immediately thereafter.
Wrap BEGIN/COMMIT around transaction in the binary log. This makes replication honour transactions.
Fixed security bug when having an empty database name in the user.db table.
Fixed problem with GROUP BY on result with expression that created a BLOB field.
Fixed problem with GROUP BY on columns that have NULL values. To solve this we now create an MyISAM temporary table when doing a GROUP BY on a possible NULL item. From
MySQL 4.0.5 we can use in memory HEAP tables for this case.
Fixed problem with privilege tables when downgrading from 4.0.2 to 3.23.
Fixed thread bug in SLAVE START, SLAVE STOP and automatic repair of MyISAM tables
that could cause table cache to be corrupted.
Fixed possible thread related key-cache-corruption problem with OPTIMIZE TABLE and REPAIR TABLE.
Fixed bug with creating an auto-increment value on second part of a UNIQUE() key where first
part could contain NULL values.
Fixed bug when logging LOAD DATA INFILE to binary log with no active database.
Fixed possible problem in replication when doing DROP DATABASE on a database with InnoDB tables.
Fixed that mysql_info() returns 0 for 'Duplicates' when using INSERT DELAYED IGNORE.
Added -DHAVE_BROKEN_REALPATH to the Mac OS X (darwin) compile options in configure.in to fix a failure under high load.
929
Fix bug with closing tags missing slash for mysqldump XML output.
Remove end space from ENUM values. (This fixed a problem with SHOW CREATE TABLE.)
Changed
name
of
server
Com_show_master_status
Com_show_slave_status.
Fixed optimization problem with DATETIME and value outside DATETIME range.
Removed Sleepycat's BDB doc files from the source tree, as they're not needed (MySQL covers
BDB in its own documentation).
Fixed MIT-pthreads to compile with glibc 2.2 (needed for make dist).
Fixed the result from IF() is case in-sensitive if the second and third arguments are case sensitive.
Fixed host lookup bug in the glibc library that we used with the 3.23.50 Linux-x86 binaries.
variables
and
Com_show_master_stat
Com_show_slave_stat
to
to
Fixed buffer overflow problem if someone specified a too long datadir parameter to mysqld
Fixed memory allocation bug in the glibc library used to build Linux binaries, which caused
mysqld to die in 'free()'.
Fixed bug in character table converts when used with big ( > 64K) strings.
InnoDB now retains foreign key constraints through ALTER TABLE and CREATE/DROP
INDEX.
InnoDB now allows foreign key constraints to be added through the ALTER TABLE syntax.
Our Linux RPMS and binaries are now compiled with gcc 3.0.4, which should make them a bit
faster.
Because of problems on shutdown we have now disabled named pipes on Windows by default.
One can enable named pipes by starting mysqld with --enable-named-pipe.
Fixed core-dump bug when using --log-bin with LOAD DATA INFILE without an active
database.
Fixed unlikely core-dump bug when using DROP TABLE on a table that was in use by a thread
that also used queries on only temporary tables.
Fixed problem with SHOW CREATE TABLE and PRIMARY KEY when using 32 indexes.
Fixed that one can use SET PASSWORD for the anonymous user.
Fixed core dump bug when reading client groups from option files using mysql_options().
Fixed bug where DATE_FORMAT() returned empty string when used with GROUP BY.
Don't give warning for a statement that is only a comment; this is needed for mysqldump -disable-keys to work.
Fixed unlikely caching bug when doing a join without keys. In this case the last used field for a
table always returned NULL.
MySQL binary release 3.23.48 for Linux contained a new glibc library, which has serious
problems under high load and Red Hat 7.2. The 3.23.49 binary release doesn't have this problem.
931
Some InnoDB variables were always shown in SHOW VARIABLES as OFF on high-byte-first
systems (like SPARC).
Fixed problem with one thread using an InnoDB table and another thread doing an ALTER
TABLE on the same table. Before that, mysqld could crash with an assertion failure in
row0row.c, line 474.
Tuned the InnoDB SQL optimiser to favor index searches more often over table scans.
Fixed a performance problem with InnoDB tables when several large SELECT queries are run
concurrently on a multiprocessor Linux computer. Large CPU-bound SELECT queries will now
also generally run faster on all platforms.
If MySQL binlogging is used, InnoDB now prints after crash recovery the latest MySQL binlog
name and the offset InnoDB was able to recover to. This is useful, for example, when resynchronising a master and a slave database in replication.
It is now possible to recover MySQL temporary tables that have become orphaned inside the
InnoDB tablespace.
InnoDB now prevents a FOREIGN KEY declaration where the signedness is not the same in
the referencing and referenced integer columns.
Calling SHOW CREATE TABLE or SHOW TABLE STATUS could cause memory corruption
and make mysqld crash. Especially at risk was mysqldump, because it frequently calls SHOW
CREATE TABLE.
If inserts to several tables containing an AUTO_INCREMENT column were wrapped inside one
LOCK TABLES, InnoDB asserted in lock0lock.c.
In 3.23.47 we allowed several NULL values in a UNIQUE secondary index for an InnoDB table.
But CHECK TABLE was not relaxed: it reports the table as corrupt. CHECK TABLE no longer
complains in this situation.
Fixed bug when using the following construct: SELECT ... WHERE key=@var_name OR
key=@var_name2
932
Added statistics variables for all MySQL commands. (SHOW STATUS is now much longer.)
InnoDB and BDB tables will now use index when doing an ORDER BY on the whole table.
Fixed bug where one got an empty set instead of a DEADLOCK error when using BDB tables.
One can now kill ANALYZE, REPAIR, and OPTIMIZE TABLE when the thread is waiting to
get a lock on the table.
Fixed race condition when using the binary log and INSERT DELAYED which could cause the
binary log to have rows that were not yet written to MyISAM tables.
Fix a bug which could cause InnoDB to complain if it cannot find free blocks from the buffer
cache during recovery.
933
Fixed bug in InnoDB insert buffer B-tree handling that could cause crashes.
Fixed bug in OPTIMIZE TABLE that reset index cardinality if it was up to date.
Fixed that date functions that require correct dates, like DAYOFYEAR(column), will return
NULL for 0000-00-00 dates.
Fixed bug that caused error message Can't write, because of unique constraint with some GROUP BY queries.
Fixed problem with sjis character strings used within quoted table names.
Fixed core dump when using CREATE ... FULLTEXT keys with other storage engines than
MyISAM.
Don't use signal() on Windows because this appears to not be 100% reliable.
Fixed bug when doing WHERE col_name=NULL on an indexed column that had NULL values.
Fixed bug when doing LEFT JOIN ... ON (col_name = constant) WHERE
col_name = constant.
When using replications, aborted queries that contained % could cause a core dump.
InnoDB now supports datafiles and raw disk partitions bigger than 4 GB on those operating
systems that have big files.
InnoDB calculates better table cardinality estimates for the MySQL optimiser.
Accent characters in the default character set latin1 are ordered according to the MySQL ordering.
Note: if you are using latin1 and have inserted characters whose code is greater than 127 into
an indexed CHAR column, you should run CHECK TABLE on your table when you upgrade to
3.23.44, and drop and reimport the table if CHECK TABLE reports an error!
A new my.cnf parameter, innodb_force_recovery, helps to save your data in case the
disk image of the database becomes corrupt.
Fixed a bug when the case of letters changes in an update of an indexed secondary column.
Fixed a crash when MAX(col) is selected from an empty table, and col is not the first column
in a multi-column index.
Fixed unlikely bug, which returned non-matching rows, in SELECT with many tables and multicolumn indexes and 'range' type.
Fixed an unlikely core dump bug when doing EXPLAIN SELECT when using many tables and
ORDER BY.
Fixed bug in LOAD DATA FROM MASTER when using table with CHECKSUM=1.
Added unique error message when one gets a DEADLOCK during a transaction with BDB tables.
Fixed problem with BDB tables and UNIQUE columns defined as NULL.
Fixed problem with myisampack when using pre-space filled CHAR columns.
935
Fixed problem with REPAIR TABLE on MyISAM tables with row lengths in the range from
65517 to 65520 bytes.
Fixed rare hang when doing mysqladmin shutdown when there was a lot of activity in
other threads.
Fixed problem with INSERT DELAYED where delay thread could be hanging on upgrading
locks with no apparent reason.
Fixed problem when one edited .MRG tables by hand. (Patch from Benjamin Pflugmann).
Enforce that all tables in a MERGE table come from the same database.
Fix bug when using INSERT DELAYED with wrong column definition.
Fixed critical bug in InnoDB and BLOB columns. If you have used BLOB columns larger than
8000 bytes in an InnoDB table, it is necessary to dump the table with mysqldump, drop it and
restore it from the dump.
Fixed problem with InnoDB when one could get the error Can't execute the given
command... even when no transaction was active.
Use real arithmetic operations even in integer context if not all arguments are integers. (Fixes
uncommon bug in some integer contexts).
Don't force everything to lowercase on Windows. (To fix problem with Windows and ALTER
TABLE). Now --lower_case_names also works on Unix.
Fixed that automatic rollback is done when thread end doesn't lock other threads.
Fixed possible problem with shutdown on Solaris where the .pid file wasn't deleted.
InnoDB now supports < 4 GB rows. The former limit was 8000 bytes.
936
The doublewrite file flush method is used in InnoDB. It reduces the need for Unix
fsync() calls to a fraction and improves performance on most Unix flavors.
You can now use the InnoDB Monitor to print a lot of InnoDB state information, including
locks, to the standard output. This is useful in performance tuning.
Several bugs which could cause hangs in InnoDB have been fixed.
Fixed optimising bug in ORDER BY where some ORDER BY parts where wrongly removed.
Fixed bug in SELECT DISTINCT ... HAVING that caused error message Can't find
record in #...
Fixed bug in slave thread when under some rare circumstances it could get 22 bytes ahead on the
offset in the master.
Fixed problem when using GRANT FILE ON database.* ...; previously we added the
DROP privilege for the database.
Fixed DELETE FROM tbl_name ... LIMIT 0 and UPDATE FROM tbl_name ...
LIMIT 0, which acted as though the LIMIT clause was not present (they deleted or updated all
selected rows).
Sending a SIGHUP to mysqld will now only flush the logs, not reset the replication.
Fixed parser to allow floats of type 1.0e1 (no sign after e).
Added option --warnings to mysqld. Now mysqld prints the error Aborted connection only if this option is used.
Fixed problem with SHOW CREATE TABLE when you didn't have a PRIMARY KEY.
Fixed bug when converting BIGINT UNSIGNED to DOUBLE. This caused a problem when doing comparisons with BIGINT values outside of the signed range.
937
Fixed a bug when using COUNT(DISTINCT) with LEFT JOIN and there weren't any matching rows.
Removed all documentation referring to the GEMINI table type. GEMINI is not released under
an Open Source license.
The AUTO_INCREMENT sequence wasn't reset when dropping and adding an AUTO_INCREMENT column.
Fixed problem where LOCK TABLES tbl_name READ followed by FLUSH TABLES put
an exclusive lock on the table.
REAL @variable values were represented with only 2 digits when converted to strings.
Fixed problem that client ``hung'' when LOAD TABLE FROM MASTER failed.
myisamchk --fast --force will no longer repair tables that only had the open count
wrong.
We are now using the -lcma thread library on HP-UX 10.20 so that MySQL will be more stable on HP-UX.
Fixed date-part extraction functions to work with dates where day and/or month is 0.
Fixed problem with shutdown when INSERT DELAYED was waiting for a LOCK TABLE.
Fixed problem with MERGE tables and big tables (> 4G) when using ORDER BY.
Fixed a bug when SELECT from MERGE table sometimes results in incorrectly ordered rows.
Better error message when slave max_allowed_packet is too low to read a very long log
event from the master.
Fixed bug when too many rows where removed when using SELECT DISTINCT ... HAVING.
Fixed problems with function returning empty string when used together with a group function
and a WHERE that didn't match any rows.
Added database name to output for administrative commands like CHECK, REPAIR, OPTIMIZE.
INSERT
INTO
Changed INNOBASE to InnoDB (because the INNOBASE name was already used). All configure options and mysqld start options now use innodb instead of innobase. This means that before upgrading to this version, you have to change any configuration files where you
have used innobase options!
Slave thread will now be started even if master-host is not set, as long as server-id is
set and valid master.info is present.
Partial updates (terminated with kill) are now logged with a special error code to the binary log.
Slave will refuse to execute them if the error code indicates the update was terminated abnormally, and will have to be recovered with SET SQL_SLAVE_SKIP_COUNTER=1; SLAVE
START after a manual sanity check/correction of data integrity.
Fixed bug that erroneously logged a drop of internal temporary table on thread termination to the
binary log --- this bug affected replication.
UPDATE and DELETE with WHERE unique_key_part IS NULL didn't update/delete all
939
rows.
Fixed bug when using date functions on TEXT/BLOB column with wrong date format.
Fixed bug in ALTER TABLE and LOAD DATA INFILE that disabled key-sorting. These commands should now be faster in most cases.
Fixed performance bug where reopened tables (tables that had been waiting for FLUSH or REPAIR) would not use indexes for the next query.
Added
mysqld
variables
myisam_max_sort_file_size
sam_max_extra_sort_file_size.
Applied patch for the tis620 character set to make comparisons case-independent and to fix a
bug in LIKE for this character set. Note: All tables that uses the tis620 character set must be
fixed with myisamchk -r or REPAIR TABLE !
and
myi-
Fixed a bug that allowed use of database names containing a '.' character. This fixes a serious
security issue when mysqld is run as root.
Fixed bug when thread creation failed (could happen when doing a lot of connections in a short
time).
Fixed some problems with FLUSH TABLES and TEMPORARY tables. (Problem with freeing the
key cache and error Can't reopen table....)
Fixed a problem in InnoDB with other character sets than latin1 and another problem when
using many columns.
Fixed bug that caused a core dump when using a very complex query involving DISTINCT and
summary functions.
Fixed bug where the number of affected rows was not returned when MySQL was compiled
without transaction support.
Fixed a bug in UPDATE where keys weren't always used to find the rows to be updated.
Changed CREATE ... SELECT and INSERT ... SELECT to not allow concurrent inserts
as this could make the binary log hard to repeat. (Concurrent inserts are enabled if you are not
using the binary or update log.)
Changed some macros to be able to use fast mutex with glibc 2.2.
940
Added the INNOBASE storage engine and the BDB storage engine to the MySQL source distribution.
Fixed a bug in INSERT DELAYED that caused threads to hang when inserting NULL into an
AUTO_INCREMENT column.
Fixed a bug in CHECK TABLE / REPAIR TABLE that could cause a thread to hang.
REPLACE will not replace a row that conflicts with an AUTO_INCREMENT generated key.
Fixed LOAD DATA INFILE to allow numeric values to be read into ENUM and SET columns.
Limit query length for replication by max_allowed_packet, not the arbitrary limit of 4 MB.
Fixed problem in automatic repair that could leave some threads in state Waiting for table.
SHOW CREATE TABLE now displays the UNION=() for MERGE tables.
Fixed bug in the BDB storage engine that occurred when using an index on multi-part key where
a key part may be NULL.
Fixed problem where garbage results were returned when using BDB tables and BLOB or TEXT
fields when joining many tables.
Fixed bug when using a BLOB key where a const row wasn't found.
Fixed that mysqlbinlog writes the timestamp value for each query. This ensures that one gets
same values for date functions like NOW() when using mysqlbinlog to pipe the queries to
another server.
Fixed a deadlock in the SET code, when one ran SET @foo=bar, where bar is a column reference, an error was not properly generated.
Fixed DNS lookups not to use the same mutex as the hostname cache. This will enable known
hosts to be quickly resolved even if a DNS lookup takes a long time.
Fixed a bug that caused a core dump when using GROUP BY on an alias, where the alias was the
same as an existing column name.
Changed mysql_install_db to use BINARY for CHAR columns in the privilege tables.
Changed TRUNCATE tbl_name to TRUNCATE TABLE tbl_name to use the same syntax
as Oracle. Until 4.0 we will also allow TRUNCATE tbl_name to not crash old code.
Fixed ``no found rows'' bug in MyISAM tables when a BLOB was first part of a multi-part key.
Fixed bug when using DISTINCT on results from functions that referred to a group function, like:
SELECT a, DISTINCT SEC_TO_TIME(SUM(a))
FROM tbl_name GROUP BY a, b;
942
Fixed buffer overrun in libmysqlclient library. Fixed bug in handling STOP event after
ROTATE event in replication.
Fixed bug in replication that broke slave server start with existing master.info. This fixes a
bug introduced in 3.23.32.
Added max_binlog_size variable; the binary log will be rotated automatically when the size crosses the limit.
On x86 Linux, print the current query and thread (connection) id, if available, in the core dump
handler.
Extended mysqltest to take care of the timing issues in the test suite.
ALTER TABLE can now be used to change the definition for a MERGE table.
Added --temp-pool option to mysqld. Using this option will cause most temporary files
created to use a small set of names, rather than a unique name for each new file. This is to work
around a problem in the Linux kernel dealing with creating a bunch of new files with different
names. With the old behaviour, Linux seems to "leak" memory, as it's being allocated to the directory entry cache instead of the disk cache.
Changed code to get around compiler bug in Compaq C++ on OSF/1, that broke BACKUP,
RESTORE, CHECK, REPAIR, and ANALYZE TABLE.
Added option FULL to SHOW COLUMNS. Now we show the privilege list for the columns only
if this option is given.
Fixed bug in SHOW LOGS when there weren't any BDB logs.
Fixed a timing problem in replication that could delay sending an update to the client until a new
update was done.
Don't convert field names when using mysql_list_fields(). This is to keep this code
compatible with SHOW FIELDS.
943
Fixed a bug in RESTORE TABLE when trying to restore from a non-existent directory.
Fixed a bug which caused a core dump on the slave when replicating SET PASSWORD.
Added MASTER_POS_WAIT().
The test suite now tests all reachable BDB interface code. During testing we found and fixed
many errors in the interface code.
Using HAVING on an empty table could produce one result row when it shouldn't.
SHOW TABLE STATUS didn't show correct average row length for tables larger than 4G.
CHECK TABLE ... EXTENDED didn't check row links for fixed size tables.
HOUR() (and some other TIME functions) on a CHAR column always returned NULL.
Fixed security bug in something (please upgrade if you are using an earlier MySQL 3.23 version).
Fixed bug in MyISAM when deleting keys with possible NULL values, but the first key-column
was not a prefix-compressed text column.
Fixed mysql.server to read the [mysql.server] option file group rather than the
[mysql_server] group.
Fixed safe_mysqld and mysql.server to also read the server option section.
944
Fixed a problem with replication when the binary log file went over 2G on 32-bit systems.
Changed BDB tables to not use internal subtransactions and reuse open files to get more speed.
Fixed a bug where some rows were not found with HEAP tables that had many keys.
Fixed a bug from 3.23.29 when allocating the shared structure needed for BDB tables.
Fixed problem that some temporary files where reported as having the name UNOPENED in error
messages.
Configure updates for Tru64, large file support, and better TCP wrapper support. By Albert
Chin-A-Young.
945
LPAD() and RPAD() will shorten the result string if it's longer than the length argument.
When creating a table, put PRIMARY keys first, followed by UNIQUE keys.
Fixed a bug in UPDATE involving multi-part keys where one specified all key parts both in the
update and the WHERE part. In this case MySQL could try to update a record that didn't match
the whole WHERE part.
Changed drop table to first drop the tables and then the .frm file.
Fixed a bug in the hostname cache which caused mysqld to report the hostname as '' in some
error messages.
Fixed a bug with HEAP type tables; the variable max_heap_table_size wasn't used. Now
either MAX_ROWS or max_heap_table_size can be used to limit the size of a HEAP type
table.
Changed the default server-id to 1 for masters and 2 for slaves to make it easier to use the binary
log.
In BDB tables, we now store the number of rows; this helps to optimise queries when we need an
approximation of the number of rows.
If we get an error in a multi-row statement, we now only roll back the last statement, not the entire transaction.
If you do a ROLLBACK when you have updated a non-transactional table you will get an error as
a warning.
DROP TABLE, RENAME TABLE, CREATE INDEX and DROP INDEX are now transaction
endpoints.
If you do a DROP DATABASE on a symbolically linked database, both the link and the original
database is deleted.
Fixed bug when doing a SELECT DISTINCT ... table1 LEFT JOIN table2 ...
when table2 was empty.
Fixed replication of temporary tables. Handles everything except slave server restart.
946
New script mysqld_multi. See Seco 4.8.3, mysqld_multi, programa para gerenciar
mltiplos servidores MySQL.
Added
new
script,
mysql-multi.server.sh.
Thanks
to
Tim
Bunce
<Tim.Bunce@ig.co.uk> for modifying mysql.server to easily handle hosts running
many mysqld processes.
FLUSH TABLES tbl_name didn't always flush the index tree to disk properly.
--bootstrap is now run in a separate thread. This fixes a problem that caused
mysql_install_db to core dump on some Linux machines.
Fixed bug with optimiser trying to over-optimise MATCH() when used with UNIQUE key.
Changed crash-me and the MySQL benchmarks to also work with FrontBase.
Allow RESTRICT and CASCADE after DROP TABLE to make porting easier.
Reset status variable which could cause problem if one used --slow-log.
Fixed a major performance bug in the table locking code when one constantly had a lot of SELECT, UPDATE and INSERT statements running. The symptom was that the UPDATE and INSERT queries were locked for a long time while new SELECT statements were executed before
the updates.
When reading options_files with mysql_options() the return-found-rows option was ignored.
One can now specify interactive-timeout in the option file that is read by
947
mysql_options(). This makes it possible to force programs that run for a long time (like
mysqlhotcopy) to use the interactive_timeout time instead of the wait_timeout
time.
Added to the slow query log the time and the user name for each logged query. If you are using
--log-long-format then also queries that do not use an index are logged, even if the query
takes less than long_query_time seconds.
Fixed a problem in LEFT JOIN which caused all columns in a reference table to be NULL.
Fixed a bug when using a multi-part keys where the first part was of type TEXT or BLOB.
Fixed a bug where SELECT DISTINCT * ... LIMIT row_count only returned one
row.
Fixed a bug in the assembler code in strstr() for SPARC and cleaned up the global.h header file to avoid a problem with bad aliasing with the compiler submitted with Red Hat 7.0.
(Reported by Trond Eivind Glomsrd)
Fixed a long outstanding bug in the ISAM tables when a row with a length of more than 65K
was shortened by a single byte.
Fixed a bug in MyISAM when running multiple updating processes on the same table.
Added
--replicate-ignore-table,
--replicate-do-table,
-replicate-wild-ignore-table, and --replicate-wild-do-table options to
mysqld.
Changed all log files to use our own IO_CACHE mechanism instead of FILE to avoid OS problems when there are many files open.
Fixed a bug where we didn't allow an index name after the FOREIGN KEY definition.
Fixed a bug in a BDB key compare function when comparing part keys.
Fixed an overflow bug in the client code when using overly long database names.
mysql_connect() now aborts on Linux if the server doesn't answer in timeout seconds.
948
SLAVE START did not work if you started with --skip-slave-start and had not explicitly run CHANGE MASTER TO.
Fixed the output of SHOW MASTER STATUS to be consistent with SHOW SLAVE STATUS.
(It now has no directory in the log name.)
SHOW SLAVE STATUS was using an uninitialised mutex if the slave had not been started yet.
Fixed bug in ELT() and MAKE_SET() when the query used a temporary table.
ALTER TABLE ... ORDER BY ... syntax added. This will create the new table with the
rows in a specific order.
Fixed a bug where the automatic repair of MyISAM tables sometimes failed when the datafile
was corrupt.
Renamed FLUSH MASTER and FLUSH SLAVE to RESET MASTER and RESET SLAVE.
Fix CREATE TEMPORARY TABLE IF NOT EXISTS not to produce an error if the table
exists.
If you don't create a PRIMARY KEY in a BDB table, a hidden PRIMARY KEY will be created.
LEFT JOIN in some cases preferred a full table scan when there was no WHERE clause.
When using --log-slow-queries, don't count the time waiting for a lock.
Fixed bug in lock code on Windows which could cause the key cache to report that the key file
was crashed even if it was okay.
Removed the TYPE= keyword from CHECK and REPAIR. Allow CHECK options to be combined. (You can still use TYPE=, but this usage is deprecated.)
Fixed mutex bug in the binary replication log --- long update queries could be read only in part
by the slave if it did it at the wrong time, which was not fatal, but resulted in a performance-degrading reconnect and a scary message in the error log.
Changed the format of the binary log --- added magic number, server version, binlog version.
Added server ID and query error code for each query event.
Replication thread from the slave now will kill all the stale threads from the same server.
Updates that generated an error code (such as INSERT INTO foo(some_key) values
(1),(1)) erroneously terminated the slave thread.
Added optimization of queries where DISTINCT is only used on columns from some of the tables.
Allow floating-point numbers where there is no sign after the exponent (like 1e1).
UPDATE didn't always work when used with a range on a timestamp that was part of the key
that was used to find rows.
Changed to use mkstemp() instead of tempnam(). Based on a patch from John Jones.
The values for the UMASK and UMASK_DIR environment variables now can be specified in octal by beginning the value with a zero.
950
LOAD DATA INFILE now works with FIFOs. (Patch by Toni L. Harbaugh-Blackford.)
FLUSH LOGS broke replication if you specified a log name with an explicit extension as the value of the log-bin option.
Fixed a bug where FULLTEXT index always used the koi8_ukr character set.
The MyISAM repair/reindex code didn't use the --tmpdir option for its temporary files.
Fixed core dump on CHANGE MASTER TO when the slave did not have the master to start
with.
Fixed incorrect Time in the processlist for Connect of the slave thread.
Fixed a core dump bug when doing FLUSH MASTER if you didn't specify a filename argument
to --log-bin.
Fixed some mutex bugs in the log code that could cause thread blocks if new log files couldn't
be created.
Added lock time and number of selected processed rows to slow query log.
Added --memlock option to mysqld to lock mysqld in memory on systems with the
mlockall() call (as in Solaris).
Added better support for MERGE tables (keys, mapping, creation, documentation...). See Seco 7.2, Tabelas MERGE.
Fixed bug in mysqldump from 3.23 which caused some CHAR columns not to be quoted.
OPTIMIZE TABLE is now mapped to REPAIR with statistics and sorting of the index tree.
This means that for the moment it only works on MyISAM tables.
Removed warning that mysqld couldn't remove the .pid file under Windows.
To make it possible to reliably dump and restore tables with TIMESTAMP(X) columns,
MySQL now reports columns with X other than 14 or 8 to be strings.
Changed sort order for latin1 as it was before MySQL Version 3.23.23. Any table that was
created or modified with 3.23.22 must be repaired if it has CHAR columns that may contain characters with ASCII values greater than 128!
Fixed small memory leak introduced from 3.23.22 when creating a temporary table.
Fixed problem with BDB tables and reading on a unique (not primary) key.
Restored the win1251 character set (it's now only marked deprecated).
Changed sort order for 'German'; all tables created with 'German' sortorder must be repaired with
REPAIR TABLE or myisamchk before use!
Added --core-file option to mysqld to get a core file on Linux if mysqld dies on the
SIGSEGV signal.
MySQL client mysql now starts with option --no-named-commands (-g) by default. This
option can be disabled with --enable-named-commands (-G). This may cause incompatibility problems in some cases, for example, in SQL scripts that use named commands without a
semicolon, etc.! Long format commands still work from the first line.
Fixed a problem when using many pending DROP TABLE statements at the same time.
Optimizer didn't use keys properly when using LEFT JOIN on an empty table.
Added shorter help text when invoking mysqld with incorrect options.
Updated mysqlhotcopy to use the new FLUSH TABLES table_list syntax. Only tables which are being backed up are flushed now.
Changed behaviour of --enable-thread-safe-client so that both non-threaded (lmysqlclient) and threaded (-lmysqlclient_r) libraries are built. Users who linked
against a threaded -lmysqlclient will need to link against -lmysqlclient_r now.
Changed ALTER TABLE, LOAD DATA INFILE on empty tables and INSERT ... SELECT ... on empty tables to create non-unique indexes in a separate batch with sorting. This
will make the above calls much faster when you have many indexes.
952
Fixed a problem with the thread cache which made some threads show up as ***DEAD*** in
SHOW PROCESSLIST.
Fixed a lock in our thr_rwlock code, which could make selects that run at the same time as concurrent inserts crash. This only affects systems that don't have the pthread_rwlock_rdlock code.
When deleting rows with a non-unique key in a HEAP table, all rows weren't always deleted.
Fixed bug in range optimiser for HEAP tables for searches on a part index.
Fixed INSERT INTO bdb_table ... SELECT to work with BDB tables.
ANALYZE TABLE will now only update tables that have been changed since the last
ANALYZE. Note that this is a new feature and tables will not be marked to be analysed until they
are updated in any way with 3.23.23 or newer. For older tables, you have to do CHECK TABLE
to update the key distribution.
Fixed some minor privilege problems with CHECK, ANALYZE, REPAIR and SHOW CREATE
commands.
Changed myisamchk so that --fast and --check-only-changed are also honored with
--sort-index and --analyze.
Fixed fatal bug in LOAD TABLE FROM MASTER that did not lock the table during index rebuild.
LOAD DATA INFILE broke replication if the database was excluded from replication.
SLAVE STOP now will not return until the slave thread actually exits.
Full-text search via the MATCH() function and FULLTEXT index type (for MyISAM files). This
makes FULLTEXT a reserved word.
Fixed that open transactions in BDB tables are rolled back if the connection is closed unexpectedly.
Added workaround for a bug in gcc 2.96 (intel) and gcc 2.9 (IA-64) in gen_lex_hash.c.
953
Fixed memory leak in the client library when using host= in the my.cnf file.
Fixed a newly introduced bug in MyISAM, where the index file couldn't get bigger than 64M.
myisamchk.
Added
-C,
Fixed problem when using < or > with a char column that was only partly indexed.
One would get a core dump if the log file was not readable by the MySQL user.
Changed mysqladmin to use CREATE DATABASE and DROP DATABASE statements instead of the old deprecated API calls.
Only optimise the DELETE FROM tbl_name to do a drop+create of the table if we are in
AUTOCOMMIT mode (needed for BDB tables).
Added extra checks to avoid index corruption when the ISAM/MyISAM index files get full during an INSERT/UPDATE.
myisamchk didn't correctly update row checksum when used with -ro (this only gave a warning in subsequent runs).
Fixed bug in REPAIR TABLE so that it works with tables without indexes.
Fixed bug in 3.23.19; DELETE FROM tbl_name removed the .frm file.
Changed copyright for all files to GPL for the server code and utilities and to LGPL for the client libraries. See http://www.fsf.org/licenses/.
Fixed bug where all rows matching weren't updated on a MyISAM table when doing update based on key on a table with many keys and some key changed values.
The Linux MySQL RPMs and binaries are now statically linked with a linuxthread version that
has faster mutex handling when used with MySQL.
ORDER BY can now use REF keys to find subsets of the rows that need to be sorted.
Fixed bug that destroyed index when doing myisamchk --sort-records on a table with
prefix compressed index.
Fixed a problem from 3.23.17 when choosing character set on the client side.
Added FLUSH TABLES WITH READ LOCK to make a global lock suitable for making a
copy of MySQL datafiles.
Internal temporary tables will now use compressed index when using GROUP BY on VARCHAR/CHAR columns.
Fixed a problem when locking the same table with both a READ and a WRITE lock.
Fixed a bug with LEFT JOIN and ORDER BY where the first table had only one matching row.
Fixed duplicated key problem when doing big GROUP BY operations. (This bug was probably introduced in 3.23.15.)
Changed protocol to let client know if the server is in AUTOCOMMIT mode and if there is a pending transaction. If there is a pending transaction, the client library will give an error before reconnecting to the server to let the client know that the server did a rollback. The protocol is still
backward-compatible with old clients.
Fixed compile error on FreeBSD and other systems where pthread_t is not the same as int.
Fixed a race condition in INSERT DELAYED code when doing ALTER TABLE.
Fixed bug in REPAIR TABLE when the table was in use by other threads.
Added a thread cache to make it possible to debug MySQL with gdb when one does a lot of reconnects. This will also improve systems where you can't use persistent connections.
956
To start mysqld as root, you must now use the --user=root option.
Added interface to Berkeley DB. (This is not yet functional; play with it at your own risk!)
Fixed bug that other threads could steal a lock when a thread had a lock on a table and did a
FLUSH TABLES command.
The default type of IF() now depends on the second and third arguments and not only on the
second argument.
Fixed case when myisamchk could go into a loop when trying to repair a crashed table.
Added possible character sets and time zone to SHOW VARIABLES output.
Fixed bug in locking code that could result in locking problems with concurrent inserts under
high load.
Fixed a problem with DELETE of many rows on a table with compressed keys where MySQL
scanned the index to find the rows.
Fixed a bug in reconnect (at the client side) where it didn't free memory properly in some contexts.
Fixed problems in update log when using LAST_INSERT_ID() to update a table with an AUTO_INCREMENT key.
Fixed bug when using LOAD DATA INFILE on a table with BLOB/TEXT columns.
EXPLAIN SELECT ... now also prints out whether MySQL needs to create a temporary ta957
Added optimization to skip ORDER BY parts where the part is a constant expression in the
WHERE part. Indexes can now be used even if the ORDER BY doesn't match the index exactly,
as long as all the unused index parts and all the extra ORDER BY columns are constants in the
WHERE clause. See Seco 5.4.3, Como o MySQL Utiliza ndices.
UPDATE and DELETE on a whole unique key in the WHERE part are now faster than before.
Fixed a bug in CONCAT() where one of the arguments was a function that returned a modified
argument.
Fixed a critical bug in myisamchk, where it updated the header in the index file when one only
checked the table. This confused the mysqld daemon if it updated the same table at the same time. Now the status in the index file is only updated if one uses --update-state. With older
myisamchk versions you should use --read-only when only checking tables, if there is the
slightest chance that the mysqld server is working on the table at the same time!
Fixed problem when searching on DECIMAL() key field where the column data contained leading zeros.
Fix bug in myisamchk when the AUTO_INCREMENT column isn't the first key.
Dynamic character sets. A mysqld binary can now handle many different character sets (you
can choose which when starting mysqld).
When using = on BLOB or VARCHAR BINARY keys, where only a part of the column was indexed, the whole column of the result row wasn't compared.
When running in ANSI mode, don't allow columns to be used that aren't in the GROUP BY part.
Fixed problem when doing locks on the same table more than 2 times in the same LOCK TABLE command; this fixed the problem one got when running the test-ATIS test with --fast or
--check-only-changed.
958
Removed end space from double/float numbers in results from temporary tables.
Added changes for MyISAM in 3.23.12 that didn't get into the source distribution because of
CVS problems.
Fixed bug so that mysqladmin shutdown will wait for the local server to close down.
Added print_defaults program to the .rpm files. Removed mysqlbug from the client
.rpm file.
Fixed bug in MyISAM involving REPLACE ... SELECT ... which could give a corrupted
table.
LOTS of patches for Linux Alpha. MySQL now appears to be relatively stable on Alpha.
Changed DISTINCT on HEAP temporary tables to use hashed keys to quickly find duplicated
rows. This mostly concerns queries of type SELECT DISTINCT ... GROUP BY ....
This fixes a problem where not all duplicates were removed in queries of the above type. In addition, the new code is MUCH faster.
When doing mysqladmin shutdown on a local connection, mysqladmin now waits until
the PID file is gone before terminating.
Fixed bug in net_clear() which could give the error Aborted connection in the
MySQL clients.
Added options USE INDEX (key_list) and IGNORE INDEX (key_list) as parameters in SELECT.
959
Fixed problem with optimiser that could sometimes use incorrect keys.
mysqlhotcopy - fast online hot-backup utility for local MySQL databases. By Tim Bunce.
Added READ LOCAL lock that doesn't lock the table for concurrent inserts. (This is used by
mysqldump.)
Changed that LOCK TABLES ... READ doesn't anymore allow concurrent inserts.
_rowid can now be used as an alias for an integer type unique indexed column.
Added back blocking of SIGPIPE when compiling with --thread-safe-clients to make things safe for old clients.
Fixed bug in 3.23.9 where memory wasn't properly freed when using LOCK TABLES.
Fixed problem that affected queries that did arithmetic on group functions.
Fixed problem when only changing a 0 to NULL in a table with BLOB/TEXT columns.
Fixed bug in range optimiser when using many key parts and or on the middle key parts: WHERE
K1=1 and K3=2 and (K2=2 and K4=4 or K2=3 and K4=5)
Added source command to mysql to allow reading of batch files inside the mysql client.
960
Don't give an unnecessary GRANT error when using tables from many databases in the same
query.
Added VIO wrapper (needed for SSL support; by Andrei Errapart and Tnu Samuel).
Fixed optimiser problem on SELECT when using many overlapping indexes. MySQL should
now be able to choose keys even better when there are many keys to choose from.
Changed optimiser to prefer a range key instead of a ref key when the range key can uses more
columns than the ref key (which only can use columns with =). For example, the following type
of queries should now be faster: SELECT * from key_part_1=const and
key_part_2 > const2
Fixed bug that a change of all VARCHAR columns to CHAR columns didn't change row type
from dynamic to fixed.
Disabled floating-point exceptions for FreeBSD to fix core dump when doing SELECT FLOOR(POW(2,63)).
Renamed
mysqld
startup
option
-delay-key-write-for-all-tables.
Added read-next-on-key to HEAP tables. This should fix all problems with HEAP tables
when using non-UNIQUE keys.
Added --log-slow-queries option to mysqld to log all queries that take a long time to a
separate log file with a time indicating how long the query took.
Fixed optimization bug in SELECT ... LEFT JOIN ... key_col IS NULL, when
key_col could contain NULL values.
from
--delay-key-write
to
Fixed problem with ISAM when doing some ORDER BY ... DESC queries.
Fixed bug when doing a join on a text key which didn't cover the whole key.
Fixed that INSERT DELAYED doesn't update timestamps that are given.
Fixed problem that could cause MySQL to touch freed memory when doing very complicated
GROUP BY queries.
Fixed core dump if you got a crashed table where an ENUM field value was too big.
Fixed that one will get a 'disk full' error message if one gets disk full when doing sorting (instead
of waiting until we got more disk space).
In MyISAM one can now do an INSERT at the same time as other threads are reading from the
table.
Fixed bug in HEAP tables when doing insert + delete + insert + scan the table.
Changed to use snprintf() when printing floats to avoid some buffer overflows on FreeBSD.
Fixed bug that one could make a part of a PRIMARY KEY NOT NULL.
Rewrote the storage engine to use classes. This introduces a lot of new code, but will make table
handling faster and better.
Changed that FLOAT and DOUBLE (without any length modifiers) no longer are fixed decimal
point numbers.
Changed the meaning of FLOAT(X): Now this is the same as FLOAT if X <= 24 and a DOUBLE
if 24 < X <= 53.
DECIMAL(X) is now an alias for DECIMAL(X,0) and DECIMAL is now an alias for DECIMAL(10,0). The same goes for NUMERIC.
Added patches by Sergei A. Golubchik for text searching on the MyISAM level.
Fixed cache overflow problem when using full joins without keys.
Adding a column after the last field with ALTER TABLE didn't work.
963
With MyISAM, you now can have an AUTO_INCREMENT column as a key sub part: CREATE
TABLE foo (a INT NOT NULL AUTO_INCREMENT, b CHAR(5), PRIMARY KEY
(b,a))
Fixed bug in MyISAM with packed char keys that could be NULL.
AS on field name with CREATE TABLE table_name SELECT ... didn't work.
Allow use of NATIONAL and NCHAR when defining character columns. This is the same as not
using BINARY.
SET SQL_AUTO_IS_NULL=0|1 now turns on/off the handling of searching after the last inserted row with WHERE auto_increment_column IS NULL.
au-
Inserting a DATETIME into a TIME column no longer will try to store 'days' in it.
Fixed problem with storage of float/double on little endian machines. (This affected SUM().)
Fixed problem with LIKE "%" on an index that may have NULL values.
Allow creation of temporary tables with same name as the original table.
When granting a user a GRANT option for a database, he couldn't grant privileges to other users.
Allow INSERT into tbl_name VALUES (), that is, you may now specify an empty value list to insert a row in which each column is set to its default value.
Changed SUBSTRING(text FROM pos) to conform to SQL-99. (Before this construct returned the rightmost pos characters.)
Fixed range optimiser bug: SELECT * FROM table_name WHERE key_part1 >=
const AND (key_part2 = const OR key_part2 = const). The bug was that
some rows could be duplicated in the result.
You can now update index columns that are used in the WHERE clause. UPDATE tbl_name
SET KEY=KEY+1 WHERE KEY > 100
Added handling of fuzzy dates (dates where day or month is 0), such as '1999-01-00'.
965
Fixed egcs 1.1.2 optimiser bug (when using BLOB values) on Linux Alpha.
Fixed problem with LOCK TABLES combined with DELETE FROM table.
The following join is now much faster: SELECT ... FROM t1 LEFT JOIN t2 ON ...
WHERE t2.not_null_column IS NULL.
Indexes are now used for WHERE key_column = col_name even if the columns are not
identically packed.
Changed heap tables to be stored in low_byte_first order (to make it easy to convert to MyISAM
tables)
Automatic change of HEAP temporary tables to MyISAM tables in case of ``table is full'' errors.
CREATE TEMPORARY TABLE now creates a temporary table, in its own namespace, that is
automatically deleted if connection is dropped.
New reserved words (required for CASE): CASE, THEN, WHEN, ELSE and END.
A new storage engine library (MyISAM) with a lot of new features. See Seco 7.1, Tabelas
MyISAM.
You can create in-memory HEAP tables which are extremely fast for lookups.
Support for big files (63-bit) on OSs that support big files.
New operator <=> which will act as = but will return TRUE if both arguments are NULL. This is
useful for comparing changes between tables.
Columns defined as FLOAT(X) are not rounded on storage and may be in scientific notation
(1.0 E+10) when retrieved.
Changed LIKE character comparison to behave as =; This means that 'e' LIKE '' is now
true. (If the line doesn't display correctly, the latter 'e' is a French 'e' with a dot above.)
Added UNIQUE, as in CREATE TABLE table_name (col INT not null UNIQUE)
An example procedure is added: analyse, file: sql_analyse.c. This will describe the data
in your query. Try the following:
SELECT ... FROM ...
WHERE ... PROCEDURE ANALYSE([max elements,[max memory]])
This procedure is extremely useful when you want to check the data in your table!
Check whether a row has changed in an UPDATE now also works with BLOB/TEXT columns.
Added the INNER join syntax. NOTE: This made INNER a reserved word!
Added support for netmasks to the hostname in the MySQL grant tables. You can specify a netmask using the IP/NETMASK syntax.
If you compare a NOT NULL DATE/DATETIME column with IS NULL, this is changed to a
compare against 0 to satisfy some ODBC applications. (By <shreeve@uci.edu>.)
NULL IN (...) now returns NULL instead of 0. This will ensure that null_column NOT
IN (...) doesn't match NULL values.
Changed parsing of TIME strings to be more strict. Now the fractional second part is detected
(and currently skipped). The following formats are supported:
[[DAYS] [H]H:]MM:]SS[.fraction]
[[[[[H]H]H]H]MM]SS[.fraction]
967
The default index name now uses the same case as the column name on which the index name is
based.
Some small changes to the join table optimiser to make some joins faster.
SELECT DISTINCT is much faster; it uses the new UNIQUE functionality in MyISAM. One
difference compared to MySQL Version 3.22 is that the output of DISTINCT is no longer sorted.
All C client API macros are now functions to make shared libraries more reliable. Because of
this, you can no longer call mysql_num_fields() on a MYSQL object, you must use
mysql_field_count() instead.
Using AUTO_INCREMENT will now automatically make the column NOT NULL.
Added a shared library RPM. This enhancement was contributed by David Fox
(<dsfox@cogsci.ucsd.edu>).
Added --enable-large-files and --disable-large-files switches to configure. See configure.in for some systems where this is automatically turned off because of
broken implementations.
Fixed a bug core dump when using a LEFT JOIN/STRAIGHT_JOIN on a table with only one
row.
Fixed problem with GROUP BY on TINYBLOB columns; this caused bugzilla to not show rows
in some queries.
Had to do total recompile of the Windows binary version as VC++ didn't compile all relevant files for 3.22.33 :(
Added mysqlhotcopy, a fast online hot-backup utility for local MySQL databases. By Tim
Bunce.
Fixed problem that affected queries that did arithmetic on GROUP functions.
Fixed a bug in the ISAM code when deleting rows on tables with packed indexes.
Disabled floating-point exceptions for FreeBSD to fix core dump when doing SELECT FLOOR(POW(2,63)).
969
Fixed non-critical Y2K problem when writing short date to log files.
Upgraded the configure and include files to match the latest 3.23 version. This should increase
portability and make it easier to build shared libraries.
Fixed problem that could cause MySQL to touch freed memory when doing very complicated
GROUP BY queries.
Fixed core dump if you got a crashed table where an ENUM field value was too big.
Fixed that INSERT DELAYED doesn't update timestamps that are given.
Fixed problem with LEFT JOIN and COUNT() on a column which was declared NULL + and
it had a DEFAULT value.
Changed SUBSTRING(text FROM pos) to conform to SQL-99. (Before this construct returned the rightmost 'pos' characters.)
Fixed problem with LOCK TABLES combined with DELETE FROM table
Password wasn't updated correctly if privileges didn't change on: GRANT ... IDENTIFIED
BY
Fixed range optimiser bug in SELECT * FROM table_name WHERE key_part1 >=
const AND (key_part2 = const OR key_part2 = const).
Fixed bug when using LOCK TABLES table_name READ; FLUSH TABLES;
Changed configure to not use big file handling on Linux as this crashes some Red Hat 6.0
systems
Fixed deadlock problem when using INSERT DELAYED on a table locked with LOCK TABLES.
Fixed deadlock problem when using DROP TABLE on a table that was locked by another thread.
Fixed problem in the C API when you called mysql_close() directly after
mysql_init().
MySQL on Windows is now compiled with VC++ 6.0 instead of with VC++ 5.0.
Fixed problem with DELETE FROM TABLE when table was locked by another thread.
Changed to use TCP_NODELAY also on Linux (should give faster TCP/IP connections).
Production)
Fixed problem with queries that needed temporary tables with BLOB columns.
Fixes a fatal problem in 3.22.17 on Linux; after shutdown not all threads died properly.
Added option -O flush_time=# to mysqld. This is mostly useful on Windows and tells
how often MySQL should close all unused tables and flush all updated tables to disk.
Fixed problem that a VARCHAR column compared with CHAR column didn't use keys efficiently.
Fixed a core dump problem when using --log-update and connecting without a default database.
Using LEFT JOIN on tables that had circular dependencies caused mysqld to hang forever.
mysqladmin processlist could kill the server if a new user logged in.
longlong2str is now much faster than before. For Intel x86 platforms, this function is
written in optimised assembler.
GRANT used with IDENTIFIED BY didn't take effect until privileges were flushed.
973
Fixed problem with ORDER BY with 'only index' optimization when there were multiple key definitions for a used column.
DATE and DATETIME columns are now up to 5 times faster than before.
INSERT DELAYED can be used to let the client do other things while the server inserts rows
into a table.
LEFT JOIN USING (col1,col2) didn't work if one used it with tables from 2 different
databases.
LOAD DATA LOCAL INFILE didn't work in the Unix version because of a missing file.
Fixed problems with VARCHAR/BLOB on very short rows (< 4 bytes); error 127 could occur
when deleting rows.
Updating BLOB/TEXT through formulas didn't work for short (< 256 char) strings.
When you did a GRANT on a new host, mysqld could die on the first connect from this host.
Fixed bug when one used ORDER BY on column name that was the same name as an alias.
Allow empty arguments to mysqld to make it easier to start from shell scripts.
Setting a TIMESTAMP column to NULL didn't record the timestamp value in the update log.
Fixed lock handler bug when one did INSERT INTO TABLE ... SELECT ... GROUP
BY.
Added a patch for localtime_r() on Windows so that it will no lonher crash if your date is
> 2039, but instead will return a time of all zero.
SELECT COUNT(*) ... LEFT JOIN ... didn't work with no WHERE part.
974
You can now set the password for a user with the GRANT ... TO user IDENTIFIED BY
'password' syntax.
Added option SQL_SMALL_RESULT to SELECT to force use of fast temporary tables when
you know that the result set will be small.
Day number is now adjusted to maximum days in month if the resulting month after
DATE_ADD/DATE_SUB() doesn't have enough days.
Fixed a bug in sql_list.h that made ALTER TABLE dump core in some contexts.
The hostname in user@hostname can now include '.' and '-' without quotes in the context of
the GRANT, REVOKE and SET PASSWORD FOR ... statements.
Fix for isamchk for tables which need big temporary files.
Important: You must run the mysql_fix_privilege_tables script when you upgrade
to this version! This is needed because of the new GRANT system. If you don't do this, you will
get Access denied when you try to use ALTER TABLE, CREATE INDEX, or DROP INDEX.
Changed USER() to return a value in user@host format. Formerly it returned only user.
Changed the syntax for how to set PASSWORD for another user.
New command FLUSH STATUS that resets most status variables to zero.
Added
support
for
Thai
sorting
<pruet@ds90.intanon.nectec.or.th>).
Added option SET SQL_WARNINGS=1 to get a warning count also for simple (single-row) inserts.
MySQL now uses SIGTERM instead of SIGQUIT with shutdown to work better on FreeBSD.
975
(by
Pruet
Boonma
mysql_install_db no longer starts the MySQL server! You should start mysqld with
safe_mysqld after installing it! The MySQL RPM will, however, start the server as before.
Added --bootstrap option to mysqld and recoded mysql_install_db to use it. This
will make it easier to install MySQL with RPMs.
Changed +, - (sign and minus), *, /, %, ABS() and MOD() to be BIGINT aware (64-bit safe).
MySQL now always reports the conflicting key values when a duplicate key entry occurs.
(Before this was only reported for INSERT.)
New
syntax:
INSERT
col_name=value, ...
Most errors in the .err log are now prefixed with a time stamp.
Fixed some problems with sorting of the koi8 character sets; users of koi8 must run
isamchk -rq on each table that has an index on a CHAR or VARCHAR column.
New script mysql_setpermission, by Luuk de Boer. It allows easy creation of new users
with permissions for specific databases.
Allow use of hexadecimal strings (0x...) when specifying a constant string (like in the column
separators with LOAD DATA INFILE).
Added more variables to SHOW STATUS and changed format of output to be like SHOW VARIABLES.
Added extended-status command to mysqladmin which will show the new status variables.
INTO
tbl_name
SET
col_name=value,
Added casts and changed include files to make MySQL easier to compile on AIX and DEC
OSF/1 4.x
Fixed conversion problem when using ALTER TABLE from a INT to a short CHAR() column.
Added SELECT HIGH_PRIORITY; this will get a lock for the SELECT even if there is a thread waiting for another SELECT to get a WRITE LOCK.
You can now start mysqld on Windows with the --flush option. This will flush all tables to
disk after each update. This makes things much safer on the Windows platforms but also much
slower.
Fix problem with ORDER BY and LEFT JOIN and const tables.
Fixed problem with ORDER BY if the first ORDER BY column was a key and the rest of the
ORDER BY columns wasn't part of the key.
MySQL clients on NT will now by default first try to connect with named pipes and after this
with TCP/IP.
Fixed a problem with DROP TABLE and mysqladmin shutdown on Windows (a fatal bug
from 3.22.6).
Added an extra thread signal loop on shutdown to avoid some error messages from the client.
MySQL now uses the next available number as extension for the update log file.
You can now use the /*! ... */ syntax to hide MySQL-specific keywords when you write
portable code. MySQL will parse the code inside the comments as if the surrounding /*! and
*/ comment characters didn't exist.
977
OPTIMIZE TABLE tbl_name can now be used to reclaim disk space after many deletes.
Currently, this uses ALTER TABLE to regenerate the table, but in the future it will use an integrated isamchk for more speed.
Fixed slow UPDATE and DELETE operations when using DATETIME or DATE keys.
Changed optimiser to make it better at deciding when to do a full join and when using keys.
You can now use mysqladmin proc to display information about your own threads. Only
users with the PROCESS privilege can get information about all threads. (In 4.0.2 one needs the
SUPER privilege for this.)
Added handling of formats YYMMDD, YYYYMMDD, YYMMDDHHMMSS for numbers when using
DATETIME and TIMESTAMP types. (Formerly these formats only worked with strings.)
Added connect option CLIENT_IGNORE_SPACE to allow use of spaces after function names
and before '(' (Powerbuilder requires this). This will make all function names reserved words.
The lexical analyser now uses ``perfect hashing'' for faster parsing of SQL statements.
Faster mysqldump.
For the LOAD DATA INFILE statement, you can now use the new LOCAL keyword to read
the file from the client. mysqlimport will automatically use LOCAL when importing with the
TCP/IP protocol.
MySQL-NT can now use named pipes, which means that you can now use MySQL-NT without
having to install TCP/IP.
All table lock handing is changed to avoid some very subtle deadlocks when using DROP TABLE, ALTER TABLE, DELETE FROM TABLE and mysqladmin flush-tables under
heavy usage. Changed locking code to get better handling of locks of different types.
Added a check that the error message file contains error messages suitable for the current version of mysqld. (To avoid errors if you accidentally try to use an old error message file.)
All count structures in the client (affected_rows(), insert_id(), ...) are now of type
BIGINT to allow 64-bit values to be used. This required a minor change in the MySQL protocol
which should affect only old clients when using tables with AUTO_INCREMENT values > 16M.
Change mysys and dbug libraries to allocate all thread variables in one struct. This makes it
easier to make a threaded libmysql.dll library.
Use the result from gethostname() (instead of uname()) when constructing .pid file names.
COUNT(), STD() and AVG() are extended to handle more than 4G rows.
You can now store values in the range -838:59:59 <= x <= 838:59:59 in a TIME column.
Warning: incompatible change!! If you set a TIME column to too short a value, MySQL now
assumes the value is given as: [[[D ]HH:]MM:]SS instead of HH[:MM[:SS]].
TIME_TO_SEC() and SEC_TO_TIME() can now handle negative times and hours up to
32767.
Added new option SET SQL_LOG_UPDATE={0|1} to allow users with the PROCESS privilege to bypass the update log. (Modified patch from Sergey A Mukhin
<violet@rosnet.net>.)
Initialise line buffer in mysql.cc to make BLOB reading from pipes safer.
Added -O max_connect_errors=# option to mysqld. Connect errors are now reset for
each correct connection.
Add support for INSERT INTO table ... VALUES(...),(...),(...), to allow inserting multiple rows with a single statement.
INSERT INTO tbl_name is now also cached when used with LOCK TABLES. (Previously
only INSERT ... SELECT and LOAD DATA INFILE were cached.)
mysqld will now ignore trailing ';' characters in queries. This is to make it easier to migrate
from some other SQL servers that require the trailing ';'.
Warning: incompatible change! Added Oracle GREATEST() and LEAST() functions. You
must now use these instead of the MAX() and MIN() functions to get the largest/smallest value
from a list of values. These can now handle REAL, BIGINT and string (CHAR or VARCHAR) values.
Warning: incompatible change! DAYOFWEEK() had offset 0 for Sunday. Changed the offset
to 1.
Give an error for queries that mix GROUP BY columns and fields when there is no GROUP BY
specification.
979
Index-only optimization; some queries are now resolved using only indexes. Until MySQL 4.0,
this works only for numeric columns. See Seco 5.4.3, Como o MySQL Utiliza ndices.
Added --tmpdir option to mysqld, for specifying the location of the temporary file directory.
DROP TABLE now waits for all users to free a table before deleting it.
New functions BIN(), OCT(), HEX() and CONV() for converting between different number
bases.
If you created a table with a record length smaller than 5, you couldn't delete rows from the table.
Added optimization to remove const reference tables from ORDER BY and GROUP BY.
mysqld now automatically disables system locking on Linux and Windows, and for systems
that use MIT-pthreads. You can force the use of locking with the -enable-external-locking option.
Added --console option to mysqld, to force a console window (for error messages) when
using Windows.
Changed name of user-specific configuration file from my.cnf to .my.cnf (Unix only).
Fixed a lock problem (bug in MySQL Version 3.22.1) when closing temporary tables.
Searching on multiple constant keys that matched more than 30% of the rows didn't always use
the best possible key.
You can now save default options (like passwords) in a configuration file (my.cnf).
Lots of small changes to get ORDER BY to work when no records are found when using fields
that are not in GROUP BY (MySQL extension).
Added --chroot option to mysqld, to start mysqld in a chroot environment (by Nikki Chumakov <nikkic@cityline.ru>).
Trailing spaces are now ignored when comparing case-sensitive strings; this should fix some
problems with ODBC and flag 512!
Added --one-thread option to mysqld, for debugging with LinuxThreads (or glibc).
(This replaces the -T32 flag)
Added DROP TABLE IF EXISTS to prevent an error from occurring if the table doesn't exist.
IF and EXISTS are now reserved words (they would have to be sooner or later).
Added new API functions mysql_init() and mysql_options(). You now MUST call
mysql_init() before you call mysql_real_connect(). You don't have to call
mysql_init() if you only use mysql_connect().
Added AFTER column and FIRST options to ALTER TABLE ... ADD columns. This
makes it possible to add a new column at some specific location within a row in an existing table.
WEEK() now takes an optional argument to allow handling of weeks when the week starts on
981
Monday (some European countries). By default, WEEK() assumes the week starts on Sunday.
UPDATE now returns information about how many rows were matched and updated, and how
many ``warnings'' occurred when doing the update.
ENUM and SET columns were compared in binary (case-sensitive) fashion; changed to be caseinsensitive.
New (backward-compatible) connect protocol that allows you to specify the database to use
when connecting, to get much faster connections to a specific database.
The mysql_real_connect() call is changed to:
mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
const char *passwd, const char *db, uint port,
const char *unix_socket, uint client_flag)
Each connection is handled by its own thread, rather than by the master accept() thread. This
fixes permanently the telnet bug that was a topic on the mail list some time ago.
All TCP/IP connections are now checked with backward-resolution of the hostname to get better
security. mysqld now has a local hostname resolver cache so connections should actually be
faster than before, even with this feature.
A site automatically will be blocked from future connections if someone repeatedly connects
with an ``improper header'' (like when one uses telnet).
You can now refer to tables in different databases with references of the form
tbl_name@db_name or db_name.tbl_name. This makes it possible to give a user read
access to some tables and write access to others simply by keeping them in different databases!
Added --user option to mysqld, to allow it to run as another Unix user (if it is started as the
Unix root user).
Added caching of users and access rights (for faster access rights checking)
Normal users (not anonymous ones) can change their password with mysqladmin password 'new_password'. This uses encrypted passwords that are not logged in the normal
MySQL log!
All important string functions are now coded in assembler for x86 Linux machines. This gives a
speedup of 10% in many cases.
For tables that have many columns, the column names are now hashed for much faster column
name lookup (this will speed up some benchmark tests a lot!)
Some benchmarks are changed to get better individual timing. (Some loops were so short that a
specific test took < 2 seconds. The loops have been changed to take about 20 seconds to make it
easier to compare different databases. A test that took 1-2 seconds before now takes 11-24 seconds, which is much better)
Re-arranged SELECT code to handle some very specific queries involving group functions (like
COUNT(*)) without a GROUP BY but with HAVING. The following now works:
mysql> SELECT COUNT(*) as C FROM table HAVING C > 1;
982
Changed the protocol for field functions to be faster and avoid some calls to malloc().
Added -T32 option to mysqld, for running all queries under the main thread. This makes it
possible to debug mysqld under Linux with gdb!
Allow STRAIGHT_JOIN to be used between two tables to force the optimiser to join them in a
specific order.
String functions now return VARCHAR rather than CHAR and the column type is now VARCHAR
for fields saved as VARCHAR. This should make the MyODBC driver better, but may break some
old MySQL clients that don't handle FIELD_TYPE_VARCHAR the same way as FIELD_TYPE_CHAR.
CREATE INDEX and DROP INDEX are now implemented through ALTER TABLE. CREATE
TABLE is still the recommended (fast) way to create indexes.
Added time column to mysqladmin processlist to show how long a query has taken or
how long a thread has slept.
Added lots of new variables to show variables and some new to show status.
Added new type YEAR. YEAR is stored in 1 byte with allowable values of 0, and 1901 to 2155.
Added new DATE type that is stored in 3 bytes rather than 4 bytes. All new tables are created
with the new date type if you don't use the --old-protocol option to mysqld.
Fixed bug in record caches; for some queries, you could get Error from table handler: # on some operating systems.
Fixed problem when sending SIGHUP to mysqld; mysqld core dumped when starting from
boot on some systems.
DELETE FROM tbl_name without a WHERE condition is now done the long way when you
use LOCK TABLES or if the table is in use, to avoid race conditions.
Fixed some possible race conditions when doing many reopen/close on the same tables under
heavy load! This can happen if you execute mysqladmin refresh often. This could in some very rare cases corrupt the header of the index file and cause error 126 or 138.
Fixed fatal bug in refresh() when running with the --skip-external-locking option. There was a ``very small'' time gap after a mysqladmin refresh when a table could be
corrupted if one thread updated a table while another thread did mysqladmin refresh and
another thread started a new update ont the same table before the first thread had finished. A refresh (or --flush-tables) will now not return until all used tables are closed!
SELECT DISTINCT with a WHERE clause that didn't match any rows returned a row in some
contexts (bug only in 3.21.31).
GROUP BY + ORDER BY returned one empty row when no rows where found.
Fixed a bug in the range optimiser that wrote Use_count: Wrong count for ... in the
error log file.
LEFT JOIN core dumped if the second table is used with a constant WHERE/ON expression
that uniquely identifies one record.
Fixed problems with DATE_FORMAT() and incorrect dates. DATE_FORMAT() now ignores
'%' to make it possible to extend it more easily in the future.
mysql now returns an exit code > 0 if the query returned an error.
Save the pid of the signal handler thread in the pid file instead of the pid of the main thread.
sql_acc() now closes the mysql grant tables after a reload to save table space and memory.
Changed LOAD DATA to use less memory with tables and BLOB columns.
Sorting on a function which made a division / 0 produced a wrong set in some cases.
Fixed SELECT problem with LEFT() when using the czech character set.
to
984
file
in
mysql
client.
By
Tommy
Larsen
Fixed problem in isamchk; it couldn't repair a packed table in a very unusual case.
SELECT statements with & or | (bit functions) failed on columns with NULL values.
When comparing a field = field, where one of the fields was a part key, only the length of the
part key was compared.
Fixed permission problem on result file with SELECT ... INTO OUTFILE ...
Fixed problem in range optimiser (core dump) for a very complex query.
Fixed bug on Alpha when using integer keys. (Other keys worked on Alpha.)
Fixed bug in record caches; for some queries, you could get Error from table handler: # on some operating systems.
lock
functions
Changed connect timeout to 3 seconds to make it somewhat harder for crackers to kill mysqld
through telnet + TCP/IP.
Fixed bug in range optimiser when using WHERE key_part_1 >= something AND
key_part_2 <= something_else.
WHERE with string_col_key = constant_string didn't always find all rows if the
column had many values differing only with characters of the same sort value (like e and e with
an accent).
Strings keys looked up with 'ref' were not compared in case-sensitive fashion.
Ignore users with old (8-byte) password on startup if not using --old-protocol option to
985
GET_LOCK(string,timeout),
RELEA-
mysqld.
SELECT which matched all key fields returned the values in the case of the matched values, not
of the found values. (Minor problem.)
An ENUM field that is not declared NOT NULL has NULL as the default value. (Previously, the
default value was the first enumeration value.)
Fixed bug in the join optimiser code when using many part keys on the same key: INDEX
(Organisation,Surname(35),Initials(35)).
Added some tests to the table order optimiser to get some cases with SELECT ... FROM
many_tables much faster.
Added a retry loop around accept() to possibly fix some problems on some Linux machines.
You can now kill threads that are waiting on a disk-full condition.
Fixed a bug when using 8 bytes long (alpha); filesort() didn't work. Affects DISTINCT,
ORDER BY and GROUP BY on 64-bit processors.
You couldn't delete from a table if no one had done a SELECT on the table.
Fixed problem with range optimiser with many OR operators on key parts inside each other.
Recoded MIN() and MAX() to work properly with strings and HAVING.
Changed default umask value for new files from 0664 to 0660.
Fixed problem with LEFT JOIN and constant expressions in the ON part.
The following symbols are now reserved words: TIME, DATE, TIMESTAMP, TEXT, BIT,
ENUM, NO, ACTION, CHECK, YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, STATUS, VARIABLES.
Setting a TIMESTAMP to NULL in LOAD DATA INFILE ... didn't set the current time for
the TIMESTAMP.
Added function TIME_FORMAT(). This works like DATE_FORMAT(), but takes a time string
('HH:MM:SS') as argument.
Fixed unlikely(?) key optimiser bug when using OR operators of key parts inside AND expressions.
Changed ALTER TABLE to work with Windows (Windows can't rename open files). Also fixed
a couple of small bugs in the Windows version.
All standard MySQL clients are now ported to MySQL for Windows.
Starting with this version, all MySQL distributions will be configured, compiled and tested with
crash-me and the benchmarks on the following platforms: SunOS 5.6 sun4u, SunOS 5.5.1
sun4u, SunOS 4.14 sun4c, SunOS 5.6 i86pc, Irix 6.3 mips5k, HP-UX 10.20 hppa, AIX 4.2.1
ppc, OSF/1 V4.0 alpha, FreeBSD 2.2.2 i86pc and BSDI 3.1 i386.
Fix COUNT(*) problems when the WHERE clause didn't match any records. (Bug from
3.21.17.)
Removed that NULL = NULL is true. Now you must use IS NULL or IS NOT NULL to test
whether a value is NULL. (This is according to SQL-99 but may break old applications that are
ported from mSQL.) You can get the old behaviour by compiling with -DmSQL_COMPLIANT.
Fixed bug that core dumped when using many LEFT OUTER JOIN clauses.
987
Added functions DAYOFYEAR(), DAYOFMONTH(), MONTH(), YEAR(), WEEK(), QUARTER(), HOUR(), MINUTE(), SECOND() and FIND_IN_SET().
Fixed optimiser bug when using WHERE data_field = date_field2 AND date_field2 = constant.
Changed the maximum table name and column name lengths from 32 to 64.
Changed protocol (downward compatible) to mark if a column has the AUTO_INCREMENT attribute or is a TIMESTAMP. This is needed for the new Java driver.
Solaris 2.6: Fixed configure bugs and increased maximum table size from 2G to 4G.
988
Added automatic reconnect to the libmysql.c library. If a write command fails, an automatic
reconnect is done.
Recoded yacc/bison stack allocation to be even safer and to allow MySQL to handle even
bigger expressions.
The client library now uses the value of the environment variable MYSQL_HOST as the default
host if it's defined.
SELECT col_name, SUM(expr) now returns NULL for col_name when there are matching rows.
Fixed problem with comparing binary strings and BLOB values with ASCII characters over 127.
Fixed lock problem: when freeing a read lock on a table with multiple read locks, a thread waiting for a write lock would have been given the lock. This shouldn't affect data integrity, but
could possibly make mysqld restart if one thread was reading data that another thread modified.
Optimized key block caching. This will be quicker than the old algorithm when using bigger key
caches.
989
Added ODBC 2.0 & 3.0 functions POWER(), SPACE(), COT(), DEGREES(), RADIANS(),
ROUND(2 arg) and TRUNCATE().
In some cases, default values were not used for NOT NULL fields.
Allow empty strings as default values for BLOB and TEXT, to be compatible with mysqldump.
Changed Makefiles to hopefully work better with BSD systems. Also, manual.dvi is now included in the distribution to avoid having stupid make programs trying to rebuild it.
A new sortorder german-1. That is a normal ISO-Latin1 with a german sort order.
Perl DBI/DBD is now included in the distribution. DBI is now the recommended way to connect
to MySQL from Perl.
New portable benchmark suite with DBD, with test results from mSQL 2.0.3, MySQL, PostgreSQL 6.2.1 and Solid server 2.2.
crash-me is now included with the benchmarks; this is a Perl program designed to find as
many limits as possible in an SQL server. Tested with mSQL, PostgreSQL, Solid and MySQL.
Table and column name completion for mysql command-line tool, by Zeev Suraski and Andi
Gutmans.
Added new command REPLACE that works like INSERT but replaces conflicting records with
the new record. REPLACE INTO TABLE ... SELECT ... works also.
Added new commands CREATE DATABASE db_name and DROP DATABASE db_name.
TABLE: ALTER
TABLE
name
RENAME
TO
Stack checking and bison memory overrun checking to make MySQL safer with weird queries.
Changed language name from germany to german to be consistent with the other language names.
Fixed sorting problem on functions returning a FLOAT. Previously, the values were converted to
INT values before sorting.
Fixed slow sorting when sorting on key field when using key_column=constant.
Changed the place where HAVING should be. According to the SQL standards, it should be after
GROUP BY but before ORDER BY. MySQL Version 3.20 incorrectly had it last.
Added automatic adjusting of number of connections and table cache size if the maximum number of files that can be opened is less than needed. This should fix that mysqld doesn't crash
even if you haven't done a ulimit -n 256 before starting mysqld.
Added lots of limit checks to make it safer when running with too little memory or when doing
weird queries.
Added retry of interrupted reads and clearing of errno. This makes Linux systems much safer!
Fixed locking bug when using many aliases on the same table in the same SELECT.
New error message so you can check whether the connection was lost while the command was
991
Added --table option to mysql to print in table format. Moved time and row information after query result. Added automatic reconnect of lost connections.
New multi-user test tests/fork_test.pl to put some strain on the thread library.
Fixed ftruncate() call in MIT-pthreads. This made isamchk destroy the .ISM files on
(Free)BSD 2.x systems.
Many memory overrun checks. All string functions now return NULL if the returned string
should be longer than max_allowed_packet bytes.
Changed the name of the INTERVAL type to ENUM, because INTERVAL is used in SQL-99.
In some cases, doing a JOIN + GROUP + INTO OUTFILE, the result wasn't grouped.
Added CURTIME().
Fixed better FOREIGN KEY syntax skipping. New reserved words: MATCH, FULL, PARTIAL.
mysqld now allows IP number and hostname for the --bind-address option.
Added SET CHARACTER SET cp1251_koi8 to enable conversions of data to and from the
cp1251_koi8 character set.
Lots of changes for Windows 95 port. In theory, this version should now be easily portable to
Windows 95.
Changed the CREATE COLUMN syntax of NOT NULL columns to be after the DEFAULT value,
as specified in the SQL-99 standard. This will make mysqldump with NOT NULL and default
values incompatible with MySQL Version 3.20.
Added many function name aliases so the functions can be used with ODBC or SQL-92 syntax.
Fixed syntax of ALTER TABLE tbl_name ALTER COLUMN col_name SET DEFAULT NULL.
Fixed core dump when updating as a user who has only SELECT privilege.
INSERT ... SELECT ... GROUP BY didn't work in some cases. An Invalid use
of group function error occurred.
When using LIMIT, SELECT now always uses keys instead of record scan. This will give better
performance on SELECT and a WHERE that matches many rows.
992
Configure changes.
MySQL now works with the new thread library on BSD/OS 3.0.
Added compatibility functions CHECK and REFERENCES. CHECK is now a reserved word.
Added ALL option to GRANT for better compatibility. (GRANT is still a dummy function.)
Added function LAST_INSERT_ID() SQL function to retrieve last AUTO_INCREMENT value. This is intended for clients to ODBC that can't use the mysql_insert_id() API function, but can be used by any client.
CREATE now supports all ODBC types and the mSQL TEXT type. All ODBC 2.5 functions are
also supported (added REPEAT). This provides better portability.
Added text types TINYTEXT, TEXT, MEDIUMTEXT and LONGTEXT. These are actually
BLOBtypes, but all searching is done in case-insensitive fashion.
All old BLOB fields are now TEXT fields. This only changes that all searching on strings is done
in case-sensitive fashion. You must do an ALTER TABLE and change the datatype to BLOB if
you want to have tests done in case-sensitive fashion.
Made the locking code a bit safer. Fixed very unlikely deadlock situation.
Fixed a couple of bugs in the range optimiser. Now the new range benchmark test-select
works.
Fixed bug in range calculation that could return empty set when searching on multiple key with
only one entry (very rare).
Most things ported to FSU Pthreads, which should allow MySQL to run on SCO. See Seco 2.6.6.9, Notas SCO.
Added handling of calculation of SUM() functions. For example, you can now use
SUM(column)/COUNT(column).
Added handling of trigometric functions: PI(), ACOS(), ASIN(), ATAN(), COS(), SIN()
and TAN().
Now allow also the old SELECT ... INTO OUTFILE syntax.
Fixed bug with GROUP BY and SELECT on key with many values.
Fixed bug in BETWEEN in range optimiser (did only test = of the first argument).
Added new client function mysql_errno(), to get the error number of the error message.
This makes error checking in the client much easier. This makes the new server incompatible
with the 3.20.x server when running without --old-protocol. The client code is backwardcompatible. More information can be found in the README file!
994
New function FROM_UNIXTIME(timestamp) which returns a date string in 'YYYYMM-DD HH:MM:SS' format.
Should now configure and compile on OSF/1 4.0 with the DEC compiler.
Configuration and compilation on BSD/OS 3.0 works, but due to some bugs in BSD/OS 3.0,
mysqld doesn't work on it yet.
Configuration and compilation on FreeBSD 3.0 works, but I couldn't get pthread_create to
work.
Fixed some possible buffer overflows if filenames that are too long are used.
mysqld doesn't accept hostnames that start with digits followed by a '.', because the hostname may look like an IP number.
Added --skip-networking option to mysqld, to allow only socket connections. (This will
not work with MIT-pthreads!)
Removed incorrect free() that killed the server on CREATE DATABASE or DROP DATABASE.
Added -O max_join_size=# option to mysqld, to be able to set a limit how big queries
995
(in this case big = slow) one should be able to handle without specifying SET
SQL_BIG_SELECTS=1. A # = is about 10 examined records. The default is ``unlimited''.
When comparing a TIME, DATE, DATETIME or TIMESTAMP column to a constant, the constant is converted to a time value before performing the comparison. This will make it easier to
get ODBC (particularly Access97) to work with the above types. It should also make dates easier to use and the comparisons should be quicker than before.
Applied patch from Jochen Wiedmann that allows query() in mysqlperl to take a query
with \0 in it.
SELECT * INTO OUTFILE, which didn't correctly if the outfile already existed.
The range optimiser is coded, but only 85% tested. It can be enabled with --new, but it crashes
core a lot yet...
More portable. Should compile on AIX and alpha-digital. At least the isam library should be
relatively 64-bit clean.
Many small portability changes (from the AIX and alpha-digital port) Better checking of pthread(s) library.
Decreased size of some buffers to get fewer problems on systems with little memory. Also added more checks to handle ``out of memory'' problems.
mysqladmin: you can now do mysqladmin kill 5,6,7,8 to kill multiple threads.
When the maximum connection limit is reached, one extra connection by a user with the process_acl privilege is granted.
Almost all of the function code is now tested in the internal test suite.
Added a fix for Visual FoxBase so that any schema name from a table specification is automatically removed.
996
Removed function BETWEEN(a,b,c). Use the standard SQL syntax instead: expr BETWEEN expr AND expr.
MySQL no longer has to use an extra temporary table when sorting on functions or SUM()
functions.
Added --log-update option to mysqld, to get a log suitable for incremental updates.
New command EXPLAIN SELECT ... to get information about how the optimiser will do
the join.
For easier client code, the client should no longer use FIELD_TYPE_TINY_BLOB, FIELD_TYPE_MEDIUM_BLOB, FIELD_TYPE_LONG_BLOB or FIELD_TYPE_VAR_STRING
(as previously returned by mysql_list_fields). You should instead only use FIELD_TYPE_BLOB or FIELD_TYPE_STRING. If you want exact types, you should use the
command SHOW FIELDS.
Added varbinary syntax: 0x###### which can be used as a string (default) or a number.
ENUM
A string which can take only a couple of defined values. The value is stored as a 1-3 byte
number that is mapped automatically to a string. This is sorted according to string positions!
SET
A string which may have one or many string values separated with ','. The string is stored as
a 1-, 2-, 3-, 4- or 8-byte number where each bit stands for a specific set member. This is sorted according to the unsigned value of the stored packed number.
Now all function calculation is done with double or long long. This will provide the full
997
64-bit range with bit functions and fix some conversions that previously could result in precision
losses. One should avoid using unsigned long long columns with full 64-bit range
(numbers bigger than 9223372036854775807) because calculations are done with signed
long long.
ORDER BY will now put NULL field values first. GROUP BY will also work with NULL values.
New range optimiser that can resolve ranges when some keypart prefix is constant. Example:
mysql> SELECT * FROM tbl_name
->
WHERE key_part_1="customer"
->
AND key_part_2>=10 AND key_part_2<=10;
Added -p# (remove # directories from path) to isamlog. All files are written with a relative
path from the database directory Now mysqld shouldn't crash on shutdown when using the -log-isam option.
The mysqld server is now compiled by default without debugging information. This will make
the daemon smaller and faster.
Now one usually only has to specify the --basedir option to mysqld. All other paths are relative in a normal installation.
BLOB columns sometimes contained garbage when used with a SELECT on more than one table
and ORDER BY.
Fixed that calculations that are not in GROUP BY work as expected (SQL-99 extension). Example:
mysql> SELECT id,id+1 FROM table GROUP BY id;
The test of using MYSQL_PWD was reversed. Now MYSQL_PWD is enabled as default in the default release.
Fixed conversion bug which caused mysqld to core dump with Arithmetic error on SPARC386.
When using overlapping (unnecessary) keys and join over many tables, the optimiser could get
confused and return 0 records.
998
You can now use BLOB columns and the functions IS NULL and IS NOT NULL in the WHERE clause.
All communication packets and row buffers are now allocated dynamically on demand. The default value of max_allowed_packet is now 64K for the server and 512K for the client. This
is mainly used to catch incorrect packets that could trash all memory. The server limit may be
changed when it is started.
The ELT() function is renamed to FIELD(). The new ELT() function returns a value based
on an index: FIELD() is the inverse of ELT() Example: ELT(2,"A","B","C") returns
"B". FIELD("B","A","B","C") returns 2.
Fixed memory overrun bug in WHERE with many unoptimisable brace levels.
If hostname isn't found by get_hostname, only the IP is checked. Previously, you got Access denied.
INSERT INTO ... SELECT ... WHERE could give the error Duplicated field.
LIKE was case-sensitive in some places and case-insensitive in others. Now LIKE is always case-insensitive.
New command SET SQL_SELECT_LIMIT=#. See the FAQ for more details.
Change FROM_DAYS() and WEEKDAY() to also take a full TIMESTAMP or DATETIME as argument. Before they only took a number of type YYYYMMDD or YYMMDD.
More changes in MIT-pthreads to get them safer. Fixed also some link bugs at least in SunOS.
Changed mysqld to work around a bug in MIT-pthreads. This makes multiple small SELECT
operations 20 times faster. Now lock_test.pl should work.
The mysqlbug script is now distributed built to allow for reporting bugs that appear during the
build with it.
999
Fixed bug in SELECT optimiser when using many tables with the same column used as key to
different tables.
Removed possible loop when a thread waits for command from client and fcntl() fails.
Thanks to Mike Bretz for finding this bug.
Changed alarm loop in mysqld.cc because shutdown didn't always succeed in Linux.
Removed use of termbits from mysql.cc. This conflicted with glibc 2.0.
If one gives -p or --password option to mysql without an argument, the user is solicited for
the password from the tty.
Sometimes when doing a reconnect on a down connection this succeeded first on second try.
AVG() gave too small value on some SELECT statements with GROUP BY and ORDER BY.
Changed to use a thread to handle alarms instead of signals on Solaris to avoid race conditions.
Added many patches to MIT-pthreads. This fixes at least one lookup bug.
Added support for Slovenian characters. The Contrib directory contains source and instructions for adding other character sets.
Allow ORDER BY and GROUP BY on items that aren't in the SELECT list. (Thanks to Wim Bonis <bonis@kiss.de>, for pointing this out.)
Added changes for glibc 2.0. To get glibc to work, you should add the gibc2.0-sigwait-patch before compiling glibc.
Fixed bug in ALTER TABLE when changing a NOT NULL field to allow NULL values.
Added some SQL-92 synonyms as field types to CREATE TABLE. CREATE TABLE now allows FLOAT(4) and FLOAT(8) to mean FLOAT and DOUBLE.
When using SELECT ... INTO OUTFILE, all temporary tables are ISAM instead of HEAP
to allow big dumps.
Changed date functions to be string functions. This fixed some ``funny'' side effects when sorting on dates.
Added --port and --socket options to all utility programs and mysqld.
Fixed MIT-pthreads readdir_r(). Now mysqladmin create database and mysqladmin drop database should work.
Changed MIT-pthreads to use our tempnam(). This should fix the ``sort aborted'' bug.
Added sync of records count in sql_update. This fixed slow updates on first connection.
(Thanks to Vaclav Bittner for the test.)
MEDIUMBLOB fixed.
1001
SELECT ... INTO OUTFILE now creates the file in the current database directory.
Changes to make_binary_distribution.
Added some comments to installation instructions about configure's C++ link test.
ALTER TABLE didn't copy null bit. As a result, fields that were allowed to have NULL values
were always NULL.
New commands: ALTER TABLE, SELECT ... INTO OUTFILE and LOAD DATA INFILE.
New script add_file_priv which adds the new field File_priv to the user table. This
script must be executed if you want to use the new SELECT ... INTO and LOAD DATA
INFILE ... commands with a version of MySQL earlier than 3.20.7.
Increased maximum number of keys to 16 and maximum number of key parts to 15.
Portable to more systems because of MIT-pthreads, which will be used automatically if configure cannot find a -lpthreads library.
Added GNU-style long options to almost all programs. Test with program --help.
The FAQ is now in .texi format and is available in .html, .txt and .ps formats.
Changed sql_lex to handle \0 unquoted, but the client can't send the query through the C
API, because it takes a str pointer. You must use mysql_real_query() to send the query.
mysqld now uses the N_MAX_KEY_LENGTH from nisam.h as the maximum allowable key
length.
mysql now outputs '\0', '\t', '\n' and '\\' when encountering ASCII 0, tab, newline
or '\' while writing tab-separated output. This is to allow printing of binary data in a portable
format. To get the old behaviour, use -r (or --raw).
Added new API function mysql_fetch_lengths(MYSQL_RES *), which returns an array of column lengths (of type uint).
Changed the optimiser a little to get better results when searching on a key part.
Added SELECT option STRAIGHT_JOIN to tell the optimiser that it should join tables in the
given order.
Added support for comments starting with '--' in mysql.cc (Postgres syntax).
You can have SELECT expressions and table columns in a SELECT which are not used in the
group part. This makes it efficient to implement lookups. The column that is used should be a
constant for each group because the value is calculated only once for the first row that is found
for a group.
mysql> SELECT id,lookup.text,SUM(*) FROM test,lookup
->
WHERE test.id=lookup.id GROUP BY id;
mysqlshow.c: Added number of records in table. Had to change the client code a little to fix
1003
this.
mysql now allows doubled '' or "" within strings for embedded ' or ".
The configure source now compiles a thread-free client library -lmysqlclient. This is
the only library that needs to be linked with client applications. When using the binary releases,
you must link with -lmysql -lmysys -ldbug -lmystrings as before.
It should now be possible to compile in another directory using VPATH. Tested with GNU Make
3.75.
safe_mysqld and mysql.server changed to be more compatible between the source and
the binary releases.
LIMIT now takes one or two numeric arguments. If one argument is given, it indicates the maximum number of rows in a result. If two arguments are given, the first argument indicates the
offset of the first row to return, the second is the maximum number of rows. With this it's easy to
do a poor man's next page/previous page WWW application.
Changed name of SQL function FIELDS() to ELT(). Changed SQL function INTERVALL()
to INTERVAL().
Made SHOW COLUMNS a synonym for SHOW FIELDS. Added compatibility syntax FRIEND
KEY to CREATE TABLE. In MySQL, this creates a non-unique key on the given columns.
Added CREATE INDEX and DROP INDEX as compatibility functions. In MySQL, CREATE
INDEX only checks if the index exists and issues an error if it doesn't exist. DROP INDEX always succeeds.
Removed host, user and db tables from database test in the distribution.
FIELD_TYPE_CHAR can now be signed (-128 to 127) or unsigned (0 to 255) Previously, it was
always unsigned.
SQL functions must now have a '(' immediately after the function name (no intervening space). For example, 'USER(' is regarded as beginning a function call, and 'USER (' is regarded as an identifier USER followed by a '(', not as a function call.
The source distribution is done with configure and Automake. It will make porting much easier. The readline library is included in the distribution.
1004
Separate client compilation: the client code should be very easy to compile on systems which
don't have threads.
The old Perl interface code is automatically compiled and installed. Automatic compiling of
DBD will follow when the new DBD code is ported.
Dynamic language support: mysqld can now be started with Swedish or English (default) error
messages.
mysqldump now works correctly for all field types (even AUTO_INCREMENT). The format for
SHOW FIELDS FROM tbl_name is changed so the Type column contains information suitable for CREATE TABLE. In previous releases, some CREATE TABLE information had to be
patched when re-creating tables.
Some parser bugs from 3.19.5 (BLOB and TIMESTAMP) are corrected. TIMESTAMP now returns different date information depending on its create length.
Changed parser to allow a database, table or field name to start with a number or '_'.
All old C code from Unireg changed to C++ and cleaned up. This makes the daemon a little
smaller and easier to understand.
New INSTALL files (not final version) and some information regarding porting.
In a WHERE with an ORDER BY on fields from only one table, the table is now preferred as first
table in a multi-join.
A group on one column and a sort on a group function (SUM(), AVG()...) didn't work together.
Fixed.
Fixed horrible locking bug when inserting in one thread and reading in another thread.
Added attribute 'Locked' to process list as information if a query is locked by another query.
1005
Fixed full magic timestamp. Timestamp length may now be 14, 12, 10, 8, 6, 4 or 2 bytes.
IF(arg,syntax_error,syntax_error) crashed.
Fixed SELECT with grouping on BLOB columns not to return incorrect BLOB info. Grouping,
sorting and distinct on BLOB columns will not yet work as expected (probably it will group/sort
by the first 7 characters in the BLOB). Grouping on formulas with a fixed string size (use MID()
on a BLOB) should work.
Ao se fazer um full join (sem chave diretas) em tabelas mltiplas com campos BLOB, o BLOB
vinha como lixo na sada.
1006
1007
Se voc encontrar problemas com uma nova portabilidade, voc ter que fazer alguma depurao do
MySQL! See Seco E.1, Depurando um Servidor MySQL.
Nota: antes de iniciar a depurao do mysqld, obtenha primeiro os programas de teste mysys/
thr_alarm e mysys/thr_lock para funcionar. Isto asegurar que sus instalao da thread tem
pelo menos uma chance remota de funcionar.
encontrou um erro de compilao ou erro de tempo dentro do MySQL. Neste caso voc pode tentar
adicionar -g s variveis CFLAGS e CXXFLAGS acima e no usar --with-debug. Se agora o
mysqld morre, voc pode pelo menos execut-lo com gdb ou usar o gdb no arquivo core para
descobrir que aconteceu.
Quando voc configura o MySQL para depurao voc habilita automaticamente diversas funes
de vericao de segurana extra que monitora a sade do mysqld. Se eles encontrarem algo
``inesperado'', uma entrada ser encrita no stderr, que mysqld_safe direciona para o log de erros! Isto tambm significa que se voc estiver tendo alguns problemas inexperados com o MySQL e
estiver usando uma distribuio fonte, a primeira coisa que voc deve fazer configurar o MySQL
para depurao! (A segunda coisa enviar uma mensagem para a lista de email do MySQL e pedir
ajuda. See Seco 1.7.1.1, As Listas de Discusso do MySQL. Por favor, use o script mysqlbug
para todos os relatos de bug e questes referentes a verso do MySQL que voc est usando!
Na distribuio do MySQL para Windows, mysqld.exe , por padro, compilado com suporte a
arquivos trace.
um
log
trace
em
/tmp/mysqld.trace
(ou
mysqld --debug
No Windows voc tambm deve usar o parmetro --standalone para no iniciar o mysqld como um servio:
Em uma janela de console faa:
mysqld --debug --standalone
Depois disso voc pode usar a ferramenta de linha de comando mysql.exe em uma segunda janela de console para reproduzir o problema. Voc pode finalizar o servidor mysqld acima com
mysqladmin shutdown.
Note que o arquivo trace ser muito grande! Se voc quiser ter um arquivo trace menor, voc pode
usar algo como:
mysqld --debug=d,info,error,query,general,where:O,/tmp/mysqld.trace
que apenas exibe informaes com a maioria das tags interrassants em /tmp/mysqld.trace.
Se voc fizer um relatrio de bug sobre isto, por favor s envie as linhas do trace para a lista de
email apropriada quando algo parecee estar errado! Se voc no puder localizar o local errado, voc
pode fazer um ftp do arquivo trace, junto com um relatrio de bug completo, para
ftp://support.mysql.com/pub/mysql/secret/ para que assim um desenvolvedor do MySQL possa dar
uma olhada nele.
O arquivo trace feito com o pacote DBUG de Fred Fish. See Seco E.3, O Pacote DBUG.
1009
Com uma verso antiga do gdb no Linux voc deve usar run --one-thread se voc quiser estar apto a depurar a thread mysqld. Neste caso voc s pode ter uma thread ativa por vez. Ns recomendamos que voc atualize para gdb 5.1 ASAP j que a depurao da thread funciona muito melhor com esta verso!
Ao executar o mysqld com gdb, voc deve disabilitar a pilha de rastreamento com -skip-stack-trace para estar apto a conseguir segmentation fault com gdb.
muito difcil depurar o MySQL no gdb se voc fizer muitas conexes o tempo todo j que gdb
no libera a memria para threads antigas. Voc pode evitar este problema iniciando mysqld com
-O thread_cache_size= 'max_connections +1'. Na maioria dos casos s o uso de O thread_cache_size=5' j ajuda muito!
Se voc quiser um tiver um core dump no Linux quando o mysqld morre com um sinal SIGSEGV,
voc pode iniciar o mysqld com a opo --core-file. Este arquivo core pode ser usado para
fazer um rastreamento que pode lhe ajudar a descobrir porque o mysqld morreu:
shell> gdb mysqld core
gdb>
backtrace full
gdb>
exit
See Seco A.4.1, O Que Fazer Se o MySQL Continua Falhando.
Se voc estiver usando gdb 4.17.x ou acima no Linux, voc deve instalar um arquivo .gdb, com a
seguinte informao, em seu diretrio atual:
set print sevenbit off
handle SIGUSR1 nostop noprint
handle SIGUSR2 nostop noprint
handle SIGWAITING nostop noprint
handle SIGLWP nostop noprint
handle SIGPIPE nostop
handle SIGALRM nostop
handle SIGHUP nostop
handle SIGTERM nostop noprint
Se voc tiver problemas depurando threads com gdb, voc deve fazer o download do gdb 5.x e experiment-lo. A nova verso do gdb tem um tratamento de threads bem melhorado.
Aqui est um exemplo de como depurar o mysqld:
shell> gdb /usr/local/libexec/mysqld
gdb> run
...
backtrace full # Faa isto quando o mysqld falhar
Inclua a sada acima e uma email gerado com mysqlbug e envie-o para lista de email do MySQL.
See Seco 1.7.1.1, As Listas de Discusso do MySQL.
Se o mysqld travar voc pode usar algumas ferramentas de sistema como strace ou /
usr/proc/bin/pstack para exeminar onde mysqld travou.
strace /tmp/log libexec/mysqld
Se voc estiver usando a interface Perl DBI, voc pode habilitar a informao de depuao usando o
mtodo trace ou definindo a varivel de ambiente DBI_TRACE. See Seco 12.5.2, A interface
DBI.
peradmente. Voc pode us-lo para descobrir onde (e talvez por que) o mysqld finalizou. See Seco 4.10.1, O Log de Erros. Para obter um stack trace, voc no deve compilar o mysqld com a
opo -fomit-frame-pointer para gcc. See Seco E.1.1, Compilando o MYSQL para Depurao.
Se o arquivo de erro conter algo como o seguinte:
mysqld got signal 11;
The manual section 'Debugging a MySQL server' tells you how to use a
stack trace and/or the core file to produce a readable backtrace that may
help in finding out why mysqld died
Attemping backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong
stack range sanity check, ok, backtrace follows
0x40077552
0x81281a0
0x8128f47
0x8127be0
0x8127995
0x8104947
0x80ff28f
0x810131b
0x80ee4bc
0x80c3c91
0x80c6b43
0x80c1fd9
0x80c1686
voc pode descobrir onde o mysqld finalizou fazendo o seguinte:
1.
2.
3.
E.1.5. Usando Arquivos de Log para Encontrar a Causa dos Erros no mysqld
Note que antes de iniciarmos o mysqld com --log voc deve verificar todas as suas tabelas com
myisamchk. See Captulo 4, Administrao do Bancos de Dados MySQL.
1011
Se o mysqld morre ou trava, voc deve iniciar o mysqld com --log. Quando o mysqld morre
de novo, voc pode examinar o fim do arquivo de log para a consulta que matou o mysqld.
Se voc estiver usando --log sem um nome de arquivo, o log armazenado no diretrio do banco
de dados como 'nomemaquina'.log. Na maioria dos casos a ltima consulta no arquivo de log que
matou mysqld, mas se possvel voc deve verificar isto reiniciando o mysqld e executando a consulta encontrada por meio da ferramenta de linha de comando mysql. Se isto funcionar, voc tambm deve testar todas as consultas complicadas que no completaram.
Voc tambm pode tentar o comando EXPLAIN em todas as instrues SELECT que levam muito
tempo para assegurar que o mysqld est usando ndices apropriados. See Seco 5.2.1, Sintaxe de
EXPLAIN (Obter informaes sobre uma SELECT).
Voc pode encontrar as consultas que levam muito twempo para executar iniciando o mysqld com
--log-slow-queries. See Seco 4.10.5, O Log para Consultas Lentas.
Se voc encontrar o texto mysqld restarted no arquivo de registro de erro (normalmente chamado hostname.err) voc provavelmente encontrou uma consulta que provocou a falha no
mysqld. Se isto acontecer voc deve verificar todas as suas tabelas com myisamchk (see Captulo 4, Administrao do Bancos de Dados MySQL) e testar a consulta no arquivo de log do MySQL
para ver se ela no funcionou. Se voc encontrar tal consulta, tente primeiro atualizar para uma verso mais nova do MySQL. Se isto no ajudar e voc no puder encontrar nada no arquivo de mensagem mysql, voc deve relatar o erro para uma lista de email do MySQL. As listas de email esto
descritas em http://lists.mysql.com/, que tambm possui os links para as listas de arquivos online.
Se voc iniciou o mysqld com myisam-recover, o MySQL verificar automaticamente e tentar reparar as tabelas MyISAM se elas estiverem marcadas como 'no fechadas apropriadamente' ou
'com falha'. Se isto acontecer, o MySQL ir escrever uma entrada 'Warning: Checking table ...' no arquivo nomemaquina.err, a qual seguida por Warning: Repairing
table se a tabela precisar ser reparada. Se voc obter vrios desses erros, sem que o mysqld finalize inesperadamente um pouco antes, ento algo est errado e precisa ser investigado melhor. See
Seco 4.1.1, Opes de Linha de Comando do mysqld.
claro que no um bom sinal se o mysqld morreu inesperadamente, mas neste caso no se deve
invwestigar as mensagens Checking table... e sim tentar descobrir por que o mysqld morreu.
Faa um backup das tabelas (para o caso da reparao fazer algo errado)
Remove (ou mova para outro local) qualquer arquivo de log antigo do diretrio de dados se voc
precisar de mais espao.
Inicie o mysqld com --log-bin. See Seco 4.10.4, O Log Binrio. Se voc quiser encontrar uma consulta que provoque uma falha no mysqld, voc deve usar --log --log-bin.
Restaure o backup.
1012
Se as tabelas forem corrompidas novamente ou voc puder fazer o mysqld finalizar com o comando acima, vc ter encontrado um erro reproduzvel que deve ser facilmente corrigido! Envie as tabelas e o log binrio por ftp para ftp://support.mysql.com/pub/mysql/secret/ e coloque-o
em nosso sistema de erros em http://bugs.mysql.com/. Se voc um consumidor com suporte,
voc tambm pode enviar um email para <support@mysql.com> para alertar a equipe do
MySQL sobre o problema e t-lo corrgido o mais rpido possvel..
Voc tambm pode usar o script mysql_find_rows para executar algumas das instrues de atualizao se voc quiser estreitar o problema.
1013
<field_1>:<field_2>:...:<field_N>
Cada campo consiste de um carcater de parmetro obrigatrio seguido por uma "," e lista de modificadores separdas por vrgula opcionais:
flag[,modifier,modifier,...,modifier]
Os carcteres de parmetros atualmente reconhecidos so:
Parmetro
Descrio
Habilita a sada de macros DBUG_<N> para o estado atual. Pode ser seguido por uma
lista de palavras chaves que selecionam a sada apenas para as macros DBUG com aquela palavra chave. Uma lista de palavras chaves vazia indica a sada para todas as macros.
Identifica o nome do arquivo fonte para cada linha de sada da depurao ou rastreamento.
Identifica o processo com o PID ou a ID da thread para cada linha de sada da depurao
ou rastreamento.
Identifica o nmero da linha do arquivo fonte para cada linha de sada da depurao ou
rastreamento.
Exibe a profundidade de aninhamento da funo atual para cada linha de sada da depurao ou rastreamento.
Igual a o, mas o arquivo realmente descarregado entre cada escrita. Quando necessrio
o arquivo fechado e reaberto entre cada escrita.
Limita as aes do depurador para um processo especfico. Um processo deve ser indentificado com a macro DBUG_PROCESS e corresponder a um dos itens especificados na
lista de aes do depurador que devem ocorrer.
Exibe o nome do processo atual para cada linha de sada da depurao ou rastreamento.
Habilita a linhas do trace de chamada/sada de funes. Pode ser seguido por uma lista
(contendo apenas um modificador) dando um o nvel numrico mximo de rastreamento,
alm do que nenhuma sada ser exibida, tanto para a depurao quanto para macros trace. O padro uma opo de tempo de compilao.
Alguns exemplos de strings de controle do depurador que podem aparecer em uma linha de comando do shell (o "-#" normalmente usado para introduzir uma string de controle a um aplicativo) so:
1014
-#d:t
-#d:f,main,subr1:F:L:t,20
-#d,input,output,files:n
-#d:t:i:O,\\mysqld.trace
No
MySQL,
tags
comuns
de
serem
enter,exit,error,warning,info e loop.
usadas
(com
opo
d)
so:
Contras:
mais lento que bloqueios a nvel de pgina ou tabela quando usado em uma grande parte da tabela, pois deve-se fazer muito mais travamentos.
difinitivamente muito pior que outras travas se voc frequentemente utiliza GROUP BY em
uma grande parte dos dados ou feita uma varredura de toda a tabela.
Com nvel de bloqueios mais altos pode-se tambm, com mais facilidade, suportar travas de diferentes tipos para sintonizar a aplicao j que a sobreposio de bloqueio menos perceptvel
que para bloqueios a nvel de registro.
Bloqueios de tabela so superiores a bloqueios a nvel de pgina / registro nos seguintes casos:
Muitas leituras
Leituras e atualizaes em chaves restritas; onde atualiza ou deleta-se um registro que pode ser
buscado com uma leitura de chave:
UPDATE nome_tbl SET coluna=valor WHERE unique_key#
DELETE FROM nome_tbl WHERE unique_key=#
com pthread_cond_timedwait(), mas isto aborta com o erro EINTR. Tentamos depurar a
biblioteca thread para descobrirmos porque isto acontece, mas no podemos encontrar nenhuma soluo fcil.
Se algum quiser experimentar o MySQL com RTS threads sugerimos o seguinte:
Altere as funes que o MySQL usa da biblioteca de threads para POSIX. Isto no deve levar
tanto tempo.
Compile thr_alarm.
Se houver alguma pequena diferena na implementao, elas devem ser corrigidas alterando
my_pthread.h e my_pthread.c.
Execute thr_alarm. Se ele executar sem mensagens de ``aviso'', ``erro'' ou aborto, voc est
na trilha certa. Aqui est uma execuo bem sucedidad no Solaris:
Main thread: 1
Thread 0 (5) started
Thread: 5 Waiting
process_alarm
Thread 1 (6) started
Thread: 6 Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6 Slept for 1 (1) sec
Thread: 6 Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6 Slept for 2 (2) sec
Thread: 6 Simulation of no alarm needed
Thread: 6 Slept for 0 (3) sec
Thread: 6 Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6 Slept for 4 (4) sec
Thread: 6 Waiting
process_alarm
thread_alarm
Thread: 5 Slept for 10 (10) sec
Thread: 5 Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6 Slept for 5 (5) sec
Thread: 6 Waiting
process_alarm
process_alarm
...
thread_alarm
Thread: 5 Slept for 0 (1) sec
end
Threads de usurios em um processo nico. A troca de threads gerenciada com alarmes e a bilioteca thread gerencia todas as funes no segura as threads com travamento. Operaes de
leitura, excrita e operao so normalmente gernciada com uma select especfica da thread que
troca para outra thread se a thread em execuo tiver que esperar por dados. Se os pacotes de threads do usurio esto integrados com as bibliotecas padro (threads FreeBSD e BSDI) o pacote
da thread exige menos sobreposicao que pacotes de threads que tm que mapear todas as chamadas no seguras (MIT-pthreads, FSU Pthreads e RTS threads). Em alguns ambientes (SCO, por
exemplo), todas as chamadas do sistema so seguras a threads e assim o mapeamento pode ser
feito muito facilmente (FSU Pthreads em SCO). Desvantagem: Todas as chamadas mapeadas levam pouco tempo e bem malicioso para tratar todas as situaes. Tambm h, normalmente,
algumas chamadas de sistema que no so tratados pelo pacote de thread (como MIT-threads e
sockets). O agendamento de threads nem sempre timo.
Threads de usurios em processos separados. A troca de threads feita pelo kernel e todos os dados so compartilhados entre threads. O pacote de thread gerncia as chamadas padro de threads para permitir o compartilhamento de dadps entre threads. LinuxThreads usado neste mtodo. Desvantagem: Diversos processos. A criao de thrads lenta. Se uma thread morrer as outras normalmente travaro e voc voc dever mat-las antes de reiniciar. A troca de threads
tambm tem um custo um pouco alto.
Threads de kernel. A troca de threads feita pela biblioteca de thread ou pelo kernele muito rpida. Tudo feito em um processo, mas em alguns sistema, ps pode mostrar threads diferentes.
Se uma thread abortar, todo o processo abortado. A maioria das chamadas do sistema so seguras a threads e devem exigir muito pouca sobrecarga. Solaris, HP-UX, AIX e OSF/1 tm threads
de kernel.
1018
Descrio
CXX
CC
CFLAGS
CXXFLAGS
DBI_USER
DBI_TRACE
HOME
LD_RUN_PATH
MYSQL_DEBUG
MYSQL_HISTFILE
MYSQL_HOST
MYSQL_PS1
MYSQL_PWD
MYSQL_TCP_PORT
MYSQL_UNIX_PORT
PATH
TMPDIR
TZ
Pode ser configurado para seu fuso horrio local. See Seco A.4.6,
Problemas Com Fuso Horrio.
UMASK_DIR
UMASK
USER
1019
^
Combina com o inicio de uma string.
mysql> SELECT "fo\nfo" REGEXP "^fo$";
mysql> SELECT "fofo" REGEXP "^fo";
-> 0
-> 1
$
Combina com o fim de uma string.
mysql> SELECT "fo\no" REGEXP "^fo\no$";
mysql> SELECT "fo\no" REGEXP "^fo$";
-> 1
-> 0
.
Combina com qualquer caracter (incluindo novas linhas)
mysql> SELECT "fofo" REGEXP "^f.*";
mysql> SELECT "fo\nfo" REGEXP "^f.*";
-> 1
-> 1
a*
Combina com qualquer sequncia de zero ou mais carcteres a.
mysql> SELECT "Ban" REGEXP "^Ba*n";
mysql> SELECT "Baaan" REGEXP "^Ba*n";
mysql> SELECT "Bn" REGEXP "^Ba*n";
a+
Cobina com qualquer sequncia de um ou mais caracteres a.
1020
-> 1
-> 1
-> 1
-> 1
-> 0
a?
Combina com zero ou um caracter a.
mysql> SELECT "Bn" REGEXP "^Ba?n";
mysql> SELECT "Ban" REGEXP "^Ba?n";
mysql> SELECT "Baan" REGEXP "^Ba?n";
-> 1
-> 1
-> 0
de|abc
Combina tant com a sequencia de como com abc.
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
SELECT
SELECT
SELECT
SELECT
SELECT
SELECT
->
->
->
->
->
->
1
0
1
1
1
0
(abc)*
Combina com zero ou mais instncias da sequncia abc.
mysql> SELECT "pi" REGEXP "^(pi)*$";
mysql> SELECT "pip" REGEXP "^(pi)*$";
mysql> SELECT "pipi" REGEXP "^(pi)*$";
-> 1
-> 0
-> 1
{1} , {2,3}
Existe um modo mais geral de se escrever regexp que combinam com muitas ocorrncias de um
tomo anterior.
a*
Pode ser escrito como a{0,}.
a+
Pode ser escrito como a{1,}.
a?
Pode ser escrito como a{0,1}.
Para ser mais preciso, um tomo seguido por um limite contendo um inteiro i e nenhuma vrgula casa com uma sequncia de exatamente i combinaes do tomo. Um tomo seguido por um
limite contendo i e uma virgula casa com uma sequncia de i ou mais combinaes do tomo.
Um tomo seguido por um limite contendo dois inteiros i e j casa com uma seqquncia de i
at j (inclusive) combinaes de tomos.
Ambos os argumentos devem estar na faixa de 0 ate RE_DUP_MAX (padro 255), inclusive.
Se houver dois argumentos, o segundo deve ser maior ou igual ao primeiro.
[a-dX] , [^a-dX]
Combina com qualquer caracter que seja (ou no, se ^ usado) a, b, c, d ou X. Para incluir um
caracter literal ], ele deve ser imediatamente seguido pelo colchete de abertura [. Para incluir
um caracter literal -, ele deve ser escrito primeiro ou por ultimo. Assim o [0-9] encontra qual1021
quer dgito decimal. Qualquer caracter que no tenha um significado definido dentro de um para
[] no tem nenhum significado especial e combina apenas com ele mesmo.
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
SELECT
SELECT
SELECT
SELECT
SELECT
SELECT
->
->
->
->
->
->
1
0
1
0
1
0
[[.caracter.]]
A sequncia de caracteres daquele elemento ordenado. A sequncia um nico elemento da lista
de expresses entre colchetes. Um expresso entre colchetes contendo um elemento ordenado
multi-caracter pode ento combinar com mais de um caracter, por exemplo, se a sequncia ordenada inclui um elemento ordenado ch, ento a expreso regular [[.ch.]]*c casa com os primeiros cinco caracteres de chchcc.
[=classe_caracter=]
Uma classe equivalente, procura pela sequncia de caracteres de todos elementos ordenados
equivalentes quele, incluindo ele mesmo.
Por exemplo, se o e (+) so os membros de uma classe equivalente, ento [[=o=]],
[[=(+)=]] e [o(+)] so todos sinnimos. Uma classe equivalente no pode ser o final de
uma escala.
[:character_class:]
Dentro de colchets, o nome de uma classe de caracter entre [: e :] procura pela lista de todos
os caracteres pertencentes a esta classe. Os nomes de classes de caracteres padres so:
Nome
Nome
Nome
alnum
digit
punct
alpha
graph
space
blank
lower
upper
cntrl
xdigit
Ele procura pelas classes de caracteres definidas na pgina ctype(3) do manual. Um local pode forncer outros. Uma classe de caracter no pode ser usada como o final de uma escala.
mysql> SELECT "justalnums" REGEXP "[[:alnum:]]+";
mysql> SELECT "!!" REGEXP "[[:alnum:]]+";
-> 1
-> 0
[[:<:]] , [[:>:]]
Combina com a string null no inicio e no fim de uma palavra, respectivamente. Uma palavra
definida como uma sequencia de caracteres de palavra os quais no so nem precedido e nem seguidos por caracteres de palavras. Um caracter de palavra um caracter alfa numrico (como definido por ctype(3)) ou um underscore (_).
mysql> SELECT "a word a" REGEXP "[[:<:]]word[[:>:]]";
mysql> SELECT "a xword a" REGEXP "[[:<:]]word[[:>:]]";
-> 1
-> 0
1022
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By
contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software---to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors
commit to using it. (Some other Free Software Foundation software is covered by the GNU Library
General Public License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and
charge for this service if you wish), that you receive source code or can get it if you want it, that you
can change the software or use pieces of it in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to
ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give
the recipients all the rights that you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license
which gives you legal permission to copy, distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain that everyone understands that
there is no warranty for this free software. If the software is modified by someone else and passed
on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger
that redistributors of a free program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any patent must be licensed for
everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
1.
This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The
``Program'', below, refers to any such program or work, and a ``work based on the Program''
means either the Program or any derivative work under copyright law: that is to say, a work
containing the Program or a portion of it, either verbatim or with modifications and/or transla1023
ted into another language. (Hereinafter, translation is included without limitation in the term
``modification''.) Each licensee is addressed as ``you''.
Activities other than copying, distribution and modification are not covered by this License;
they are outside its scope. The act of running the Program is not restricted, and the output from
the Program is covered only if its contents constitute a work based on the Program
(independent of having been made by running the Program). Whether that is true depends on
what the Program does.
2.
You may copy and distribute verbatim copies of the Program's source code as you receive it, in
any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to
this License and to the absence of any warranty; and give any other recipients of the Program a
copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and you may at your option
offer warranty protection in exchange for a fee.
3.
You may modify your copy or copies of the Program or any portion of it, thus forming a work
based on the Program, and copy and distribute such modifications or work under the terms of
Section 1 above, provided that you also meet all of these conditions:
a.
You must cause the modified files to carry prominent notices stating that you changed the
files and the date of any change.
b.
You must cause any work that you distribute or publish, that in whole or in part contains
or is derived from the Program or any part thereof, to be licensed as a whole at no charge
to all third parties under the terms of this License.
c.
If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or
display an announcement including an appropriate copyright notice and a notice that there
is no warranty (or else, saying that you provide a warranty) and that users may redistribute
the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If identifiable sections of that work
are not derived from the Program, and can be reasonably considered independent and separate
works in themselves, then this License, and its terms, do not apply to those sections when you
distribute them as separate works. But when you distribute the same sections as part of a whole
which is a work based on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the entire whole, and thus to each
and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program with the Program (or
with a work based on the Program) on a volume of a storage or distribution medium does not
bring the other work under the scope of this License.
4.
You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one
of the following:
a.
b.
Accompany it with a written offer, valid for at least three years, to give any third-party,
for a charge no more than your cost of physically performing source distribution, a com1024
plete machine-readable copy of the corresponding source code, to be distributed under the
terms of Sections 1 and 2 above on a medium customarily used for software interchange;
or,
c.
Accompany it with the information you received as to the offer to distribute corresponding
source code. (This alternative is allowed only for noncommercial distribution and only if
you received the program in object code or executable form with such an offer, in accord
with Subsection b above.)
The source code for a work means the preferred form of the work for making modifications to
it. For an executable work, complete source code means all the source code for all modules it
contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form)
with the major components (compiler, kernel, and so on) of the operating system on which the
executable runs, unless that component itself accompanies the executable.
If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts
as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
5.
You may not copy, modify, sublicense, or distribute the Program except as expressly provided
under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties
who have received copies, or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
6.
You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this
License to do so, and all its terms and conditions for copying, distributing or modifying the
Program or works based on it.
7.
Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program
subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance
by third parties to this License.
8.
If, as a consequence of a court judgment or allegation of patent infringement or for any other
reason (not limited to patent issues), conditions are imposed on you (whether by court order,
agreement or otherwise) that contradict the conditions of this License, they do not excuse you
from the conditions of this License. If you cannot distribute so as to satisfy simultaneously
your obligations under this License and any other pertinent obligations, then as a consequence
you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly
through you, then the only way you could satisfy both it and this License would be to refrain
entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to
apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right
claims or to contest validity of any such claims; this section has the sole purpose of protecting
the integrity of the free software distribution system, which is implemented by public license
practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the
author/donor to decide if he or she is willing to distribute software through any other system
and a licensee cannot impose that choice.
1025
This section is intended to make thoroughly clear what is believed to be a consequence of the
rest of this License.
9.
If the distribution and/or use of the Program is restricted in certain countries either by patents
or by copyrighted interfaces, the original copyright holder who places the Program under this
License may add an explicit geographical distribution limitation excluding those countries, so
that distribution is permitted only in or among countries not thus excluded. In such case, this
License incorporates the limitation as if written in the body of this License.
10. The Free Software Foundation may publish revised and/or new versions of the General Public
License from time to time. Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and ``any later version'', you have the option of following
the terms and conditions either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of this License, you
may choose any version ever published by the Free Software Foundation.
11. If you wish to incorporate parts of the Program into other free programs whose distribution
conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals of preserving the free
status of all derivatives of our free software and of promoting the sharing and reuse of software
generally.
NO WARRANTY
12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
CORRECTION.
13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE
TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public, the
best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each
source file to most effectively convey the exclusion of warranty; and each file should have at least
the ``copyright'' line and a pointer to where the full notice is found.
1026
one line to give the program's name and a brief idea of what it does.
Copyright (C) yyyy name of author
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this when it starts in an interactive
mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands 'show w' and 'show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than 'show
w' and 'show c'; they could even be mouse-clicks or menu items---whatever suits your program.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a
``copyright disclaimer'' for the program, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
signature of Ty Coon, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into proprietary programs.
If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
1027