Quando voc for um Provedos de Servios de Internet (Internet Service Provider - ISP), ofere-
cendo 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 experi-
mentar 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.
Informaes Gerais
17
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 ver-
dade mesmo se voc executar um servidor web comercial que utilize MySQL Server, pois vo-
c no est distribuindo qualquer parte do sistema MySQL. No entanto, neste caso ns gostaria-
mos 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 adqui-
rir um suporte da MySQL AB de qualquer forma. Deste modo voc contribui com o desenvolvimen-
to 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. Senti-
mos 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 tam-
bm).
1.4.4. Logomarcas e Marcas Registradas da MySQL
AB
Muitos usurios do banco de dados MySQL deseja mostar o logo do golfinho da MySQL AB em
seus web sites,livros ou produtos fechados. Isto bem vindo, mas deve haver anotaes indicando
que a palavra MySQL e o logo do golfinho da MySQL so marcas registradas da MySQL AB e s po-
dem ser usadas como indicado na nossa poltica de marcas registradas em
http://www.mysql.com/company/trademark.html.
1.4.4.1. O Logo Original do MySQL
O logo do golfinho do MySQL foi desenhado pela Finnish advertising agency Priority em 2001. O
golfinho foi escolhido como um smbolo para o baco de dados MySQL j que ele esperto, rpido e
um animal gil, se esforndo em navegar pelos oceanos de dados. Ns tambm gostamos de golfi-
nos.
O logo original MySQL s podem ser usados pr representates da MySQL AB e aqueles que possuem
um acordo escrito permitndo-os de faz-lo.
1.4.4.2. Logomarcas da MySQL que Podem Ser Usadas Sem Per-
misso de Alterao
Projetamos um conjunto de logos especiais de Uso Condicionale que podem se encontrados em nos-
so site web em http://www.mysql.com/press/logos.html e usado em sites web de terceiros sem per-
misses 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 basicamen-
te 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 lo-
gomarca do MySQL.
No use a logomarca em detrimento MySQL AB ou ao valor das marcas registradas da MySQL
AB. Nos reservamos o direito de revogar o diretiro de uso da marcas registradas da MySQL AB.
Informaes Gerais
18
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 especi-
ais que sirvam as suas necessidades.
1.4.4.3. Quando Voc Precisa de Permisso de Alterao para
Usar as Logomarcas do MySQL?
Voc precisa de permisso escrita da MySQL AB antes de usar as logomarcas do MySQL nos segu-
intes casos:
Quando exibir qualquer logomarca da MySQL AB em qualquer lugar diferente so seu site.
Quando exibir qualquer logomarca da MySQL AB exceta as de Uso Condicional mencionadas
anteiormente em sites ou outro lugar.
Devido a razes comerciais e legais monitoramos o so das marcas registradas do MySQL em prou-
tos, 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 retor-
nado para financiar o desenvolvimento do banco de dados MySQL.
1.4.4.4. Logomarcas dos Parceiros da MySQL AB
As logomarcas de parceria do MySQL podem ser usados apenas por companhias e pessoas que pos-
suem um acordo de parceria por escrito com a MySQL AB. Parceiras incluem certificao com trei-
nador ou consultor do MySQL. Para mais informaes, Seco 1.3.1.5, Parcerias.
1.4.4.5. Usando a Palavra MySQL em Texto Impresso ou Apresen-
tao
A MySQL AB considera bem vindas as referncias ao banco de dados MySQL mas deve ser indica-
do que a palavra MySQL uma marca registrada da MySQL AB. Por isto, voc deve adicionar o
simbolo de marca registrada (TM) ao primeiro ou mais proeminente uso da palavra MySQL em um
texto e, onde apropriadom indicar que MySQL uma marca registrada da MySQL AB. Para mais in-
formaes, veja nossa poltica de marcas registradas em
http://www.mysql.com/company/trademark.html.
1.4.4.6. Usando a Palavra MySQL em Nomes de Companhias e
Produtos
O uso da palavra MySQL em nomes de produtos ou companias ou em dominios de Internet no
permitida sem permisso escrita da MySQL AB.
1.5. Mapa de Desenvolvimento do MySQL
Esta seo fornece uma amostra do mapa de desenvolvimento do MySQL, incluindo principais re-
cursos imlementados ou planejados para o MySQL 4.0, 4.1, 5.0 e 5.1. A seguinte seo fornece in-
formao para cada distribuio. O planejamento para alguns dos recursos mais requisitados esto
listada na tabela a seguir.
Feature MySQL version
Unions 4.0
Informaes Gerais
19
Subqueries 4.1
R-trees 4.1 (para tabelas MyISAM)
Stored procedures 5.0
Views 5.0 ou 5.1
Cursors 5.0
Foreign keys 5.1 (3.23 com InnoDB)
Triggers 5.1
Full outer join 5.1
Constraints 5.1
1.5.1. MySQL 4.0 in a Nutshell
Muito aguardado por nossos usurios, o MySQL Server 4.0 agora est disponvel em sua verso de
produo.
O MySQL 4.0 est disponvel para download em http://www.mysql.com/ e nossos sites mirrors. O
MySQL tem sido testado por um grande nmero de usurios e est em uso em mutios sites.
Os principais novos recursos do MySQL Server 4.0 so trabalhados em conjunto com os usurios
corporativos e da comunidade, melhorando o programa de banco de dados MySQL como uma solu-
o para misses crticas e sistemas de bancos de dados de alta carga. Outros novos recursos visam
os usurios de bancos de dados embutidos.
O MySQL 4.0 foi declarado estvel para uso em produo a partir da verso 4.0.12 em Maro de
2003. Isto significa que, no futuro, apenas correo de erros sero feitas para a distribuio da srie
4.0 e apenas correo de erros crticos sero feitas para a antiga srie 3.23. See Seco 2.5.2,
Atualizando da Verso 3.23 para 4.0.
Novos recursos para o MySQL est sendo adicionado ao MySQL 4.1 que tambm est disponvel
(verso alfa). See Seco 1.5.2, MySQL 4.1 in a Nutshell.
1.5.1.1. Recursos Disponveis no MySQL 4.0
Aumento da velocidade
O MySQL 4.0 tem uma cache de consultas que pode dar uma grande aumento na velocidade
de aplicaes com consutas repetitivas. See Seco 6.9, Cache de Consultas do MySQL.
A verso 4.0 aumenta a velocidade do MySQL Server em um nmero e reas tais como IN-
SERTs em bloco, buscas em ndices empacotados, criao de ndices FULLTEXT, e CO-
UNT(DISTINCT).
Introduo ao Servidor MySQL Embutido
A nova biblioteca do Servidor Ebutido pode ser facilmente usada em aplicaes standalone e
embarcadas. O servidor embutido fornce uma alternativa para o uso do MySQL em um am-
biente cliente/servidor. See Seco 1.5.1.2, Servidor Embutido MySQL.
Mecanismo de armazenamento InnoDB como padro
O mecanismo de armazenamento InnoDB oferecido como um recurso padro do servidor
MySQL. Isto significa suporte a transaes ACID, chaves estrangeiras com UPDATE/DE-
LETE em cacata e lock de registro agora so recursos padres. See Seco 7.5, Tabelas
InnoDB.
Novas fncionalidades
Informaes Gerais
20
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 pala-
vras de parasa em qualquer linguagem humana, habilitando um novo conjunto de aplicaes
a serem construdas no MySQL Server. See Seco 6.8, Pesquisa Full-text no MySQL.
Compatibilidade com os padres, portabilidade e migrao
Recursos para simplificar a migrao de outros sistemas de banco de dados para o MySQL
Server incluem TRUNCATE TABLE (como no Oracle)
Muitos usurios tambm ficaro satisfeitos ao perceber que o MySQL Server agora suporta a
instruo UNION, um recurso padro SQL muito esperado.
O MySQL agora pode ser executado nativamente na plataforma Novell NetWare 6.0. See
Seco 2.6.8, Notas Novell NetWare.
Internacionalizao
Nossos usurios alemes, austracos e suios notaro que o MySQL agora suporta um novo
conjunto de caracteres, latin1_de, que assegura que a Ordenao em alemo classi-
ficar 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 nos-
sa 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 Da-
dos (DBAs). See Seco 5.5.6, Sintaxe de SET.
Instrues DELETE e UPDATE multi-tabelas foram adicionadas.
Foi adicionado suporte ao mecanismo de armazenamento MyISAM para link simblico no
nvel de tabela (e no apenas a nvel de banco de dados como antes) e para habilitar o trata-
mento de links simblicos no Windows por padro.
SQL_CALC_FOUND_ROWS e FOUND_ROWS() so novas funes que tornaram possvel
encontrar o nmeros de linhas que uma consulta SELECT que inclui uma clusula LIMIT
teria retornado se a clusula no fosse utilizada.
A seo de novidades deste manual inclui uma lista mais aprofundada dos recursos. See Seco D.3,
Alteraes na distribuio 4.0.x (Production).
1.5.1.2. Servidor Embutido MySQL
libmysqld faz o MySQL Server adequado para uma grande rea de aplicaes. Usando a biblio-
teca do servidor MySQL embutido, pode embarcar o MySQL Server em vrios aplicativos e dispo-
sitivos eletrnicos, onde o usurio final no tm conhecimento de possuir um banco de dados bsi-
co. O servidor MySQL embutido ideal para uso nos bastidores em aplicaes de Internet, quios-
ques pblicos, responsvel por unidades de combinao hardware/software, servidores Internet de
alta performance, banco de dados de auto-conteno distribudos em CDROM, e assim por diante
Muitos usurios da libmysqld se benficiaro da iLicena Dual do MySQL. Para aqueles que no
desejam ser limitar pela GPL, o software tambem est disponvel sob uma licena comercial. A bi-
blioteca embutida do MySQL tambm usa a mesma interface que a biblioteca do cliente normal,
sendo ento conveniente e fcil de usar. See Seco 12.1.15, libmysqld, a Biblioteca do Servidor
Embutido MySQL.
Informaes Gerais
21
1.5.2. MySQL 4.1 in a Nutshell
MySQL Server 4.0 prepara a criao de novos recursos como subqueries e Unicode (implementado
na verso 4.1) e o funcionamento de stored procedures do SQL-99 est sendo feito para a verso 5.0.
Estes recursos esto no topo da lista de recursos desejados de muitos de nossos clientes.
Com estas adies, os crticos do MySQL Database Server devem ser mais imaginativos que nunca
para apontar as deficincias do MySQL Database Management System. J conhecido por sua estabi-
lidadem velocidade e facilidade de uso, o MySQL Server estar apto a atender as necessidades de
vrios compradores exigentes.
1.5.2.1. Recursos Disponveis no MySQL 4.1
Os recursos listados nesta seo esto implementados no MySQL 4.1. Outros poucos recursos esto
planejados para o MySQL 4.1. See Seco 1.6.1, Novos Recursos Planejados Para a Verso 4.1.
A maioria dos novos recursos em codificao, como stored procedures, estaro disponveis no
MySQL 5.0. See Seco 1.6.2, Novos Recursos Planejados Para a Verso 5.0.
Suporte a subqueries e tabelas derivadas
Uma subquery uma instruo SELECT aninhada dentro de outras instrues. Uma tabela
dericada (unnamed view) uma subquery na clusula FROM de outras instrues. See Sec-
o 6.4.2, Sintaxe de Subquery.
Aumento na velocidade
Protocols binrios mais rpidos com instrues preparadas e parmetros de ligao. See Sec-
o 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 Espa-
cias em MySQL.
A replicao pode ser feita sobre conexo SSL.
Compatibilidade aos padres, portabilidade e migrao
O novo protocolo cliente/servidor adiciona a possibilidade de se passar mltiplos avisos ao
cliente, no lugar se um nico resultado. Isto faz com que o trabalho como uma grande carga
de dados seja muito mais fcil de rastrear. SHOW WARNINGS exibe avisos para o ltimo co-
mando. See Seco 4.6.8.9, SHOW WARNINGS | ERRORS.
Internacionalizao
Para suportar nossa base de usurio sempre em expanso usando linguagens locais nas apli-
caes, 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.
Informaes Gerais
22
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 in-
formao 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 cha-
mada. 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 imple-
mentada. 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 capacida-
de de concatenar colunas de registros agrupados em uma nica string de resultado, o que
extremamente til. See Seco 6.3.7, Funes e Modificadores para Usar com Clusulas
GROUP BY.
A seo de novidades neste manual incluem uma lista mais completa de recursos. See Seco D.2,
Alteraes na distribuio 4.1.x (Alpha).
1.5.2.2. Stepwise Rollout
Novos recursos esto sendo adicionados ao MySQL 4.1. A verso Alfa j st disponvel para down-
load. See Seco 1.5.2.3, Pronto para Uso em Desenvolvimento Imediato.
O conjunto de recursos que esto sendo adicionados a verso 4.1 esto, na maioria, corrigidos. De-
senvolvimento adicional j est em andamento na verso 5.0. O MySQL 4.1 passam pelos passos de
Alfa (tempo no qual os novos recursos ainda podem ser adionados/alterados), Beta (quando j im-
plementamos todos os recursos e apenas correes de erros so realizados0) e Gamma (indicando
que ima distribuio de produo est quase pronta). No fim deste processo, o MySQL 4.1 se torna-
r o nova distribuio de produo).
1.5.2.3. Pronto para Uso em Desenvolvimento Imediato
O MySQL 4.1 est atualmente no estgio alfa e os binrios esto disponveis para download em
http://www.mysql.com/downloads/mysql-4.1.html. Todas as distribuies binrias passaram por
nossos extensivos teste sem nenhum erro na plataforma em que testamos. See Seco D.2,
Alteraes na distribuio 4.1.x (Alpha).
Para aqueles que desejam usar o fonte mais recente do desenvolvimento do MySQL 4.1, deixamos
nosso repositrio do BitKeeper publicamente disponvel. See Seco 2.3.4, Instalando pela rvore
de fontes do desenvolvimento.
1.5.3. MySQL 5.0, A Prxima Distribuio de Desenvol-
vimento
O novo desenvolvimento para o MySQL est focado na distribuio 5.0, comrecursos como Stored
Procedures entre outros. See Seco 1.6.2, Novos Recursos Planejados Para a Verso 5.0.
Para aqueles que desejam dar uma olhada no desenvolvimento do MySQL, deixamos o nosso repo-
sitrioo do BitKeeper para o MySQL verso 5.0 disponvel publicamente. See Seco 2.3.4,
Instalando pela rvore de fontes do desenvolvimento.
Informaes Gerais
23
1.6. MySQL e o Futuro (o TODO)
Esta seo lista os recursos que planejamos impementar no MySQL Server. As listas so apresen-
tadas por verso, e os itens esto aproximadamente na ordem em que sero feitos.
Nota: Se voc um usurio corporativo com uma necessidade urgente de um recurso particular, por
favor, contate <sales@mysql.com> para conversarmos sobre patrocnio. Financiamento feito
por uma ou mais companhias nos permite alocar recursos adicionais para aquele propsito especfi-
co. Um exemplo de um recurso patrocinado no passado a replicao.
1.6.1. Novos Recursos Planejados Para a Verso 4.1
Os recursos abaixo ainda no esto implementados no MySQL 4.1, mass esto planejados para im-
plementao antes que o MySQL 4.1 v para a fase beta. Para uma lista do que j est feito no
MySQL 4.1, veja Seco 1.5.2.1, Recursos Disponveis no MySQL 4.1.
Suporte OpenSSL estvel (o MySQL 4.0 tem suporte rudimentar ao OpenSSL, no testado
100%).
Mais teste de instrues preparadas
Mais testes de mltiplos conjunto de caracteres para uma tabela.
1.6.2. Novos Recursos Planejados Para a Verso 5.0
Os seguintes recursos esto planejados para incluso no MySQL 5.0. Note que como possuimos di-
versos desenvolvedores que esto trabalhando em diferentes projetos, havero tambm muitos recur-
sos adicionais. H tambm um pequena chance qie alguns destes recursos sejam adicionados ao
MySQL 4.1. Para uma lista do que j est feito no MySQL 4.1, veja Seco 1.5.2.1, Recursos Dis-
ponveis no MySQL 4.1.
Para aqueles que desejam dar uma olhada nas novidades do desenvolvimento do MySQL, deixamos
nosso repositrio BitKeeper para o MySQL verso 5.0 publicamente disponvel. See Seco 2.3.4,
Instalando pela rvore de fontes do desenvolvimento.
Stored Procedures
Stored procedures esto sendo implementadas atualmente. Este esforo baseado no SQL-
99, o que tem m sintaxe bsica similar (mas no idntica) a do Oracle PL/SQL. Ns tambm
implementaremos o framework do SQL-99 para enganchar em linguagens externas e (onde
possvel) compatibilidade com p.ex. PL/SQL e T-SQL.
Nova funcionalidade
Suporte a cursores elementares.
A habilidade de especificar explicitamente para tabelas MyISAM que um ndice deve ser cri-
ado como um ndice RTREE. Na verso 4.1, ndices RTREE so usados internamente para
dados geomtricos (tipos de dados GIS), mas no podem ser criados no pedido.
Registros de tamanhos dinmicas para tabelas HEAP.
Compatibilidade com o padro, portabilidade e migrao
Adiciona suporte real a VARCHAR (tamanho de colunas maiores que 255, e sem corte de es-
paos 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
Informaes Gerais
24
SHOW COLUMNS FROM nome_tabela (usado pelo cliente mysql para permitir expan-
ses de nomes de colunas) no deve abrir a tabela, apenas o arquivo de definio. ISto exigi-
r menos memria e ser muito mais rpido.
Permite que o DELETE em tabelas MyISAM usem a cache de registros. Para fazer isto, preci-
samos atualizar a thread da cache de registro quando atualizarmos os arquivos .MYD.
Melhores tabes em memria (HEAP):
Registro de tamanhos dinmoicos.
Tratamento de registro mais rpido (menos cpia).
Internacionalizao
Ap usar SET CHARACTER SET devemos traduzir toda a consulta de uma vez e no apenas
as strings. Isto permitir que os usurios usem caracteres traduzidos nos nomes de banco de
dados, tabelas e colunas.
Aprimoramento da usabilidade
Resolver a questo de RENAME TABLE em uma tabela usada em uma tabela MERGE ativa,
o que possivelmente corrompe a tabela.
1.6.3. Novos Recursos Planejados Para a Verso 5.1
Novas funcionalidades
Suporte FOREIGN KEY para todos os tipos de tabelas.
Restries a nvel de colunas.
Replicao seguro a falhas.
Backup online com baixa queda de desempenho. O backup online tornar mais fcil adicio-
nar 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 sinni-
mo para TINYINT.)
Aprimoramento da usabilidade
Adicionar opes ao protocolo cliente/servidor para obter notas de progresso para longos co-
mandos em execuo.
Implementar RENAME DATABASE. Para tornar isto seguro para todos os mecanismos de ar-
mazenamento, ele deve funcionar como a seguir:
Cria um novo banco de dados.
Informaes Gerais
25
Para cada tabelas, renomeie-a para outro banco de dados, o qual fazemos com o comando
RENAME.
Apagar o banco de dados antigo.
Nova alterao da interface de arquivo interno. Isto far todos os manipuladores de arquivos
mais gerais e tornar mais fcil adicionar extenses tipo RAID.
1.6.4. Novos Recursos Planejados Para a Verso em
um Futuro Prximo
Novas funcionalidade
Comando como do Oracle CONNECT BY PRIOR ... para estruturas de busca tipo rvore
(hierrquica)
Adicionar todos os tipos que faltam do SQL-92 e ODBC 3.0.
Adicionar SUM(DISTINCT).
INSERT SQL_CONCURRENT e mysqld --concurrent-insert para fazer uma in-
sero 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 TIMES-
TAMP 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 regis-
tros de entradas no so alteradas.
Para tabelas com chaves primrias, se um registro de entrada no contm um valor de
chave primria ou estr faltando alguma parte da chave, o registro tratado como um
LOAD DATA INFILE ... REPLACE INTO.
Fazer com que LOAD DATA INFILE entenda a sintaxe do tipo:
LOAD DATA INFILE 'file_name.txt' INTO TABLE tbl_name
TEXT_FIELDS (text_field1, text_field2, text_field3)
SET table_field1=CONCAT(text_field1, text_field2),
table_field3=23
IGNORE text_field3
Isto pode ser usado para saltar colunas extras no arquivo texto, ou atualizar colunas baseadas
nas expresses dos dados lidos.
Novas funes para tyrabalhar com tipos de colunas SET:
ADD_TO_SET(valor,conjunto)
Informaes Gerais
26
REMOVE_FROM_SET(valor,conjunto)
Se voc abortar o mysql no meio de uma consulta, voc deve abrir outra conexo e matar a
consulta antiga em execuo. Alternativamente, deve ser feita um tentativa de deteco deste
problema no servidor.
Adicione um interface do mecanismo de armazenamento para informaes da tabela assim
que voc puder us-la como uma tabela de sistema. Isto seria um pouco mais lento se voc
pedisse informaes sobre todas as tabelas, mas muito flexvel. SHOW INFO FROM
tbl_name para informaes bsicas das tabelas deve ser implementado.
Permite SELECT a FROM crash_me LEFT JOIN crash_me2 USING (a); neste
caso considerado que a vem da tabela crash_me.
Opes DELETE e REPLACE para a instruo UPDATE (isto deletar registros quando se ti-
ver um erro de chave duplicada durante a atualizao).
Altera o formato de DATETIME para armazenar fraes de segundo.
Possibilitar o uso da nova biblioteca regexp GNU em vez da atual (a biblioteca GNU deve
ser muito mais rpida que a antiga).
Compatibilidade com os padres, portabilidade e migrao
No adicionar valores DEFAULT automticos as colunas. Enviar um erro ao usar um IN-
SERT que no contenha uma coluna que no tenha um DEFAULT.
Adicionar as funes de agrupamento ANY(), EVERY() e SOME(). No padro SQL isto s
funciona em colunas booleanas, mas podemos extend-las para funcionar em qualquer colu-
na/expresso tratando valores 0 como FALSE e valores diferentes de 0 como TRUE.
Corrigir para que o tipo de MAX(coluna) seja o mesmo do tipo da coluna:
mysql> CREATE TABLE t1 (a DATE);
mysql> INSERT INTO t1 VALUES (NOW());
mysql> CREATE TABLE t2 SELECT MAX(a) FROM t1;
mysql> SHOW COLUMNS FROM t2;
Aumento de velocidade
No permitir mais que um nmero definido de threads faam a recuperao do MyISAM ao
mesmo tempo.
Alterar INSERT ... SELECT para usar inseres concorrentes opcionalmente.
Adicionar uma opo para descarregar paginas de chaves para tabelas com delayed keys se
elas no forem usados por um tempo.
Permitir joins em partes de chaves (otimizao).
Adicionar simulao de pread()/pwrite() no Windows para permitir inseres concor-
rentes.
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. Is-
to deve ajudar os usurios a identificar reas ou projetos de tabelas que podiam ser otimiza-
dos para executar consultas muito mais eficientes.
Internacionalizao
Aprimoramentos de usabilidade
Informaes Gerais
27
Retorna os tipos dos campos originais ao se fazer SELECT MIN(coluna) ... GROUP
BY.
Possibilita especificar long_query_time com uma granularidade em microsegundos.
Ligue o cdigo myisampack no servidor assim ele poder realizar operaes PACK e
COMPRESS.
Adicionar uma cache de chaves temporria durante INSERT/DELETE/UPDATE para po-
dermos fazer um recuperao se o ndice ficar cheio.
Se voc realizar um ALTER TABLE em uma tabela que ligada simbolicamente a outro dis-
co, crie tabelas tenporrias neste disco.
Implementar um tipo DATE/DATETIME que trate as informaes de fusos horrios de for-
ma 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 th-
reads.
Permitir variveis SQL em LIMIT, como em LIMIT @a,@b.
Sada automtica do mysql para um navegador web.
LOCK DATABASES (com diversas opes).
Muito mais variveis para SHOW STATUS. Leitura e atualizao de registros. Selects em 1
tabela e select com joins. Nmero de tabelas na select. Nmero de consultas ORDER BY e
GROUP BY.
mysqladmin copy database novo-banco_dados; exige que o comando COPY
seja adicionado ao mysqld.
Lista de processos deve mostar o nmero de consultas/threads.
SHOW HOSTS para xibir informaes sobre a cache de nome de mquina.
Alterar o nome de tabelas de string vazias para NULL para colunas calculadas.
No usar Item_copy_string em valores numricos para evitar a converso number-
>string->number no casos de: SELECT COUNT(*)*(id+0) FROM nome_tabela
GROUP BY id
Alterar aqueles ALTER TABLE que no abortam clientes que executam INSERT DELA-
YED.
Colunas refernciadas em uma clusula UPDATE iro conter os valores antigos antes da atu-
alizao iniciar.
Novos sistemas operacioais.
Portar os clientes MySQL para LynxOS.
1.6.5. Novos Recursos Planejados Para a Verso em
um Futuro a Mdio Prazo
Implementar funo: get_changed_tables(timeout,table1,table2,...)
Alterar leitura atravs de tabelas para usar mapeamento de memria quando possvel. Atualmen-
te somente tabelas compactadas usam mapeamento de memria.
Informaes Gerais
28
Tornar o cdigo de timestamp automtico melhor. Adicionar timestamps para o log de atualiza-
es com SET TIMESTAMP=#;
Usar mutex de leitura/escrita em alguns lugares para obter maior velocidade.
Views simples (inicialmente em uma tabela, depois em qualquer expresso). See Seco 1.8.4.6,
Views.
Fechar algumas tabelas automaticamente se uma tabela, tabela temporria ou arquivos tempor-
rios obtiverem o erro 23 (no pode abrir arquivos suficientes).
Melhor propagao de constantes. Quando uma ocorrncia de nome_col=n encontrada em
uma expresso, para algumas constantes n, substitua outras ocorrncias de nome_col dentro
da expresso por n. Atualmente, isto feito somente para alguns casos simples.
Alterar todas expresses const com expresses calculadas se possvel.
Chave otimizadora = expresso. No momento somente a chave = campo ou a chave = constante
so otimizadas.
Melhorar o cdigo de algumas das funes de cpia
Alterar sql_yacc.yy para um analizador em linha para reduzir seu tamanho e obter melhores
mensagems de erro (5 dias).
Alterar o analisador para usar somente uma regra para diferentes nmeros de argumentos em
uma funo.
Utilizar nomes de clculo completos na parte de ordenao. (For ACCESS97)
MINUS, INTERSECT e FULL OUTER JOIN. (Atualmente UNION [na 4.0] e LEFT OUTER
JOIN so suportados).
SQL_OPTION MAX_SELECT_TIME=# para colocar um limite de tempo em uma pesquisa.
Fazer o log de atualizaes gravar em um banco de dados.
LIMIT negativo para recuperar dados do fim.
Alarmes em funes clientes de conexo, leitura e escrita.
Por favor, perceba as alteraes ao mysqld_safe: de acordo com o FSSTND (que o Debian
tenta seguir) arquivos PID dever ir em /var/run/<progname>.pid e arquivos de log em /
var/log. Seria timo se voc puder colocar o diretrio de dados na primeira declarao de
"pidfile" e "log", para que a colocao destes arquivos possa ser alterada com uma simples ins-
truo.
Permitir um cliente requisitar log.
Adicionar uso de zlib() a LOAD DATA INFILE, para permitir que as instrues leiam ar-
quivos compactados com gzip.
Corrigir ordenao e agrupamento de colunas BLOB (parcialmente resolvida agora).
Alterar para o uso de semforos quando contar threads. Devemos primeiro implementar uma bi-
blioteca de semforos para a MIT-pthreads.
Adicionar suporte pleno para JOIN com parnteses.
Como uma alternativa para uma thread / conexo gerencie uma fila de threads para manipular as
pesquisas.
Permitir obter mais de um bloqueio com GET_LOCK. Quando isto for feito, sero, tambm, tra-
tados os possveis deadlocks que essa alterao ir acarretar.
Informaes Gerais
29
O tempo fornecido de acordo com a quantidade de trabalho, e no tempo real.
1.6.6. Novos Recursos que No Planejamos Fazer
Nada; Planejamos ser totalmente compatveis com o ANSI 92 / ANSI 99.
1.7. Fontes de Informaes do MySQL
1.7.1. Listas de Discusso MySQL
Esta seo introduz a lista de deiscusso do MySQL e d algumas explicaes sobre como a lista de-
ve ser utilizada. Quando voc se inscreve na lista de discusso, voc receber, como mensagens de
email, tudo o que enviado para a lista. Voc tambm poder enviar suas prprias dvidas e respos-
tas para a lista.
1.7.1.1. As Listas de Discusso do MySQL
Para se inscrever ou cancelar a inscrio de qualquer uma das listas de email descritas nesta seo,
visite http://lists.mysql.com/. Por favor, no envie mensagem sobre inscrio ou cancelamento para
qualquer das listas de emasil, porque tais mensagens so distribudas automaticamente para milhares
de outros usurios.
Seu site local pode ter muitas inscries para uma lista de email do MySQL. Se sim, o site pode ter
uma lista de email local, assim as mensagens enviadas para lists.mysql.com do seu site so
propagadas para a lista local. Nestes casos, por favor, contate seu administrador de sistema para adi-
cionado ou excluido da lista local do MySQL.
Se voc quiser que as mensagens da lista de discusso sejam enceminhadas para uma caixa de cor-
reio separada no seu programa de emails, configure um filtro com base nos cabealhos das mensa-
gens. Voc pode tambm usar os cabealhos List-ID: ou Entregar-Para: para identificar
suas mensagens.
Existe tambm as seguintes listas de discusso sobre MySQL atualmente:
announce
Esta para anuncio de novas verses do MySQL e programas relacionados. Esta uma lista
com baixo volume na qual todos usuarios do MySQL deveriam se inscrever.
mysql
A principal lista para discusses MySQL em geral. Note que alguns tpicos so mais bem discu-
tidos em listas mais especializadas. Se voc enviar para a lista errada voc pode no obter res-
posta.
mysql-digest
A lista mysql na forma resumida. Isto significa que voc ir receber todas mensagens individu-
ais, 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 bus-
ca e correo de erros. See Seco 1.7.1.3, Como relatar erros ou problemas.
bugs-digest
Informaes Gerais
30
Uma verso resumida da lista bugs.
internals
Uma lista para pessoas que trabalham no cdigo do MySQL. Nesta lista pode-se discutir desen-
volvimento 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 usa-
do pela pessoas que mantm a distribuio para troca de idias de pacotes do MySQL e para as-
segurar que o MySQL esteja o mais parecido possvel em todas as plataformas e sistemas opera-
cionais 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.
Informaes Gerais
31
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 DBD-
mysql.
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 diferen-
tes do Ingls. Perceba que elas no so operadas pela MySQL AB, portanto, no podemos garantir a
qualidade destas.
<mysql-france-subscribe@yahoogroups.com> Lista de mensagens na
lngua francesa.
<list@tinc.net> Lista de mensagens coreana.
Envie subscribe mysql your@email.address para esta lista.
<mysql-de-request@lists.4t2.com> Lista de mensagens alem.
Envie subscribe mysql-de your@email.address para esta lista. Voc pode encon-
trar informaes sobre esta lista de mensagens em http://www.4t2.com/mysql.
<mysql-br-request@listas.linkway.com.br> Lista de mensagens
em portugus Envie subscribe mysql-br your@email.address para esta lista.
<mysql-alta@elistas.net> Lista de mensagens espanhola.
Envie subscribe mysql your@email.address para esta lista.
1.7.1.2. Fazendo perguntas ou relatando erros
Antes de enviar um relato de erro ou uma questo, por favor faa o seguinte:
Informaes Gerais
32
Comece pesquisando o manual MySQL online em: http://www.mysql.com/doc/ Ns tentaremos
manter o manual atualizado, frequentemente atualizando-o com solues para novos problemas
encontrados! O apndice de histrico de mudanas (http://www.mysql.com/doc/en/News.html)
pode ser til j que bem possvel que uma verso mais nova ja tenha a soluo para o seu pro-
blema.
Procure no banco de dados de bugs em http://bugs.mysql.com/ para ver se o erro j foi relatado/
resolvido.
Pesquise os arquivos das listas de mensagens MySQL: http://lists.mysql.com/
Voc pode tambm usar a pgina http://www.mysql.com/search.html para pesquisar todas as p-
ginas Web (incluindo o manual) que esto localizados em http://www.mysql.com/.
Se voc no puder encontrar uma resposta no manual ou nos arquivos, confira com seu expert em
MySQL local. Se voc continua no encontrando uma resposta para sua questo, v em frente e leia
a prxima seo para saber como enviar email para lista de email do MySQL.
1.7.1.3. Como relatar erros ou problemas
Nosso banco de dados de bugs publico e pode ser pesquisado por qualquer um em
http://bugs.mysql.com/. Se voc logar no sistema, voc poder entrar novos relatrios.
Escrever um bom relatrio de erro exige pacincia, e faz-lo de forma apropriada economiza tempo
para ns e para voc. Um bom relatrio de erros contendo um teste de caso para o bug ir torn-lo
muito mais fcil para corrig-lo no prximo release. Esta seo ir ajud-lo a escrever seu relatrio
corretamente para que voc no perca seu tempo fazendo coisas que no iro ajudar-nos muito ou
nada.
Ns encorajamos todo mundo a usar o script mysqlbug para gerar um relato de erros (ou um relato
sobre qualquer problema), se possvel. mysqlbug pode ser encontrado no diretrio scripts na
distribuio fonte, ou, para uma distribuio binria, no diretrio bin no diretrio de instalao do
MySQL. Se voc no puder utilizar o mysqlbug (por exemplo, se voc o estiver executando no
Windows), ainda de vital importncia que voc incluia todas as informaes necessrias listadas
nesta seo (o mais importante uma descrio do sistema operacional e a verso do MySQL).
O script mysqlbug lhe ajudar a gerar um relatrio determinando muitas das seguintes informa-
es automaticamente, mas se alguma coisa importante estiver faltando, por favor fornea-o junto
de sua mensagem! Por favor leita esta seo com cuidado e tenha certeza que todas as informaes
descritas aquie esto includas no seu relatrio.
De preferncia, voc deve testar o problema usando a ltima verso de produo ou desenvolvimen-
to do Servidro MySQL antes do envio. Qualquer um deve estar apto a repetir o erro apenas usando
'mysql test < script' no caso de teste incluido ou executando o script sheel ou Perl que in-
cludo no relatrio de erros.
Todos os erros enviados para o banco de dados dem bugs em http://bugs.mysql.com/ sero corrigi-
dos ou documentados na prxma distribuio do MySQL. Se apenas pequenas mudanas de cdigo
forem necessrias enviaremos um patch para corrigir o problema.
O lugar comum para relatar erros e problemas http://bugs.mysql.com.
Se voc encontrar um erro de segurana no MySQL, envie um email para
<security@mysql.com>.
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.
Informaes Gerais
33
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 proble-
mtico 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 ca-
sos 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 impos-
svel corrigir alguma coisa sem conhecimento do sistema operacional e o nmero da verso da plata-
forma.
Lembre-se tambm de fornecer informaes sobre seu compilador, se isto for relacionado ao proble-
ma. Frequentemente pessoas encontram erros em compiladores e acreditam que o problema relaci-
onado ao MySQL. A maioria dos compiladores esto sobre desenvolvimento todo o tempo e tor-
nam-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 me-
lhores 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 Ta-
bela.
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 men-
sagens 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 colu-
nas. 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 mysqlad-
min version. mysqladmin pode ser encontrado no diretrio bin sob sua instalao do
MySQL.
O fabricante e o modelo da mquina na qual voc est trabalhando.
O nome do sistema operacional e a verso. Para a maioria dos sistemas operacionais, voc pode
obter esta informao executando o comando Unix uname -a. Se voc trabalho no Windows,
voc pode normalmente conseguir o nome e o nmero da verso com um duplo clique sobre o
cone ''Meu Computador'' e em seguida no menu ''Ajuda/Sobre o Windows''.
Algumas vezes a quantidade de memria (real e virtual) relevante. Se estiver em dvida, inclua
esses valores.
Informaes Gerais
34
Se voc estiver usando uma distribuio fonte do MySQL, necessrio o nome e nmero da ver-
so 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 tam-
bm 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. Normal-
mente 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 mysql-
dump --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 instru-
o SELECT produz. Voc tambm deve incluir a sada de SHOW CREATE TABLE no-
me_tabela para cada tabela envolvida. Quanto mais informao voc fornecer sobre a sua si-
tuao, 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 ins-
truo 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 ne-
cessrio. Quanto mais prximo o script puder reproduzir sua situao, melhor. Se voc puder fa-
zer 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 varia-
bles extended-status processlist na sua mensagem para fornecer alguma infor-
mao da performance do seus sistema.
Se voc no puder produzir um caso de teste em algumas linhas, ou se a tabela de testes for mui-
to 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 des-
crio do problema para <bugs@lists.mysql.com>.
Se voc achar que o MySQL produziu um resultado estranho para uma consulta, no inclua so-
mente o resultado, mas tambm sua opinio de como o resultado deve ser, e uma conta descre-
vendo o base de sua opinio.
Quando fornecer um exemplo do problema, melhor usar os nomes de variveis, nomes de tabe-
las, etc. utilizados na sua situao atual do que enviar com novos nomes. O problema pode ser
Informaes Gerais
35
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, vo-
c pode usar o ftp para transferi-lo para ftp://support.mysql.com/pub/mysql/secret/. Se os da-
dos 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 pa-
ra 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 re-
levantes! 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 mysqlac-
cess, a sada de mysqladmin reload, e todas as mensagens de erro que voc obteve quan-
do 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 preci-
samos, 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 con-
seguiu 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 imple-
mentar 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 repa-
rar suas tabelas com myisamchk ou CHECK TABLE e REPAIR TABLE. See Captulo 4, Ad-
ministrao 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! Normalmen-
te o mysqld NUNCA dever danificar uma tabela se nada o finalizou no meio de uma atualiza-
o! Se voc puder encontrar a causa do fim do mysqld, se torna muito mais fcil para ns for-
Informaes Gerais
36
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 anteri-
ores, 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 proble-
ma.
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, consi-
derado boa etiqueta resumir as respostas e enviar o resumo para a lista de mensagens para que outras
possam ter o benefcio das respostas que voc recebeu que ajudaram a resolver seu problema!
1.7.1.4. Guia para responder questes na lista de discusso
Se voc considerar que sua respota possa ter um amplo interesse, voc pode querer post-la para a
lista de mensagens em vez de responder diretamente para a pessoa que perquntou. Tente deixar sua
resposta da forma mais genrica possvel para que outras pessoas alm da que postou a pergunda
possam se beneficiar dela. Quando voc postar para a lista, por favor tenha certeza que sua resposta
no uma rplica de uma resposta anterior.
Tente resumir a parte essencial da questo na sua resposta, no se sinta obrigado a citar a mensagem
original inteira.
Por favor no poste mensagens a partir de seu browser com o modo HTML ligado! Muitos usurios
no leem e-mail com browser!
1.7.2. Suporte a Comunidade MySQL Atrvs do IRC
(Internet Relay Chat)
Em adio as diversas listas de email, voc pode pessoas experientes da comunidade no IRC (In-
ternet Relay Chat). Estes so os melhores canais atualmente conhecidos por ns:
freenode (veja http://www.freenode.net/ para servidores)
#mysql A princpio so questes sobre o MySQL, mas dvidas sobre outros bancos de da-
dos e SQL so bemvindas.
#mysqlphp Questes sobre MySQL+PHP, uma combinao popular.
#mysqlperl Questes sobre MySQL+Perl, outra combinao popular.
EFnet (veja http://www.efnet.org/ para servidores)
#mysql Questes sobre MySQL.
Se voc est procurando por programas clientes de IRC para conectar a uma rede IRC, d uma olha-
da no X-Chat (http://www.xchat.org/). X-Chat (licena GPL) est disponvel para as plataformas
Unix e Windows.
Informaes Gerais
37
1.8. Qual compatibilidade aos padres o
MySQL oferece ?
Esta seo descreve como o MySQL se relaciona aos padres ANSI/ISO SQL. O Servidor MySQL
tem muitas extenses aos padres SQL, e aqui voc descobrir quais so elas, e como us-las. Voc
ir tambm encontrar informao sobre falta de funcionalidade do Servidor MySQL, e como traba-
lhar com algumas diferenas.
Nosso objetivo no restringir, sem um boa razo, a usabilidade do MySQL Server para qualquer
uso. Mesmo se no tivermos os recursos para fazer o desenvolvimento para todos os usos possveis,
estamos sempre querendo ajudar e oferecer sugestes para pessoas que esto tentando usar o
MySQL Server em novos territrios.
Um dos nossos principais objetivos com o produto continuar a trabalhar em acordo com o padro
SQL-99, mas sem sacrificar velocidade e confiana. No estamos receosos em adicionar extenses
ao SQL ou suporte para recursos no SQL se ele aumentar extremamente a usabilidade do MySQL
Server para uma grande parte de nossos usurios. (A nova interface HANDLER no MySQL Server
4.0 um exeemplo desta estratgia. See Seco 6.4.9, Sintaxe HANDLER.)
Continuaremos a suportar bancos de dados transacionais e no transacionais para satisfazer tanto o
uso pesado na web quanto o uso de misso crtica 24/7.
O MySQL Server foi projetado inicialmente para trabalhar com bancos de dados de tamanho mdio
(10-100 milhes de registros ou cerca de 100 MB por tabela) em sistemas computacionais pequenos.
Continuaremos a extender o MySQL Server para funcionar ainda melhor com banco de dados na or-
dem de terabytes, assim como tornar possvel compilar uma verso reduzida do MySQL mais apro-
priadas para handhels e uso embutido. O design compacto do servidor MySQL tornam ambas as di-
rees possveis sem qualquer conflito na rvore fonte.
Atualmente no estamos buscando suporte em tempo real (mesmo se voc j puder fazer muitas coi-
sas com nossos servios de replicao).
Suporte a banco de dados em cluster est planejado para 2004 pela implementao de um novo me-
canismo de armazenamento.
Estamos buscando melhoras no fornecimento de suporte a XML no servidor de banco de dados.
1.8.1. Qual Padro o MySQL Segue?
Entry-level SQL-92. ODBC levels 0-3.51.
We are aiming toward supporting the full SQL-99 standard, but without concessions to speed and
quality of the code.
1.8.2. Executando o MySQL no modo ANSI
Se voc inicializa o mysqld com a opo --ansi ou --sql-mode=ANSI, o seguinte comporta-
mento alterado no MySQL:
|| um oprador de concatenao de strings em vez de um sinnimo para OR.
'"' tratado como um caracter identificados (com o caracter de aspasr '`' do MySQL Server)e
no um caracter de string. Voc ainda pode usar '`' para citar identificadores no modo ANSI.
Uma implicao disto que voc no pode usar aspas duplas para citar um string literal, porque
ela ser intepretada como um identificador.
Voc pode ter qualquer nmero de espaos entre um nome de funo e o '('. Isto faz com que to-
dos 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 co-
loc-lo entre aspas. Por exemplo, por haver a funo USER(), o nome da tabela user no banco
Informaes Gerais
38
de dados mysql e a coluna User nesta tabela se torna reservada, assim voc deve coloc-la en-
tre aspas:
SELECT "User" FROM mysql."user";
REAL um sinnimo para FLOAT no lugar de um sinnimo de DOUBLE.
O nvel de isolamento padro de um transao SERIALIZABLE. See Seco 6.7.6, Sintaxe
SET TRANSACTION.
Voc pode usar um campo/expresso em GROUP BY que no est na lista de campos.
Executando o servidor em modo ANSI o mesmo que inici-lo com estas opes:
--sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE,ONLY_FULL_GROUP_BY --transaction-isolation=serializable
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 mo-
do ANSI. Voc pode verificar o resultado fazendo:
mysql> SET GLOBAL sql_mode="ansi";
mysql> SELECT @@GLOBAL.sql_mode;
-> "REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI"
1.8.3. Extenses do MySQL para o Padro SQL-92
O MySQL fornece algumas extenses que voc provavelmente no ir encontrar em alguns bancos
de dados SQL. Fique avisado que se voc us-las, seu cdigo pode no ser mais portvel para outros
servidores SQL. Em alguns casos, voc pode escrever cdigo que inclui extenses MySQL, mas
continua portvel, usando comentrios da forma /*! ...*/. Neste caso, o MySQL ir analisar e
executar o cdigo com o comentrio como ir fazer com qualquer outra instruo MySQL, mas ou-
tros servidores SQL iro ignorar as extenses. Por exemplo:
SELECT /*! STRAIGHT_JOIN */ nome_campo FROM table1,table2 WHERE ...
Se voc adicionar um nmero de verso depois do '!', a sintaxe s ser executada se a verso do
MySQL igual ou maior que o nmero de verso usado:
CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
O exemplo acima significa que se voc tiver uma verso do MySQL 3.23.02 ou mais nova, ento o
MySQL ir usar a palavra-chave TEMPORARY
Extenses MySQL so listadas abaixo:
Os tipos de campo MEDIUMINT, SET, ENUM e os diferentes tipos BLOB e TEXT.
Informaes Gerais
39
Os atributos de campos AUTO_INCREMENT, BINARY, NULL, UNSIGNED e ZEROFILL.
Todas comparaes de strings por padro so caso insensitivo, com classificao ordenada de-
terminada 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 BI-
NARY, 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 operacio-
nais 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 d-
gito (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 sin-
taxe nome_bd.nome_tbl. Alguns servidores SQL fornecem a mesma funcionalidade mas
chamam isto de User space. O MySQL no suporta tablespaces como em: create table
ralph.my_table...IN minha_tablespace.
LIKE permitido em campos numricos.
O uso de INTO OUTFILE e STRAIGHT_JOIN em uma instruo SELECT. See Seco 6.4.1,
Sintaxe SELECT .
A opo SQL_SMALL_RESULT em uma instruo SELECT.
EXPLAIN SELECT para obter uma descrio de como as tabelas so ligadas.
A utilizao de nomes de ndices, ndices em um prefixo de um campo, e uso de INDEX ou KEY
em uma instruo CREATE TABLE. See Seco 6.5.3, Sintaxe CREATE TABLE.
O uso de TEMPORARY ou IF NOT EXISTS com CREATE TABLE.
O uso de COUNT(DISTINCT lista) onde 'lista' maior que um elemento.
O uso de CHANGE nome_campo, DROP nome_campo, ou DROP INDEX, IGNORE ou RE-
NAME em uma instruo ALTER TABLE. See Seco 6.5.4, Sintaxe ALTER TABLE.
O uso de RENAME TABLE. See Seco 6.5.5, Sintaxe RENAME TABLE.
Utilizao de mltiplas clusulas ADD, ALTER, DROP, ou CHANGE em uma instruo ALTER
TABLE.
O uso de DROP TABLE com as palavras-chave IF EXISTS.
Voc pode remover mltiplas tabelas com uma instruo nica DROP TABLE.
As clusulas ORDER BY e LIMIT das instrues UPDATE e DELETE.
Sintaxe INSERT INTO ... SET col_name = ....
A clusula DELAYED das instrues INSERT e REPLACE.
A clusula LOW_PRIORITY das instrues INSERT, REPLACE, DELETE e UPDATE.
Informaes Gerais
40
O uso de LOAD DATA INFILE. Em alguns casos essa sintaxe compatvel com o Oracle LO-
AD DATA INFILE. See Seco 6.4.8, Sintaxe LOAD DATA INFILE.
As intrues ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE, e REPAIR TABLE.
A instruo SHOW. See Seco 4.6.8, Sintaxe de SHOW.
Strings podem ser fechadas pelo '"' ou ''', no apenas pelo '''.
O uso do meta-caractere de escape '\'.
A instruo SET OPTION. See Seco 5.5.6, Sintaxe de SET.
Voc no precisa nomear todos os campos selecionados na parte GROUP BY. Isto fornece me-
lhor performance para algumas consultas especficas, mas muito comuns. See Seco 6.3.7,
Funes e Modificadores para Usar com Clusulas GROUP BY.
Pode ser especificado ASC e DESC com o GROUP BY.
Para tornar mais fcil para usurios que venham de outros ambientes SQL, o MySQL suporta
apelidos (aliases) para vrias funes. Por exemplo, todas funes de string suportam as sintaxes
ANSI SQL e ODBC.
O MySQL entende os operadores || e && como ou(OR) e e(AND) logicos, como na linguagem
de programao C. No MySQL, || e OR so sinnimos, assim como && e AND. Devido a esta
tima sintaxe, o MySQL no suporta o operador ANSI SQL para concatenao de strings ||;
em vez disso, use o CONCAT(). Como CONCAT() aceita vrios argumentos, fcil converter o
uso do operador || para MySQL.
CREATE DATABASE or DROP DATABASE. See Seco 6.5.1, Sintaxe CREATE
DATABASE.
O operador % um sinnimo para MOD(). Isto , N % M equivalente a MOD(N,M). % su-
portado para programadores C e para compatibilidade com o PostgreSQL.
Os operadores =, <>, <= ,<, >=,>, <<, >>, <=>, AND, OR ou LIKE podem ser utilizados em
comparaes de campos a esquerda do FROM nas instrues SELECT. Por exemplo:
mysql> SELECT col1=1 AND col2=2 FROM nome_tabela;
A funo LAST_INSERT_ID(). See Seco 12.1.3.32, mysql_insert_id().
Os operadores extendidos REGEXP e NOT REGEXP utilizados em expresses regulares.
CONCAT() ou CHAR() com um ou mais de dois argumentos. (No MySQL, estas funes rece-
ber qualquer nmero de argumentos.)
As funes BIT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASS-
WORD(), ENCRYPT(), MD5(), ENCODE(), DECODE(), PERIOD_ADD(), PERI-
OD_DIFF(), TO_DAYS() ou WEEKDAY().
Uso de TRIM() para cortar substrings. o SQL-99 s suporta remoo de caracteres nicos.
As funes do GROUP BY: STD(), BIT_OR(), BIT_AND() e BIT_XOR() e
GROUP_CONCAT(). See Seco 6.3.7, Funes e Modificadores para Usar com Clusulas
GROUP BY.
Uso de REPLACE no lugar de DELETE + INSERT. See Seco 6.4.7, Sintaxe REPLACE.
As instrues FLUSH, RESET e DO.
A possibilidade de configurar variveis em uma instruo com :=:
Informaes Gerais
41
SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS media FROM tabela_teste;
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
1.8.4. Diferenas do MySQL em Comparao com o
SQL-92
Ns tentamos fazer com que o MySQL siguisse os padres ANSI SQL (SQL-92/SQL-99) e o
ODBC SQL, mas em alguns casos, o MySQL realiza operaes de forma diferente:
Para campos VARCHAR, expaos extras so removidos quando o valor armazenado. See Sec-
o 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 Sec-
o 4.4.1, A Sintaxe de GRANT e REVOKE.
Para uma lista priorizada indicando quando novas extenses sero adicionadas ao MySQL voc de-
ve consultar lista TODO online do MySQL em http://www.mysql.com/doc/en/TODO.html. Esta a
ltima verso da lista TODO neste manual. See Seco 1.6, MySQL e o Futuro (o TODO).
1.8.4.1. Subqueries
MySQL Version 4.1 supports subqueries and derived tables (unnamed views). See Seco 6.4.2,
Sintaxe de Subquery.
For MySQL versions prior to 4.1, most subqueries can be successfully rewritten using joins and and
other methods. See Seco 6.4.2.11, Rewriting Subqueries for Earlier MySQL Versions.
1.8.4.2. SELECT INTO TABLE
O MySQL ainda no suporta a extenso SQL do Sybase: SELECT ... INTO TABLE ....
MySQL suporta a sintaxe ANSI SQL INSERT INTO ... SELECT ..., que basicamente a
mesma coisa. See Seco 6.4.3.1, Sintaxe INSERT ... SELECT.
INSERT INTO tblTemp2 (fldID)
SELECT tblTemp1.fldOrder_ID
FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100;
De maneira alternativa, voc pode usar SELECT INTO OUTFILE... ou CREATE TABLE ...
SELECT para resolver seu problema.
1.8.4.3. Transaes e Operaes Atmicas
O MySQL Server (verso 3.23-max e todas as verses 4.0 e acima) suportam transaes com os
mecanismos de armazenamento transacionais InnoDB e BDB. InnoDB fornece
compatibilidade total com ACID. See Captulo 7, Tipos de Tabela do MySQL.
Os outros tipos de tabelas no transacionais (tais como MyISAM) no MySQL Server seguem um pa-
radigma diferente para integridade de dados chamado ``Operes Atmicas.'' Em termos de
transao, tabelas MyISAM efetivamente sempre operam em modo AUTOCOMMIT=1. Operaes
atmicas geralmente oferecem integridade comparvel com a mais alta performance.
Com o MySQL Server suportando ambos os paradigmas, o usurio pode decidir se precisa da velo-
Informaes Gerais
42
cidade das operaes atmicas ou se precisa usar recursos transacionais em seu aplicativo. Esta es-
colha 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 so-
brecarga 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 armaze-
namento para servir a diferentes exigncias e oferecer um timo desempenho em todas as situaes.
Mas como fazer uso dos recursos do MySQL Server para manter uma integridade rigorosa mesmo
com tabelas MyISAM no transacionais e como este recurso se compara com os tipos de tabelas
transacionais?
1. No paradigma transacional, se as suas aplicaes so escritas de uma forma que dependente
na chamada de ROLLBACK em vez de COMMIT em situaes crticas, ento transaes so
mais convenientes. Alm disso, transaes asseguram que atualizaes inacabadas ou ativida-
des corrompidas no sejam executadas no banco de dados; o servidor oferece uma oportunida-
de para fazer um rollback automtico e seu banco de dados mantido.
O MySQL Server, na maioria dos casos, permite a voc resolver potenciais problemas incluin-
do simples conferncias antes das atualizaes e executando scripts simples que conferem in-
consistncias no banco de dados e, automaticamente, repara ou avisa caso isto ocorra. Perceba
que apenas usando o log do MySQL ou mesmo adicionando um log extra, pode-se corrigir ta-
belas perfeitamente sem nenhuma perda de integridade.
2. Mais do que nunco, atualizaes transacionais fatais podem ser reescritas para serem atmicas.
De fato podemos dizer que todos problemas de integridade que transaes resolvem podem ser
feitas com LOCK TABLES ou atualizaes atmicas, assegurando que voc nunca ir ter uma
finalizao automtica da tabela, o que um problema comum em bancos de dados transacio-
nais.
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 atuali-
zaes 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 desenvolvedo-
res 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 at-
micas 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 tabe-
las transacionais mais rpidas e otimizadas.
Em situaes onde integridade de grande importncia, as atuais caractersticas do MySQL permi-
tem 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 pode-
ro 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 vo-
c 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 es-
tar 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 basea-
Informaes Gerais
43
dos em transaes se voc no tiver muito cuidado). O MySQL tambm assegura que nunca ocorre-
r uma leitura suja.
A seguir esto algumas tcnicas para trabalhar com tabelas no transacionais:
Loops que precisam de transaes normalmente pode ser codificados com a ajuda de LOCK
TABLES, e voc no precisa de cursores para atualizar regitros imeditamente.
Para evitar o uso do ROLLBACK, voc pode usar as seguintes estratgias:
1. Use LOCK TABLES ... para fazer um lock todas as tabelas que voc quer acessar.
2. Condies de teste.
3. Atualize se estiver tudo OK.
4. Use UNLOCK TABLES para liberar seus locks.
Isto normalmente um mtodo muito mais rpido que usar transaes com possveis ROLL-
BACKs, 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 algu-
mas das atualizao podem no ter sido execuadas.
Voc tambm pode usar funes para atualizar registros em uma nica operao. Voc pode
conseguir uma aplicao muito eficiente usando as seguintes tcnicas:
Modifique campos em relao ao seus valores atuais.
Atualize apenas aqueles campos que realmente tiveram alteraes.
Por exemplo, quando fazemos atualizaes em alguma informao de cliente, atualizamoa ape-
nas 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, as-
sim 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 atualiza-
mos algumas das colunas, usando valores relativos ao seu valor atual. Isto significa que instru-
es 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 efici-
entemente 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 preci-
Informaes Gerais
44
sam disto, e tabelas InnoDB suportam lock de regitstro. Comoo MyISAM, voc pode usar uma
coluna de flag na tabela e fazer algo como a seguir:
UPDATE nome_tbl SET row_flag=1 WHERE id=ID;
O MySQL retorna 1 para o nmero de linhas afetadas se as linhas foram encontradas e
row_flag j no era 1 na linha original.
Voc pode pensar nisto como se o MySQL Server tivesse alterado a consulta anterior para:
UPDATE nome_tbl SET row_flag=1 WHERE id=ID AND row_flag <> 1;
1.8.4.4. Stored Procedures e Triggers
Steored procedures esto sendo implementadas em nossa verso 5.0 na rvore de desenvolvimento.
See Seco 2.3.4, Instalando pela rvore de fontes do desenvolvimento.
Este esforo baseado no SQL-99, que tm uma sintaxe bsica similar (mas no idntica) ao Oracle
PL/SQL. Em adio a isto, estamoas implementando o framework SQL-99 enganchar em lingua-
gens externas.
Uma Stored Procedure um conjunto de comandos SQL que podem ser compilados e armazenados
no servidor. Uma fez feito isso, os clientes no necessitam reescrever toda a consulta mas podem fa-
zer referncia stored procedure. Isto fornece melhor performance porque a query necessita ser ana-
lisada pelo servidor somente uma vez, e necessita menos informao para ser enviada entre o servi-
dor e o cliente. Voc tambm pode elevar o nvel conceitual tendo bibliotecas de funes no servi-
dor. No entanto, stored procedures aumentam a carga no servidor de banco de dados, j que grande
parte do trabalho feito do lado do servidor e menos do lado do cliente (aplicao).
Triggers esto programados para serem implementados no MySQL verso 5.1. Um trigger um tipo
de stored procedure que chamado quando um evento em particular ocorre. Por exemplo, voc po-
deria configurar uma stored procedure que disparada toda vez que um registro for apagado de uma
tabela transacional que automaticamente apaga o cliente correspondente de uma tabela de clientes
quando todas as transaes forem removidas.
1.8.4.5. Chaves Estrangeiras
No MySQL Server 3.23.44 e posterior, tabelas InnoDB suportam verificao de restrio de chaves
estrangeiras, incluindo CASCADE, ON DELETE, e ON UPDATE. See Seco 7.5.5.2, Restries
FOREIGN KEY.
Para outros tipos de tabela, o MySQL Server atualmente apenas analisa a sintaxe de FOREIGN
KEY no comando CREATE TABLE, mas no usa/armazena esta informao. Em um futuro prximo
esta implementao ser estendida para que assim a informao seja armazenada num arquivo de es-
pecificao de tabela e possa ser recuperado por mysqldump e ODBC. Em um estgio posterior,
restries de chaves estrangeiras sero implementadas para tabelas MyISAM.
Note que as chaves estrangeiras no SQL no so usadas para ligar tabelas, mas so usadas para veri-
ficar a integridade referencial. Se voc deseja obter resultados de mltiplas tabelas de uma instruo
SELECT, voc pode fazer isto ligando tabelas:
SELECT * FROM table1,table2 WHERE table1.id = table2.id;
See Seco 6.4.1.1, Sintaxe JOIN. See Seco 3.6.6, Utilizando Chaves Estrangeiras.
Quando usada como uma restrio, FOREIGN KEYs no precisa ser usado se a aplicao insere du-
as linhas em tabelas MyISAM na ordem apropriada.
Informaes Gerais
45
Para tabelas MyISAM, voc pode contornar a falta de ON DELETE adicionando a instruo DELE-
TE apropriada a uma aplicao quando voc deletar registros de uma tabela que tem uma chave es-
trangeira. Na prtica isto mais rpido e muito mais portvel que utilizar chaves estrangeiras.
No MySQL Server 4.0 voc pode utilizar delees multi-tabela para apagar linha de muitas tabelas
com um comando. See Seco 6.4.5, Sintaxe DELETE.
A sintaxe FOREIGN KEY sem ON DELETE ... usada geralmente por aplicaces ODBC para
produzir clusulas WHERE automticas.
Note que chaves estrangeiras so mal usadas com frequncia, o que pode causar graves problemas.
Mesmo quando usado apropriadamente, o suporte a chaves estrangeiras no uma soluo mgica
para o problema de integridade referncial, embora possa ajudar.
Algumas vantagens das chaves estrangeiras:
Assumindo o projeto apropriado das relaes, as restries de chaves estrangeiras tornaro mais
difcil para um programador introduzir uma inconsistncia no banco de dados.
Usar atualizaes e delees em cascata pode simplificar o cdigo do cliente.
Regras de chaves estrangeiras projetados apropriadamente ajudam ao documentar a relao entre
as tabelas.
Desvantagens:
Erros, que so facis de se ter ao projetar a relao das chaves, podem causar graves proble-
maspor 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 princi-
pais 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 desen-
volvedor 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 imple-
mentadas 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
Informaes Gerais
46
views que so teoricamente atualizveis, devem se atualizados tambm na prtica.
1.8.4.7. '--' como Incio de Comentrio
Outros bancos de dados SQL usam '--' para iniciar comentrios. O MySQL usa '#' como o caracte-
re para incio de comentrio, mesmo se a ferramenta de linha de comando mysql remover todas li-
nhas que comeam com '--'. Voc tambm pode usar o comentrio no estilo C /*isto um
comentrio*/ com o MySQL Server. See Seco 6.1.6, Sintaxe de Comentrios.
O MySQL Server verso 3.23.3 e superior suporta o estilo de comentrio '--' somente se o comen-
trio for seguido por um caractere de espao (ou por um caracter de controle como uma nova linha).
Isto ocorre porque este estilo de comentrio causou muitos problemas com queries SQL geradas au-
tomaticamente que usavam algo como o cdigo seguinte, onde automaticamente er inserido o valor
do pagamento para !pagamento!:
UPDATE nome_tabela SET credito=credito-!pagamento!
O que voc acha que ir acontecer quando o valor de pagamento for negativo? Como 1--1 le-
gal no SQL, ns achamos terrvel que '--' signifique incio de comentrio.
Usando a nossa implementao deste mtodo de comentrio no MySQL Server Version 3.23.3 e
posterior, 1-- Isto um comentrio atualmente seguro.
Outro recurso seguro que o cliente de linha de comando mysql remove todas as linhas que inici-
am com '--'.
A seguinte discusso somente interessa se voc estiver executando uma verso do MySQL inferior a
verso 3.23:
Se voc tem um programa SQL em um arquivo texto que contm comentrios '--' voc dever usar:
shell> replace " --" " #" < arquivo-texto-com-comentrio.sql \
| mysql banco-de-dados
No lugar de:
shell> mysql banco-de-dados < arquivo-texto-com-comentario.sql
Voc tambm pode editar o prprio arquivo de comandos alterando os comentrios '--' para '#':
shell> replace " --" " #" -- arquivo-texto-com-comentario.sql
Desfaa utilizando este comando:
shell> replace " #" " --" -- arquivo-texto-com-comentario.sql
1.8.5. Como o MySQL Lida com Restries
Como o MySQL lhe permite trabalhar com tabelas transacionais e no transacionais (que no permi-
tem rollback), o tratamento de restries um pouco diferente no MySQL que em outros bancos de
dados.
Temos que tratar o caso quando voc atualiza diversos registros com uma tabela no transacional
que no pode fazer rollback em erros.
A filosofia bsica tentar obter um erro para qualquer coisa que possamos detectar em temp de
compilao mas tentar recuperar de qualquer erro que abtemos em tempo de execuo. Fazemos isto
na maiorioa dos casos, mas no para todos ainda. See Seco 1.6.4, Novos Recursos Planejados Pa-
ra a Verso em um Futuro Prximo.
Informaes Gerais
47
A opo bsica que o MySQL tem parar a instruo no meio ou fazer o melhor para se recuperar
do problema e continuar.
A seguir mostramos o que acontece com diferentes tipos de restries.
1.8.5.1. Restries de PRIMARY KEY / UNIQUE
Normalmente voc receber um erro quando tentar fazer um INSERT / UPDATE de um registro que
cause uma violao de uma chave primria, chave nica ou chave estrangeira. Se voc estiver usan-
do um mecanismo de armazenamento transacional, como InnoDB, o MySQL automaticamente far
um rollback da transao. Se voc estiver usando mecanismos de armazenemento no transacionais
o MySQL ir para no registro errado e deiar o resto dos registros se processamento.
Para tornar a vida mais fcil o MySQL adicionou suporte a diretiva IGNORE para a maioria dos co-
mandos que podem causar uma violao de chave (como INSERT IGNORE ...). Neste caso o
MySQL ir ignorar qualquer violao de chave e continuar com o processamento do prximo re-
gistro. Voc pode obter informao sobre o que o MySQL fez com a funo da API
mysql_info() API function e em verses posteriores do MySQL 4.1 com o comando SHOW
WARNINGS. See Seco 12.1.3.30, mysql_info(). See Seco 4.6.8.9, SHOW WARNINGS
| ERRORS.
Note que no momento apenas as tabelas InnoDB suportam chaves estrangeiras. See Seco 7.5.5.2,
Restries FOREIGN KEY.
O suporte a chaves estrangeiras nas tabelas MyISAM est programado para ser includa na arvor de
fonte do MySQL 5.0.
1.8.5.2. Restries de NOT NULL
Para poder suportar um fcil tratamento de tabelas no transacionais todos os campos no MySQL
tm valores padro.
Se voc inserir um valor 'errado' em uma coluna como um NULL em uma coluna NOT NULL ou um
valor numrico muito grande em um campo numrico, o MySQL ir atribuir a coluna o 'melhor va-
lor possvel' em vez de dar uma mensagem de erro. Para strings este valor uma string vazia ou a
maior string possvel que possa estar na coluna.
Isto significa que se voc tentar armazenar NULL em uma coluna que no aceita valores NULL, o
MySQL Server armazenar 0 ou '' (strig vazia) nela. Este ltimo comportamento pode, para uma
simples insero de registro, ser alterado com a opo de compilao -
DDONT_USE_DEFAULT_FIELDS.) See Seco 2.3.3, Opes tpicas do configure . Isto faz
com que as instrues INSERT gerem um erro a menos que voc explicite valores especficos para
todas as colunas que exigem um valor diferente de NULL.
A razo para as regras acima que no podemos verificar estas condies antes da consulta comear
a executar. Se encontrarmos um problema depois de atualizar algumas linahs, no podemos fazer
um rollback j que o tipo de tabela no suporta isto. A opo de parar no to boa como no caso
em que a atualizao esteja feita pela metade que provavelmente o pior cenrio possvel. Neste ca-
so melhor 'fazer o possvel' e ento continuar como se nada tivesse acontecido. No MySQL 5.0
plenejamos melhorar into forncendo avisos para converses automticas de campo, mais uma opo
para deixar voc fazer um rollback das instrues que usam apenas tabelas transacionais no caso de
tal instruo fizer uma definio de campo no permitida.
O mostrado acima significa que no se deve usar o MySQL para verificar o contedo dos campos,
mas deve se faz-lo por meio da aplicao.
1.8.5.3. Restries de ENUM e SET
No MySQL 4.x ENUM no uma restrio real, mas um modo mauis eficiente de armazenar campos
que possam apenas conter um conjunto de valores dados. Isto devido as mesmas razes pelas quais
NOT NULL no respeitado. See Seco 1.8.5.2, Restries de NOT NULL.
Informaes Gerais
48
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 Sec-
o 6.2.3.4, O Tipo SET.
1.8.6. Erros Conhecidos e Deficincias de Projetos no
MySQL
1.8.6.1. Erros da Verso 3.23 Corrigidos em Verses Posteriores
do MySQL
Os seguintes erros/bugs conhecidos no esto corrigidos no MySQL 3.23 porque corrig-los invol-
veria a mudana de muito cdigo, o que poderia introduzir outros erros, talvez piores. Os erros so
tambm classificados como 'no fatal' ou 'tolervel'.
Pode se obter um deadlock ao fazer LOCK TABLE em multiplas tabelas e ento na mesma cone-
xo fizer um DROP TABLE em uma delas enquanto outra thread est tentando bloquear a tabe-
la. Pode-se no entanto fazer um KILL em qualquer uma das threads envolvidas para resolver is-
to. Corrigido na verso 4.0.12
SELECT MAX(campo_chave) FROM t1,t2,t3... onde uma das trs tabelas est vazia
no retorna NULL, mas sim o valor mximo da coluna. Corrigido na verso 4.0.11.
DELETE FROM heap_table sem um WHERE no funcionam em tabelas HEAP com lock.
1.8.6.2. Open Bugs / Deficincias de Projeto no MySQL
Os seguintes problemas so conhecidos e tem prioridade muito alta para serem corrigidos:
FLUSH TABLES WITH READ LOCK no bloqueia CREATE TABLE ou COMMIT, que pode
criar um problema com a posio do log binrio ao se fazer um backup completo de tabelas e do
log binrio.
ANALYZE TABLE em uma tabela BDB pode, em alguns, casos inutilizar a tabela at que se rei-
nicie o servidor mysqld. Quando isto acontecer voc ir ver o seguinte tipo de erro no arquivo
de erros do MySQL.
001207 22:07:56 bdb: log_flush: LSN past current end-of-log
O MySQL aceita parenteses na parte FROM, mas os ignora sem aviso. A razo pela qual no so
retornados erros que muitos clientes que geram consultas automaticamente adicionam parente-
sis na parte FROM mesmo onde eles no so necessrios.
Concatenar muitos RIGHT JOINS ou combinar joins LEFT e RIGHT na mesma consulta po-
dem dar uma resposta incorreta ja que o MySQL s gera registros NULL para tabelas que prece-
dem 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 tabe-
las para as quais voc estiver usando INSERT DELAYED.
Fazendo um LOCK TABLE .. e FLUSH TABLES .. no garante que no existem transa-
es no terminadas em progresso na tabela.
Informaes Gerais
49
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 ca-
sos. 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 cha-
ves duplicados nos dados inseridos.
Se e somente se todos estas consultas NO tiverem clusulas ORDER BY garantindo uma
ordem determinstica.
Na verdade, por exemplo para INSERT ... SELECT sem ORDER BY, o SELECT pode re-
tornar registros em uma ordem diferente (no qual resultar em um registro tendo diferentes posi-
es, obtendo um nmero diferente na coluna auto_increment), dependendo da escolhe fei-
ta pelo otimizador no master e slave. Uma consulta ser otimizada deiferentemente no master e
slave apenas se:
Os arquivos usados pelas duas consultas no so exatamente a mesma; por exemplo OPTI-
MIZE TABLE foi executado nas tabelas master e no nas nas tabelas slave (para corrigir is-
to, desde o MySQL 4.1.1, OPTIMIZE, ANALYZE e REPAIR so escritos no log binrio).
A tabela est armazenada em um mecanismo de armazenamento diferente no master e no
slave (pode se executar diferentes mecanismos de armazenamento no metre e no slave: por
exemplo, InnoDB ne master e MyISAM no slave, se o slave possuir menos espao disppon-
vel em disco).
The MySQL buffers' sizes (key_buffer_size etc) are different on the master and slave.
O master e slave executam verses diferentes do MySQL, e o cdigo do toimizador dife-
rente entre estas verses.
Este problema tambm pode afetar a restaurao de um banco de dados usando mysqlbin-
log|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/modi-
ficados 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 con-
sulta:
SELECT RPAD(t1.field1, 50, ' ') AS f2, RPAD(t2.field2, 50, ' ')
AS f1 FROM table1 as t1 LEFT JOIN table2 AS t2 ON
Informaes Gerais
50
t1.record=t2.joinID ORDER BY t2.record;
O resultado final deste erro que o usurio no conseguira espaos em branco do lado direito do
campo resultante.
O comportamento anterior existe em todas as verses do MySQL.
A razo disto devido ao fato de tabelas HEAP, que so usadas primeiro para tabelas temporri-
as, no so capazes de tratar colunas VARCHAR.
Este comportamento ser corrigido em uma das distribuies da srie 4.1.
Devido ao modo como os arquvos de definies de tabelas so armazenados no se pode usar
255 caracteres (CHAR(255)) em nomes de tabelas, nomes de colunas e enum. Isto est progra-
mado para ser corrigido na verso 5.1 quando temos novos arquivos de formatos de definio de
tabelas.
Quando estiver usando SET CHARACTER SET, no permitido usar caracteres especias no
nome do banco de dados, tabelas ou campos.
Pode-se usar _ ou % com ESCAPE em LIKE ... ESCAPE.
se voc tiver uma coluna DECIMAL com um nmero armazenado em diferentes formatos
(+01.00, 1.00, 01.00), GROUP BY pode considerar cada valor como um valor diferente.
DELETE FROM merge_table usado sem WHERE ir apenas apagar o mapeamento para a ta-
bela, 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 quan-
do estiver comparando BLOBs nestes casos. Isto pode ser alterado com a opo -0
max_sort_lenght para mysqld. Uma forma de contornar este problema para a maioria dos
casos usar a substring: SELECT DISTINCT LEFT(blob,2048) FROM
nome_tabela.
Clculos so feitos com BIGINT ou DOUBLE (normalmente, ambos tem o tamanho de 64 bits).
Depende da preciso utilizada na funo. A regra geral que funes binrias so feitas com
preciso BIGINT, IF e ELT() com preciso BIGINT ou DOUBLE e o resto com preciso
DOUBLE. Devemos evitar o uso de valores sem sinal maiores que 63 bits
(9223372036854775807) para qualquer outra coisa alm de campos binrios!
Todas os campos string, exceto campos do tipo BLOB e TEXTO tem, automaticamente, todos os
espaos extras removidos quando recuperados. Para tipos CHAR, isto no tem problema, e pode
ser considerado como um recurso de acordo com o ANSI SQL92. O problema que no MySQL,
campos VARCHAR so tratados desta mesma forma.
Voc s pode ter at 255 colunas ENUM e SET em uma tabela.
Em MIN(), MAX() e outras funes de agrupamente, o MySQL atualmente compara as colunas
ENUM e SET pelo valor de suas strings ao invs da posio relativa da string no conjunto.
mysqld_safe redireciona todas as mensagens de mysqld para o log mysqld. Um problema
com isto que se voc executar o mysqladmin refresh para fechar e reabrir o log, a st-
dout e a stderr continuam redirecionadas para o log antigo. Se voc utiliza --log extensi-
vamente, dever editar o mysqld_safe para logar em 'hostname'.err em vez de 'host-
name'.log; assim voc pode facilmente utilizar o espao do log antigo apagando-o e execu-
tando mysqladmin refresh.
Em instrues UPDATE, colunas so atualizadas da esquerda para a direita. Se voc referenciar a
uma coluna atualizada, voc ir obter o valor atualizado em vez do valor original, por exemplo:
Informaes Gerais
51
mysql> UPDATE nome_tabela SET KEY=KEY+1,KEY=KEY+1;
Isto atualiza KEY com 2 no lugar de 1.
Voc pode se referir a mltiplas tabelas em uma mesma consulta, mas voc no pode se referir a
qualquer tabelas temporrias dada mais de uma vez. Por exemplo, a seguinte instruo no fun-
ciona.
mysql> SELECT * FROM temporary_table, temporary_table AS t2;
RENAME no funciona com tabelas temporrias (TEMPORARY) ou tabelas usadas em uma tabe-
las 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 escondi-
das 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 re-
sultado, 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 valo-
res dos campos devem ser verificados na aplicao, mas isto ira fornacer um timo ganho de ve-
locidade 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 armaze-
nar 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 ar-
mazenar 0 ou '' (string vazia) na coluna. (Este comportamento pode, entretanto, ser altera-
do com a opo de compilao -DDONT_USE_DEFAULT_FIELDS).
O MySQL permite o armazenamento de alguns valores errados de data em campos do tipo
Informaes Gerais
52
DATE e DATETIME. (Como 2000-02-31 ou 2000-02-00). A idia que no servio do ser-
vidor SQL validar datas. Se o MySQL pode armazenar uma data e recuperar extamente a
mesma data, ento o MySQL armazenar a data. Se a data estiver totalmente errada, o
MySQL ir armazenar a data 0000-00-00 no campo.
Se voc especificar um valor no suportado para um campo do tipo enum, ele ser alterado
para o valor de erro 'empty string', com valor numrico 0.
Se voc definir uma coluna SET com um valor no suportado, o valor ser ignorado.
Se voc executar uma PROCEDURE em uma pesquisa que retorna uma srie vazia, em alguns
casos a instruo PROCEDURE no ir transformar as colunas.
Criao da tabela do tipo MERGE no verifiva se as tabelas envolvidas so de tipos compatveis.
O MySQL ainda no pode lidar com valores NaN, -Inf e Inf em tipos double. Us-los causa-
r problemas na exportao e importao de dados. Uma soluo intermediria alterar NaN pa-
ra NULL (se for possvel) e -Inf e Inf para o valor double mnimo ou mximo respectivo
possvel.
Se voc usar ALTER TABLE para primeiro adicionar um ndice UNIQUE a uma tabela usada
em uma tabela MERGE e ento usar ALTER TABLE para adicionar um ndice normal na tabela
MERGE, a ordem das chaves ser diferente para as tabelas se existir uma chave antiga no nica
na tabela. Isto porque o ALTER TABLE coloca chaves UNIQUE antes de chaves normais para
ser possvel detectar chaves duplicadas o mais cedo o possvel.
Os seguintes erros so conhecidos em verses mais antigas do MySQL:
Voc pode pendurar um processo se voc fizer um DROP TABLE em uma tabela entre outras
que esteja travada com LOCK TABLES.
No caso seguinte voc pode obter um descarrego de memria para o arquivo core:
Tratamento de inseres com atraso tem deixado inseres pendentes na tabela.
LOCK table com WRITE
FLUSH TABLES
Antes da verso 3.23.2 do MySQL um UPDATE que atualizava uma chave com um WHERE na
mesma chave podia falhar porque a chave era usada para procurar por registros e a mesma linha
poderia ter encontrado vrios itens:
UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY > 100;
Um modo de contornar este erro utilizar:
mysql> UPDATE nome_tabela SET KEY=KEY+1 WHERE KEY+0 > 100;
Isto funcionar porque MySQL no utilizar indices em expresses com a clusula WHERE.
Antes da verso 3.23 do MySQL, todos os tipos numricos tratados como campos de pontos fi-
xos. Isto significa que voc tem que especificar quantas casas decimais um campo de ponto flu-
tuante 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 Sec-
o 2.3, Instalando uma distribuio com fontes do MySQL. See Apndice E, Portando para Ou-
tros Sistemas.
Informaes Gerais
53
Captulo 2. Instalao do MySQL
Este captulo descreve como obter e instalar o MySQL:
Para uma lista de sites no quais voc pode obter o MySQL, veja Seco 2.2.1, Como obter o
MySQL.
Para saber quais so as plataformas suportadas, veja em Seco 2.2.3, Sistemas Operacionais
suportados pelo MySQL. Por favor perceba que nem todas as plataformas suportadas so igual-
mente 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 for-
necemos acesso pblico nossa rvore fonte atual para aqueles que desejam ver nossos desen-
volvimentos mais recentes e nos ajudar a testar novos cdigos. Para determinar que verso e tipo
da distribuio voc deve usar, veja Seco 2.2.4, Qual verso do MySQL deve ser usada. Se
ainda restar dvidas, use uma a distribuio binria.
Instrues de instalao para distribuies binria e fonte so descritos em Seco 2.2.9,
Instalando uma Distribuio Binria do MySQL e Seco 2.3, Instalando uma distribuio
com fontes do MySQL. Cada conjunto de instrues inclui uma seo sobre problemas espec-
ficos de sistemas que voc pode precisar.
Para procedimentos ps-instalao, veja Seco 2.4, Configuraes e Testes Ps-instalao.
Estes procedimentos podem ser aplicados caso voc use uma distribuio binria ou fonte do
MySQL.
2.1. Instalao rpida padro do MySQL
Este captulo cobre a instalao do MySQL em plataformas onde oferecemos pacotes usando ofor-
mato de empacotamento nativo da respectiva plataforma. No entanto, as distribuies binrias do
MySQL esto disponveis para muitas outras plataformas, veja Seco 2.2.9, Instalando uma Dis-
tribuio Binria do MySQL para instrues gerais de instalao para estes pacotes que se aplicam
a todas as plataformas.
Veja Seco 2.2, Detalhes Gerais de Instalao para mais informaes sobre quais outras distri-
buies binrias esto disponveis e como obt-las.
2.1.1. Instalando o MySQL no Windows
O processo de instalao para o MySQL no Windows tem os seguintes passos:
1. Instale a distribuio.
2. Configure um arquivo de opo se necessrio.
3. Selcione o servidor que voc quer usar.
4. Inicie o servidor.
O MySQL para Windows est disponvel em dois formatos de distribuio:
A distribuio binria contm um programa de instalao que instala que voc precisa e assim
possa iniciar o servidor imediatamente.
A distribuio fonte contm todo o cdigo e os arquivos suportados para construir o executvel
54
usando o compilador VC++ 6.0. See Seco 2.3.7, Instalando o MySQL a partir do Fonte no
Windows.
Geralmente, a melhor opo a distribuio binria. mais simples e voc no precisa de nenhuma
ferramenta adicional para ter o MySQL em execuo.
2.1.1.1. Exigncias do Sistema Windows
Para executar o MySQL no Windows, voc precisar do seguinte:
Um sistema operacional Windows de 32 bits como 9x, ME, NT, 2000 ou XP. A famlia NT
(Windows NT, 2000 e XP) lhe permite executar o servidor MySQL como um servio. See Sec-
o 2.1.1.7, Iniciando o MySQL no Windows NT, 2000, ou XP.
Suporte ao protocolo TCP/IP.
Um cpia da distribuio binria do MySQL para Windows, o qual pode ser feito download em
http://www.mysql.com/downloads/.
Nota: A distribuio de arquivos so fornecidas no formato zip e recomendamos o uso de um
cliente FTP com opo de resumo para evitar corrompimento de arquivos durante o processo de
download.
Um programa ZIP para descompactar os arquivos da distribuio.
Espao suficiente em disco para descompactar, instalar e criar o banco de dados de acordo com
suas exigncias.
Se voc planeja se conectar ao servidor MySQL via ODBC, voc tambm precisar do dirver
MyODBC. See Seco 12.2, Suporte ODBC ao MySQL.
Se voc precisa de tabelas com tamanho maior que 4GB, instale o MySQL em um sistema de ar-
quivos NTFS ou mais novo. No se esquea de usar MAX_ROWS e AVG_ROW_LENGTH quando
criar tabelas. See Seco 6.5.3, Sintaxe CREATE TABLE.
2.1.1.2. Instalando uma Distribuio Binria do Windows
Para instalar o MySQL no Windows usando uma distribuio binria, siga este procedimento:
1. 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. Voc pode reinstalar o servio com o servidor prprio depois de atualizar.
Se voc no estiver executando o servidor MySQL como um servio, pare desta forma:
C:\mysql\bin> mysqladmin -u root shutdown
Instalao do MySQL
55
4. Finalize o programa WinMySQLAdmin se ele estiver em execuo.
5. Descompacte os arquivos de distribuio em um diretrio temporrio.
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 op-
o, como descrito em Seco 2.1.1.3, Preparando o Ambiente MySQL do Windows.
7. Finalize o processo de instalao.
2.1.1.3. Preparando o Ambiente MySQL do Windows
Se voc precisar especificar opes de inicializao quando executar o servidor, voc pode indentifi-
ca-los na linha de comando ou coloc-los em um arquivo de opo. Par opes que so usadas sem-
pre que o servidor iniciar, voc achar mais conveniente utilizar um arquivo de opco para especifi-
car a configurao do seu MySQL. Isto particularmente verdade sob as seguintes circunstncias:
A localizao do diretrio de instalao ou dados so diferentes dos locais padro (c:\mysql e
c:\mysql\data).
Voc precisa ajustar as configuraes do servidor. Por exemplo, para usar as tabelas transacio-
nais 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 In-
noDB cria os seus arquivos de log e dados no diretrio de dados por padro. Isto significa que
voc no precisa configurar o InnoDB explicitamente. Voc ainda deve faz-lo se desejar, e um
arquivo de opo ser til neste caso.)
No Windows, o instalador do MySQL coloca o diretrio de dados diretamente sob o diretrio onde
voc instalou o MySQL. Se voc quisesse utilizar um diretrio de dados em um local diferente, voc
deve copiar todo o contedo do diretrios data para a nova localizao. Por exemplo, por padro, o
instalador coloca o MySQL em C:\mysql e o diretrio de dados em C:\mysql\data. Se voc
quiser usar um diretrio de dados de E:\mydata, voc deve fazer duas coisas:
Mova o diretrio de dados de C:\mysql\data para E:\mydata.
Use uma opo --datadir para especificar a nova localizao do diretrio de dados cada vez
que voc iniciar o servidor.
Quando o servidor MySQL inicia no Windows, ele procura pelas opes em dois arquivos: O arqui-
vo 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 exa-
ta 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. Inde-
pendente 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
Instalao do MySQL
56
Notepad. Por exemplo, se o MySQL est instalado em D:\mysql e o diretrio de dados est lo-
calizado em D:\mydata\data, voc pode criar o arquivo de opo e definir uma seo
[mysqld] para especificar valores para os parmetros basedir e datadir:
[mysqld]
# defina basedir com o seu caminho de instalao
basedir=D:/mysql
# defina datadir com o local do diretrio de dados,
datadir=D:/mydata/data
Note que os nome de caminho do Windows so especficados em arquivos de opo usando barras
normais em ves de barra invertida. Se voc usar barras invertidas, voc deve us-las em dobro.
Outro modo de se gerenciar um arquivo de opo usar a ferramenta WinMySQLAdmin. Voc po-
de encontrar o WinMySQLAdmin no diretrio bin de sua instalao MySQL, assim como um ar-
quivo de ajuda contendo instrues para us-lo. O WinMySQLAdmin tem a capacidade de editar os
seus arquivos de opo, mas note o seguinte:
WinMySQLAdmin usa apenas o arquivo my.ini.
Se o WinMySQLAdmin encontra o arquivo C:\my.cnf, ele o renomear para
C:\my_cnf.bak para disabilit-lo.
Agora voc est pronto para testar o servidor.
2.1.1.4. Selecionando um Servidor Windows
Iniciado com o MySQL 3.23.38, a distribuio Windows inclui ambos binrios, normal e o MySQL-
Max. Aqui est uma lista dos diferentes servidores MySQL dos quais voc pode escolher:
Binario Descrio
mysqld Compilado com debugger integral e conferncia automtica de alocao de
memria, links simblicos, BDB e tabelas InnoDB.
mysqld-opt Binrio otimizado. A partir da verso 4.0 o InnoDB est habilitado. Antes des-
ta verso, este servidor no tem suporte a tabelas transacionais.
mysqld-nt Binrio otimizado para NT/2000/XP com suporte para named pipes.
mysqld-max Binrio otimizado com suporte para links simblicos, tabelas BDB e InnoDB.
mysqld-
max-nt
Como o mysqld-max, porm compilado com suporte para named pipes.
Todos os binrios acima so otimizados para processadores Intel modernos mas deve funcionar em
qualquer processador Intel i386 ou melhor.
Os servidores mysqld-nt e mysqld-max-nt suportam conexes named pipe. Se voc usar um
destes servidores, o uso de named pipes est sujeito a estas condies:
Os servidores devem ser executados em uma verso do Windows que suporte named pipes (NT,
2000, XP).
A partir da verso 3.23.50, named pipes s estaro habilitados se voc iniciar estes servidores
com a opo --enable-named-pipe.
Os servidores podem ser executados no Windows 98 ou Me, mas o TCP/IP deve estar instalado,
e as conexes named pipes no podem ser usadas.
No Windows 95, estes servidores no podem ser usados.
Instalao do MySQL
57
2.1.1.5. Iniciando o Servidor pela Primeira Vez
No Windows 95, 98, ou Me, cliente MySQL sempre se conecta ao servidor usando TCP/IP. Nos sis-
temas baseados no NT, como o Windows NT, 2000, ou XP, os clientes possuem duas opes. Eles
podem usar TCP/IP, ou eles podem usar um named pipe se o servidor suportar conexes named pi-
pes.
Para informaes sobre qual servidor binrio executar, veja Seco 2.1.1.3, Preparando o Ambiente
MySQL do Windows.
Esta seo lhe d um viso geral da inicializao de um servidor MySQL. A seguinte seo fornce
informao mais especfica para verses particulares do Windows.
Os exemplos nesta seo assumem que o MySQL est instalado sob a localizao padro,
C:\mysql. Ajuste o caminho mostrado nos exemplos se voc tiver o MySQL instalado em um lo-
cal diferente.
Fazer um teste a partir do prompt de comando do em uma janela de console (uma janela ``DOS'') a
melhor coisa a fazer porque o servidor mostra a mensagem de status que aparece na janela do DOS.
Se alguma coisa estiver errado com sua configurao, estas mensagens tornaro mais fcil para voc
de identificar e corrigir qualquer problema.
Tenha certeza que voc est no diretrio onde o servidor localizado e ento entre este comando:
shell> mysqld --console
Para servidores que incluem suporte InnoDB, voc deve ver as seguintes mensagens assim que o
servidor iniciar:
InnoDB: The first specified datafile c:\ibdata\ibdata1 did not exist:
InnoDB: a new database to be created!
InnoDB: Setting file c:\ibdata\ibdata1 size to 209715200
InnoDB: Database physically writes the file full: wait...
InnoDB: Log file c:\iblogs\ib_logfile0 did not exist: new to be created
InnoDB: Setting log file c:\iblogs\ib_logfile0 size to 31457280
InnoDB: Log file c:\iblogs\ib_logfile1 did not exist: new to be created
InnoDB: Setting log file c:\iblogs\ib_logfile1 size to 31457280
InnoDB: Log file c:\iblogs\ib_logfile2 did not exist: new to be created
InnoDB: Setting log file c:\iblogs\ib_logfile2 size to 31457280
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: creating foreign key constraint system tables
InnoDB: foreign key constraint system tables created
011024 10:58:25 InnoDB: Started
Quando o servidor finaliza sua sequncia de inicializao, voc deve ver algo como abaixo, que in-
dica que o servidor est pronto para o conexo com o cliente:
mysqld: ready for connections
Version: '4.0.14-log' socket: '' port: 3306
O servidor continuar a gravar no console qualquer sada de diagnstico adicional que ele produza.
Voc pode abrir uma nova janela de console na qual se executar os programas clientes.
Se voc omitir a opo --console, o servidor grava a sada do diagnstico no log de erro no dire-
trio de dados. O log de erro o arquivo com a extenso .err.
2.1.1.6. Iniciando o MySQL no Windows 95, 98, ou Me
No Windows 95, 98 ou Me, o MySQL usa TCP/IP para conectar um cliente a um servidor. (Isto per-
mitir que qualquer mquina na sua rede se conecte a seu servidor MySQL.) Por isto, voc deve ter
certeza de que o suporte TCP/IP est instalado na sua mquina antes de iniciar o MySQL. Voc po-
Instalao do MySQL
58
de encontrar o TCP/IP no seu CD-ROM do Windows.
Note que se voc estiver usando uma verso antiga do Win95 (por exemplo, OSR2). prefervel
que voc use um pacote antigo Winsock; para o MySQL necessrio o Winsock 2! Voc pode obter
o Winsock mais novo em http://www.microsoft.com. O Windows 98 tem a nova biblioteca Winsock
2, portanto no necessrio atualizar a biblioteca.
Para iniciar o servidor mysqld, voc deve iniciar uma janela do Prompt (Janela ``MS-DOS'') e di-
gitar:
shell> C:\mysql\bin\mysqld
Isto ir iniciar o mysqld em segundo plano. Isto , depois do servidor iniciar, voc deve ver outro
prompt de comando. (Note que se voc iniciar o servidor deste modo no Windows NT, 2000 ou XP,
o servidor ir executar em segundo plano e nenhum prompt de comando aparecer at que o servi-
dor finalize. Por isto, voc deve abrir outro prompt de comando para executar programas clientes
enquanto o servidor estriver em execuo.)
Voc pode finalizar o servidor MySQL executando:
shell> C:\mysql\bin\mysqladmin -u root shutdown
Isto chama o utilitrio administrativo do MySQL mysqladmin para conectar ao servidor e manda-
lo finalizar. O comando conecta como root que a conta administrativa padro no sistema de per-
misses do MySQL. Por favor, note que o sistema de permisses do MySQL totalmente indepen-
dente de qualquer login de usurio sob o Windows.
Se o mysqld no iniciar, por favor, verifique o log de erro para ver se o servidor escreveu alguma
mensagem que possa indicar a causa do problema. Voc pode tambm tentar iniciar o servidor com
mysqld --console; neste caso, voc pode obter alguma informao til na tela que pode ajudar
a resolver o problema.
A ltima opo iniciar o mysqld com --standalone --debug. Neste caso o mysqld ir
escrever em um arquivo log C:\mysqld.trace que deve conter a razo pela qual o mysqld no
inicia. See Seco E.1.2, Criando Arquivos Trace (Rastreamento).
Use mysqld --help para mostrar todas as opes que o mysqld entende!
2.1.1.7. Iniciando o MySQL no Windows NT, 2000, ou XP
Na famlia NT (Windows NT, 2000 ou XP) o modo recomendado de executar o MySQL instal-lo
como um servio do Windows. O Windows ento inicia e para o servidor MySQL automaticamente
quando o Windows inicia e para. Um servidor instalado como um servio tambm pode ser contro-
lado a partir da linha de comando usando os comandos NET, ou com o utilitrio grfico Servios.
O utilitrio Servios (o Service Control Manager do Windows) pode ser encontrado no
Painel de Controle do Windows (em Ferramentas Administrativas no Windows
2000). recomendado que se feche o utilitrio Servios enquanto realiza a operaes de instala-
o ou remoo do servidor a partir desta linha de comando. Isto evita alguns erros estranhos.
Para ter o MySQL funcionando com TCP/IP no Windows NT 4, voc deve instalar o service pack 3
(ou mais novo)!
Antes de instalar o MySQL como um servio, voc deve primeiro parar o servidor atual em execu-
o usando o seguinte commando:
shell> C:\mysql\bin\mysqladmin -u root shutdown
Isto chama o utilitrio administrativo do MySQL mysqladmin para conectar ao servidor e mand-
lo parar. O comando conecta com root que a conta administrativa padro no sistema de permis-
ses do MySQL. Por favor, note que o sistema de permisses do MySQL totalmente independente
Instalao do MySQL
59
de qualquer login de usurio sob o Windows.
Agora instale o servidor como um servio:
shell> mysqld --install
Se voc no definir um nome para o servio, ele instalado com o nome MySQL. Uma vez instala-
do, ele pode ser imediatamente iniciado a partir do utilitrio Servios, ou usando o comando NET
START MySQL. (Este comando caso insensitivo).
Uma vez em execuo, o mysqld pode ser parado usando o utilitrio de Servios ou usando o co-
mando NET STOP MySQL, ou o comando mysqladmin shutdown.
Se voc tiver problemas instalando o mysqld como um servico usando apenas o nome do servidor,
tente instal-lo usando seu caminho compelto:
shell> C:\mysql\bin\mysqld --install
A partir do MySQL 4.0.2, voc pode especificaro nome do servio depois da opo --install. A
partir do MySQL 4.0.3, voc pode especificar uma opo --defaults-file depois do nome do
servio para indicar onde o servidor deve obter opes ao iniciar. A regras que determinam o nome
do servio e os arquivos de opo que o servidor usa so as seguintes:
Se voc no especificar um nome de servio, o servidor usa o nome padro do MySQL e o servi-
dor 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 gru-
po 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 ig-
nora o arquivo de opes padro e l opes apenas a partir do grupo [mysqld] do arquivo in-
dicado.
Nota: Antes do MySQL 4.0.17, um servidor instalado como um servio do Windows tinha proble-
ma 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 con-
tendo espao.
No caso normal que voc instala o servidor com --install mas nenhum nome de servio, o ser-
vidor 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 pa-
ra 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 utili-
trio 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 sem-
pre 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.
Instalao do MySQL
60
Note que quando executado como um servio, o mysqld no tm acesso a um console e ento ne-
nhuma mensagem pode ser vista. Se o mysqld no iniciar, verifique o log de erros par ver se o ser-
vidor 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 Ser-
vios, 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 exe-
cuo. 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 ante-
riores 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 potencial-
mente 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 ape-
nas 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 Regis-
tro. 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 co-
mando do mesmo modo que em verses do Windows que no so baseados no NT. Para instrues
use Seco 2.1.1.6, Iniciando o MySQL no Windows 95, 98, ou Me.
2.1.1.8. Executando o MySQL no Windows
O MySQL suporta TCP/IP em todas as plataformas Windows. Os servidores mysqld-nt e
mysql-max-nt suportam named pipes no NT, 2000 e XP. No entanto, o padro usar TCP/IP,
independente da plataforma:
Named pipes atualmente mais lento que TCP/IP em muitas configuraes do Windows.
Alguns usurios encontraram problemas ao finalizar o servidor MySQL quando era usado na-
med 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 espe-
cificando . 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.
Instalao do MySQL
61
Voc pode testar se o MySQL est funcionando executando qualquer dos seguintes comandos:
C:\> C:\mysql\bin\mysqlshow
C:\> C:\mysql\bin\mysqlshow -u root mysql
C:\> C:\mysql\bin\mysqladmin version status proc
C:\> 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 Compilado em Windows nativo, oferecendo capacidades de edio de texto
muito limitadas.
mysqlc Compilado com o compilador Cygnus GNU, que oferece edio readline.
Se voc desejar usar o mysqlc, deve ter uma cpia da biblioteca cygwinb19.dll em algum lu-
gar que o mysqlc possa encontr-la. Se sua distribuio do MySQL no tiver esta biblioteca insta-
lada 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 di-
retrio 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 ban-
cos 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 seguin-
te 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 co-
mando 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 privilgi-
os com os comandos GRANT e REVOKE. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE.
2.1.2. Instalando o MySQL no Linux
O modo recomendado para instalar o MySQL no Linux usando um arquivo RPM. Os RPMs do
MySQL atualmente so construdos na verso 7.3 do sistema Suse Linux mas deve funcionar em
outras verses de Linux que suportam rpm e usam glibc.
Instalao do MySQL
62
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 adicio-
nais, voc deve instalar o RPM MySQL-Max depois de instalar o RPM MySQL-server. See Sec-
o 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: libmysqlcli-
ent.so.10 is needed by ...''), voc tambm deve instalar o pacote MySQL-sha-
red-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 pa-
cotes 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 de-
pendem de bibliotecas compartilhadas). Para distribuies que incluem as bibliotecas compartilha-
das no mesmo pacote que o servidor MySQL (ex.: Red Hat Linux), voc tambm pode instalar nos-
so 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 MySQL-
VERSION.i386.rpm antes do MySQL 4.0.10.
MySQL-Max-VERSION.i386.rpm
O servidor MySQL Max. Este seridor tem capacidades adicionais que o servidor no ROM
MySQL-server no tem. Voc deve instalar o RPM MySQL-server primeiro, 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 BDB-
mysql.
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 lin-
guagens 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 paco-
te em vez do MySQL-shared, se voc tiver aplicaes instaladas que so dinmicamente liga-
das ao MySQL 3.23 mas voc quer atualizar para o MySQL 4.0 sem quebrar as dependncias da
Instalao do MySQL
63
biblioteca. Este pacote esta disponvel desde o MySQL 4.0.13.
MySQL-embedded-VERSION.i386.rpm
A biblioteca do servidor embutido MySQL (MySQL 4.0).
MySQL-VERSION.src.rpm
Este contm o cdigo fonte para todos os pacotes acima. Ele tambm pode ser usado para tentar
construir RPMs para outras arquiteturas (por exemplo, Alpha ou SPARC).
Para ver todos os arquivo em um pacote RPM, (por exemplo, um RPM MySQL-server), execute:
shell> rpm -qpl MySQL-server-VERSION.i386.rpm
Para realizar uma instalao mnima padro, execute:
shell> rpm -i MySQL-server-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm
Para instalar somente o pacote cliente, execute:
shell> rpm -i MySQL-client-VERSION.i386.rpm
O RPM fornece um recurso para verificar a integridade e autenticidade dos pacotes antes de instal-
los. 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 Sec-
o 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 instala-
do. Por exemplo, se esta localizao for /etc/rc.d/init.d, use estes comandos antes de inta-
lar 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 pron-
to 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 Sec-
o 2.2.9, Instalando uma Distribuio Binria do MySQL.
2.1.3. Instalando o MySQL no Mac OS X
A partir do MySQL 4.0.11, voc pode instalar o MySQL no Mac OS X 10.2 (``Jaguar'') usando um
pacote do binrio do Mac OS X PKG em vez da distribuio binrio em tarball. Note que verses
mais antigas do Mac OS X (ex.: 10.1.x) no so suportadas por este pacote.
Este pacote est localizado dentro de um arquivo de imagem de disco (.dmg). que voc primeiro
Instalao do MySQL
64
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 mysq-
ladmin 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 dire-
trio chamado /usr/local/mysql j existe, ele ser renomeado para /
usr/local/mysql.bak em primeiro lugar. Adicionalmente, ele ir instalar a tabela de permis-
ses do banco de dados MySQL executando mysql_install_db depois da instalao.
O layout de instalao similar a aquele da distribuio binria, todos os binrios do MySQL esto
localizados no diretrio /usr/local/mysql/bin. O socket MySQL ser colocado em /
tmp/mysql.sock por padro. See Seco 2.2.5, Layouts de Instalao.
A instalao do MySQL exige uma conta de usurio do Mac OS X chamada mysql (uma conta de
usurio com este nome existe por padro no Mac OS X 10.2 e acima).
Se voc estiver executando o MAC OS X Server, voc j ter uma verso do MySQL instalado:
Mac OS X Server 10.2-10.2.2 vem com o MySQL 3.23.51 instalado
Mac OS X Server 10.2.3-10.2.6 vem com o MySQL 3.23.53
Mac OS X Server 10.3 vem com o MySQL 4.0.14
Esta seo do manual cobre a instalao apenas do MySQL Mac OS X PKG oficial. Leia o ajuda da
Apple sobre a instalao do MySQL (Execute o aplicativo ``Help View'', selecione a ajuda do ``Mac
OS X Server'' e faa uma busca por ``MySQL'' e leia o item entitulado ``Installing MySQL'').
Note especialmente, que a verso pr-instalada do MySQL no Mac OS X Server iniciado com o
comando safe_mysqld em vez de mysqld_safe.
Se anteriormente voc usava pacotes do MySQL de Marc Liyanage para Mac OS X de
http://www.entropy.ch, voc pode simplesmente seguir as intrues de atualizao para pacotes
usando o layout de instalao dos binrio como dados em suas pginas.
Se voc est atualizado da verso 3.23.xx de Marc ou do verso Mac OS X Server do MySQL para
o MySQL PKG oficial, voc tambm deve converter a tabela de privilgios do MySQL existente pa-
ra o formato atual, porque alguns novos privilgios de segurana foram adicionados. See Sec-
o 2.5.6, Atualizando a Tabela de Permisses.
Se voc preferisse iniciar automaticamente o MySQL durante o boot do sistema, voc tambn preci-
sa 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 in-
formamos este erro a Apple e eles esto investigando este problema.
O Startup Item ser instalado em /Library/StartupItems/MySQL. Ele adiciona uma vari-
Instalao do MySQL
65
vel MYSQLCOM=-YES- ao arquivo de configurao do sistema (/etc/hostconfig). Se voc
desejasse diasbilitar a inicializao automtica do MySQL, simplesmente altere o valor desta vari-
vel para MYSQLCOM=-NO-.
No Mac OS X Server, o script de instalao do Startup Item disabilitar automaticamente a iniciali-
zao da instalao padro do MySQL alterando a varivel MYSQL em /etc/hostconfig para
MYSQL=-NO-. Isto para evitar conflitos na inicializao. No entanto, ele no desliga um servidor
MySQL aj em execuo.
Depois da instalao, voc pode iniciar o MySQL executando os seguintes comandos em um janela
de terminal. Note qye voc preceisa ter privilgios de administrador para realizar esta tarefa.
Se voc tiver instalado o Startup Item:
shell> sudo /Library/StartupItems/MySQL/MySQL start
(Enter your password, if necessary)
(Press Control-D or enter "exit" to exit the shell)
Se voc no tiver instalado o Startup Item, digite a seguinte sequncia de comandos:
shell> cd /usr/local/mysql
shell> sudo ./bin/mysqld_safe
(Enter your password, if necessary)
(Press Control-Z)
shell> bg
(Press Control-D or enter "exit" to exit the shell)
Agora voc deve conseguir se conectar ao servidor MySQL, ex.: executando /
usr/local/mysql/bin/mysql
Se voc instalar o MySQL pela primeira vez, lembre-se de consigurar uma senha para o usurio
root do MySQL!
Isto feito com os seguintes comandos:
/usr/local/mysql/bin/mysqladmin -u root password <password>
/usr/local/mysql/bin/mysqladmin -u root -h `hostname` password <password>
Por favor, tenha certeza que o comando hostname na segunda linha est entre crases (`), assim a
shell pode substitu-la com a sada deste comando (o nome da mquina deste sistema)!
Voc tambm pode querer adicionar aliases ao seu arquivo de resursos do sheel para acessar mysql
e mysqladmin da linha de comando:
alias mysql '/usr/local/mysql/bin/mysql'
alias mysqladmin '/usr/local/mysql/bin/mysqladmin'
De forma alternativa, voc pode simplesmente adicionar /usr/local/mysql/bin a sua vari-
vel 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. In-
felizmente o Mac OS X Installer ainda no oferece a funcionalidade exigida para atualizar apropria-
damente 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 es-
pao em disco. Adicionalmente voc tambm deve remover verses mais antigas do diretrio do
Package Receipt localizados em /Library/Receipts/mysql-<version>.pkg.
Instalao do MySQL
66
2.1.4. Instalando o MySQL no NetWare
A partir da verso 4.0.11, o MySQL est disponvel para a Novell NetWare na forma de pacote do
binrio. Para servir o MySQL, o servidor NetWare deve suprir estas exigncias:
NetWare verso 6.5, ou NetWare 6.0 com Support Pack 3 instalado (Voc pode obt-lo em
http://support.novell.com/filefinder/13659/index.html). O sistema deve obedecer as exigncias
mnimas da Naveel para executar a respectiva verso do NetWare.
Os dados do MySQL, assim com os seus binrios, devem ser instalados em um volume NSS;
volumes tradicionais no so suportados.
O pacote binrio para o NetWare pode ser obtido em http://www.mysql.com/downloads/.
Se voc estiver executando o MySL no NetWare 6.0, sugerimos que voc utilize a opo -
-skip-external-locking na linha de comando. Tambm ser necessrio utilizar CHECK
TABLE e REPAIR TABLE em vez de myisamchk, porque myisamchk faz uso de lock externo.
Lock externo possui problemas com NetWare 6.0; o problema foi eliminado no NetWare 6.5.
2.1.4.1. Instalando o MySQL para Binrios do NetWare
1. Se voc estiver atualizando de um instaao anterior, para o servidor MySQL. Isto feito a par-
tir do console do servidor, usando:
SERVER: mysqladmin -u root shutdown
2. Conecte-se no servidor alvo a partir de uma mquina cliente com acesso ao local onde voc
instalar o MySQL.
3. Extraia o pacote zip binrio em seu servidor. Tenha certeza de permitir que os caminhos no ar-
quivo 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. Recomenda-
mos usar o SYS:MYSQL; exemplos no manual o usaro para se referir ao diretrio de instala-
o em geral.
5. No console do servidor, adicione um caminho de busca no diretrio contendo os NLMs do
MySQL. Por exemplo:
SERVER: SEARCH ADD SYS:MYSQL\BIN
6. Instale o banco de dados inicial, se necessrio, digitando mysql_install_db no console do
servidor.
7. Inicie o servidor MySQL usando mysqld_safe no console do servidor.
8. Para finalizar a instalao, voc tambm deve adicionar os seguintes comandos ao autoe-
xec.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
Instalao do MySQL
67
Se voc estiver usando NetWare 6.0, voc deve adicionar o parmetro -
-skip-external-locking:
#Starts the MySQL 4.0.x database server
SEARCH ADD SYS:MYSQL\BIN
MYSQLD_SAFE --skip-external-locking
Se houver uma instalao existente do MySQL no servidor, verifique a existencia de comandos de
inicializao do MySQL em autoexec.ncf, e edite ou delete-os se necessrio.
2.2. Detalhes Gerais de Instalao
2.2.1. Como obter o MySQL
Confira a homepage da MySQL homepage (http://www.mysql.com/) para informaes sobre a ver-
so atual e para instrues de download.
Nosso principal espelho de download est localizado em: http://mirrors.sunsite.dk/mysql/.
Para uma lista atualizada completa dos mirrors de download da MySQL, veja
http://www.mysql.com/downloads/mirrors.html. Voc tambm encontrar informao sobre como
se tornar um mirror do MySQL e como relatar um mirror ruim ou desatualizado.
2.2.2. Verificando a Integridade do Pacote Usando MD5
Checksums ou GnuPG
Depois de fazer o download do pacote MySQL que serve s suas necessidades e antes de tentar ins-
tal-lo, voc deve ter certeza de que ele esta intacto e no foi manipulado.
A MySQL AB oferece dois tipos de verificao de integridade: MD5 checksums e assinaturas
criptografadas usando GnuPG, o GNU Privacy Guard.
Verificando o MD5 Checksum
Depois de fazer o download do pacote, voc deve verificar se o MD5 checksum corresponde a aque-
le fornecido na pgina de download do MySQL. Cada pacote tem um checksum individual, que vo-
c pode verificar com o seguinte comando:
shell> md5sum <pacote>
Note que nem todos os sistemas operacionais suportam o comando md5sum - em alguns ele sim-
plesmente chamado md5, outros no o possuem. No Linux, ele parte do pacote GNU Text Uti-
lities, que est disponvel para uma grande faixa de plataformas. Voc pode fazer o download
do cdigo fonte em http://www.gnu.org/software/textutils/. Se voc tiver o OpenSSL instalado, vo-
c tambm pode usar o comando openssl md5 <pacote>. Uma implementao do comando
md5 para DOS/Windows est disponvel em http://www.fourmilab.ch/md5/.
Exemplo:
shell> md5sum mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz
155836a7ed8c93aee6728a827a6aa153
mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz
Voc deve verificar se o resultado do checksum corresponde a aquele impresso no pgina de down-
load logo abaixo do respectivo pacote.
Instalao do MySQL
68
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 dvi-
da, 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 cripto-
grafadas. 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 verifica-
o 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 dire-
tamente 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. Ve-
ja 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 as-
Instalao do MySQL
69
sinatura tem a extenso .asc. Por exemplo, a assinatura de mysql-stan-
dard-4.0.10-gamma-pc-linux-i686.tar.gz seria mysql-stan-
dard-4.0.10-gamma-pc-linux-i686.tar.gz.asc. Tenha certeza que ambos os arqui-
vos esto armazenados no mesmo diretrio e ento execute o seguinte comando para verificar a assi-
natura para este arquivo:
shell> gpg --verify <package>.asc
Exemplo:
shell> gpg --verify mysql-standard-4.0.10-gamma-pc-linux-i686.tar.gz.asc
gpg: Warning: using insecure memory!
gpg: Signature made Mon 03 Feb 2003 08:50:39 PM MET using DSA key ID 5072E1F5
gpg: Good signature from
"MySQL Package signing key (www.mysql.com) <build@mysql.com>"
A mensagem "Good signature" indica que est tudo certo.
Verificando Assinatura Usando RPM
Para pacotes RPM, no h assinaturas separadas - pacotes RPM atualmente tm uma assinatura GPG
includa e MD5 checksum. Voc pode verific-los executando o seguinte comando:
shell> rpm --checksig <package>.rpm
Exemplo:
shell> rpm --checksig MySQL-server-4.0.10-0.i386.rpm
MySQL-server-4.0.10-0.i386.rpm: md5 gpg OK
Nota: Se voc estiver usando RPM 4.1 e ele reclamar sobre (GPG) NOT OK (MISSING
KEYS: GPG#5072e1f5) (mesmo se voc a importou para detro de sua pasta de chaves publicas
GPG), voc precisa import-las para dentro de sua pasta de chaves RPM primeiro. RPM 4.1 no uti-
liza mais ias suas pastas de chaves GPG (e o prprio GPG), mas mantm sua prpria pasta de cha-
ves (porque ele um aplicativo do sistema e a pasta de chaves pblicas do GPG um arquivo espe-
cfico do usurio). Para importar a chave pblica do MySQL em uma pasta de chaves RPM, use os
seguintes comandos:
shell> rpm --import <pubkey>
Exemplo:
shell> rpm --import mysql_pubkey.asc
Caso voc note que as assinaturas MD5 checksum ou GPG no coincidem, tente primeiro fazer o
download do pacote respectivo mais uma vez, talvez de outro site mirror. Se voc no obter sucesso
na verificao da integridade do pacote repetidas vezes, notifique-nos sobre tais incidentes incluindo
o nome completo do pacote e o site que voc tem utilizado para fazer o download pelos emails
<webmaster@mysql.com> ou <build@mysql.com>.
2.2.3. Sistemas Operacionais suportados pelo MySQL
Ns ulitizamos o GNU Autoconf, para que seja possvel portar o MySQL para todos sistemas opera-
cionais modernos com threads Posix funcionando e um compilador C++. (Para compilar somente o
cdigo cliente, um compilador C++ necessrio mas threads no.) Ns mesmos usamos e desenvol-
vemos o software primeiramente no Linux (SuSE e red Hat), FreeBSD e Sun Solaris (Verses 8 e
9).
Perceba que para alguns sistemas operacionais, o suporte nativo a thread funciona somente nas lti-
mas verses. O MySQL compila com sucesso nas seguintes combinaes de sistema operacional/paco-
te de thread:
AIX 4.x com threads nativas. See Seco 2.6.6.4, Notas IBM-AIX.
Amiga.
Instalao do MySQL
70
BSDI 2.x com o pacote includo MIT-pthreads. See Seco 2.6.4.5, Notas BSDI Verso 2.x.
BSDI 3.0, 3.1 e 4.x com threads nativas. See Seco 2.6.4.5, Notas BSDI Verso 2.x.
SCO OpenServer with a recent port of the FSU Pthreads package. See Seco 2.6.6.9, Notas
SCO.
SCO UnixWare 7.0.1. See Seco 2.6.6.10, Notas SCO Unixware Version 7.0 .
DEC Unix 4.x com threads nativas. See Seco 2.6.6.6, Notas Alpha-DEC-UNIX (Tru64).
FreeBSD 2.x com o pacote includo MIT-pthreads. See Seco 2.6.4.1, Notas FreeBSD .
FreeBSD 3.x e 4.x com threads nativas. See Seco 2.6.4.1, Notas FreeBSD .
FreeBSD 4.x com Linuxthreads. See Seco 2.6.4.1, Notas FreeBSD .
HP-UX 10.20 com o pacote includo MIT-pthreads ou DCE threads. See Seco 2.6.6.2, Notas
HP-UX Verso 10.20.
HP-UX 11.x com as threads nativas. See Seco 2.6.6.3, Notas HP-UX Verso 11.x .
Linux 2.0+ com LinuxThreads 0.7.1+ ou glibc 2.0.7+. See Seco 2.6.2, Notas Linux (Todas
as verses).
Mac OS X Server. See Seco 2.6.5, Notas Mac OS X.
NetBSD 1.3/1.4 Intel e NetBSD 1.3 Alpha (Necessita GNU make). See Seco 2.6.4.2, Notas
NetBSD.
Novell NetWare 6.0. See Seco 2.6.8, Notas Novell NetWare.
OpenBSD > 2.5 com threads nativas. OpenBSD < 2.5 com o pacote includo MIT-pthreads . See
Seco 2.6.4.3, Notas OpenBSD.
OS/2 Warp 3, FixPack 29 e OS/2 Warp 4, FixPack 4. See Seco 2.6.7, Notas OS/2 .
SGI Irix 6.x com threads nativas. See Seco 2.6.6.8, Notas SGI Irix.
Solaris 2.5 e superior com threads nativas nas plataformas SPARC e x86. See Seco 2.6.3,
Notas Solaris.
SunOS 4.x com o pacote includo MIT-pthreads. See Seco 2.6.3, Notas Solaris.
Tru64 Unix
Windows 9x, Me, NT, 2000 e XP. See Seco 2.6.1, Notas Windows.
Perceba que nem todas as plataformas so apropriadas para executar o MySQL. Os seguintes fatores
determinam se uma certa plataforma apropriada para uma misso crtica pesada:
Estabilidade geral da biblioteca thread. Uma plataforma pode ter excelente reputao, entretanto,
se a biblioteca thread instvel no cdigo que usado pelo MySQL, mesmo se todo o resto for
perfeito, o MySQL ir ser to estvel quanto a biblioteca thread.
A habilidade do kernel e/ou a biblioteca thread tirar vantagem do SMP em sistemas multi-
processados. Em outras palavras, quando um proceesso cria uma thread, deve ser possvel para
aquela thread executar em uma CPU diferente que o processo original.
A habilidade do kernel e/ou a biblioteca thread executar vrias threads que adiquire/libera um
bloqueio mutex sobre uma pequena regio crtica frequentemente sem trocas de contexto exces-
sivos. Em outras palavras, se a implementao de pthread_mutex_lock() requisitar a
Instalao do MySQL
71
CPU muito rapidamente, isto ir afetar o MySQL tremendamente. Se esse detalhe no estiver
sendo cuidado, adicionar CPUs extras podem deixar o MySQL mais lento.
Estabilidade e performance geral do sistema de arquivos.
Habilidade do sistema de arquivos em lidar com arquivos grandes de forma eficiente, se suas ta-
belas 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 com-
pilao. Ns tambm podemos fornecer conselhos sobre como configurar seu sistema otimizada-
mente para o MySQL.
O volume de testes feitos internamente de configuraes similares.
O nmero de usurios que tem executado o MySQL com sucesso naquela plataforma em confi-
guraes 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 supe-
rior. 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 Dis-
cusso do MySQL.
Por favor, perceba que a comparao acima no para dizer que um SO melhor ou pior que o ou-
tro 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 otimiza-
o para aquela plataforma em particular. Estamos apenas colocando nossas observaes para ajud-
lo na deciso de qual plataforma usar o MySQL na sua configurao.
2.2.4. Qual verso do MySQL deve ser usada
A primeira deciso a ser feita se voc deve usar a ltima verso de desenvolvimento ou a ltima
verso estvel:
Normalmente, se voc estiver usando o MySQL pela primeira vez ou tentando port-lo para al-
gum 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 lana-
mento.
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 platafor-
ma, ser normalmente muito mais fcil para instalar do que a distribuio em cdigo fonte.
Instalao do MySQL
72
Nos seguites casos voc provavelmente ser mais bem servido com uma instalao baseada em c-
digo fonte:
Se voc desejar instalar o MySQL em algum lugar expecfico. (O padro das distribuies bin-
rias estar``pronto para rodar'' em qualquer lugar, mas talvez voc deseje ainda mais flexibilida-
de).
Para estar apto e satisfazer diferentes requisies dos usurios, estaremos fornecendo duas ver-
ses 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 clien-
tes 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 MySQL-
server padro.
Se voc deseja configurar mysqld com alguns recursos extras que NO esto nas distribuies
binrias. Segue abaixo a lista das opes extras mais comuns que voc pode querer usar:
--with-innodb
--with-berkeley-db (padro para o MySQL 4.0 e seguintes)
--with-raid (no disponvel para todas as plataformas)
--with-libwrap
--with-named-z-lib (Isto feito para alguns dos binrios)
--with-debug[=full]
A distribuio binria padro normalmente compilada com suporte para todos conjuntos de ca-
racteres e deve funcionar em uma variedade de processadores para a mesma famlia do processa-
dor.
Se voc precisar de um servidor MySQL mais rpido voc pode querer recompil-lo com supor-
te 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 prova-
velmente 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 dis-
tribuio 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 sufi-
xo. Por exemplo, um nome de lanamento como mysql-4.1.0-alpha interpretado da seguin-
te 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.
O segundo nmero (1) o nvel da distribuio.
O terceiro nmero (0 o nmero da verso do nvel de distribuio. Este incrementado para
cada nova distribuio. Normalmente voc desejar a ltima verso para o nvel de publicao
Instalao do MySQL
73
que tiver escolhido.
O sufixo (alpha) indica o nvel de estabilidade da verso. Os possveis sufixo so:
alpha indica que a verso contm grandes sees de novos cdigos que no foram 100%
testados. Bugs conhecidos (normalmente no tem nenhum) devem estar documentados na se-
o News. See Apndice D, Histrico de Alteraes do MySQL. Existem tambm novos co-
mandos e extenses na maioria das publicaes alpha. Desenvolvimento ativo que podem
envolver maiores alteraes no cdigo pode ocorrer numa verso alpha, mas tudo ser testa-
do 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 al-
terao 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 pe-
quenas 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. Somen-
te correes de erros crticos so adicionados ao release. Isto o que chamamos de uma dis-
tribuio estvel.
No processo de desenvolvimento do MySQL, vrias verses coexistem e esto em um estgio dife-
rente. 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 influenci-
ar a estabilidade do cdigo adicionado.
No ramo alpha 4.1 principal, novos recursos so adicionados. Fontes e binrios esto dispon-
veis para uso e teste em sistemas de desenvolvimento.
O ramo de desenvolvimento 5.0 s est disponvel para a rvore do BitKeeper.
Todas as verses do MySQL funcionam sobre nossos testes padres e comparativos para garantir
que eles so relativamente seguros para o uso. Como os testes padres so extendidos ao longo do
tempo para conferir por todos os bugs antigos encontrados, o pacote de testes continua melhorando.
Perceba que todas publicaes de verses foram testadas pelo menos com:
Um pacote de testes interna
Faz parte de um sistema de produo para um cliente. Ela tem diversas tabelas com centenas de
megabytes de dados.
O diretrio mysql-test contm um conjunto extensivo de casos de teste. Ns executamos es-
tes testes para cada servidor binrio.
O pacote de comparativos da MySQL
Este executa uma srie de consultas comuns. tambm um teste para ver se o ltimo conjunto
de otimizaes fez o cdigo mais rpido. See Seco 5.1.4, O Pacote de Benchmark do
MySQL.
O teste crash-me
Instalao do MySQL
74
Este tenta determinar quais recursos o banco de dados suporta e quais so suas capacidades e li-
mitaes. 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 inter-
na, em pelo menos uma mquina. Ns temos mais de 100 gigabytes de dados com que trabalhar.
2.2.5. Layouts de Instalao
Esta seo descreve o layout padro dos diretrios criados pela instalo das distribuies binria e
fonte.
Uma distribuio binria instalada descompactando-a no local de instalao de sua escolha
(tipicamente /usr/local/mysql) e cria os seguintes diretrios nesses locais:
Diretrio Contedo do diretrio
bin Programas clientes e o servidor mysqld
data Arquivos Log, bancos de dados
docs Documentao, Log de alteraes
include Arquivos de cabealho (headers)
lib Bibliotecas
scripts mysql_install_db
share/mysql Arquivos de mensagem de erro
sql-bench Benchmarks - testes comparativos
Uma distribuio baseada em cdigo fonte instalada depois de voc configur-la e compil-la. Por
padro, a instalao copia os arquivos em /usr/local, nos seguintes subdiretrios:
Diretrio Contedo do diretrio
bin Programas clientes e scripts
include/mysql Arquivos de cabealho (headers)
info Documentao no formato Info
lib/mysql Bibliotecas
libexec O servidor mysqld
share/mysql Arquivos com mensagens de erros
sql-bench Benchmarks e o teste crash-me
var Bancos de dados e arquivos log
Dentro de um diretrio de instalao, o layout de uma instalao baseada em fontes diferencia de
uma instalao binria nas seguintes formas:
The mysqld server is installed in the libexec directory rather than in the bin directory.
The data directory is var rather than data.
mysql_install_db is installed in the /usr/local/bin directory rather than in /
usr/local/mysql/scripts.
The header file and library directories are include/mysql and lib/mysql rather than in-
clude and lib.
Instalao do MySQL
75
You can create your own binary installation from a compiled source distribution by executing the
script scripts/make_binary_distribution.
2.2.6. Como e quando as atualizaes so lanadas?
O MySQL est evoluindo muito rapidamente na MySQL AB e ns queremos compartilhar isto com
outros usurios MySQL. Sempre que temos alguns recursos teis que outros acham necessio, tenta-
mos fazer um release.
Tambm tentamos ajudar usurios que solicitam recursos que so de fcil implementao. Tomamos
notas do que nossos usurios licenciados gostariam de ter,especialmente do que nossos clientes com
suporte extendido desejam e tentamos ajud-los.
No existe uma real necessidade para baixar uma nova release. A seo News ir dizer se a nova
verso tem alguma coisa que voc precisa. See Apndice D, Histrico de Alteraes do MySQL.
Usamos a seguinte poltica quando estamos atualizando o MySQL:
Para cada pequena atualizao, o ltimo nmero na verso incrementado. Quando tiver um
maior nmero de novos recursos ou menor incompatibilidade com verses antigas, o segundo
nmero na verso incrementado. Quando o formato de arquivo altera, o primeiro nmero au-
mentado.
Verses estveis testadas aparecem na mdia de uma a duas vezes por ano, mas se pequenos
bugs so encontrados, uma verso ser lanada apenas com as correes dos erros.
Releases funcionais aparecem na mdia a cada 4-8 semanas.
Distribuies binrias para algumas plataformas ser feita por ns somente para releases mais
importantes. Outras pessoas podem fazer distribuies binrias para outros sistemas mas prova-
velmente com menos frequencia.
Ns normalmente disponibilizamos os patches logo que localizamos e corrigimos pequenos
bugs. Eles normalmente so imediatamente disponibilizados em nosso repositrio publico do
BitKeeper. Eles sero includos na prxima distribuio.
Para bugs no crticos, mas irritantes, disponibilizamos patches se eles so enviados para ns.
De qualquer forma, iremos combinar vrios deles em um patch maior.
Se existitr, por algum motivo, um bug fatal numa verso criaremos uma nova release o mais ce-
do 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 comple-
to, pois isto abandona a correes de bugs e coisas que ``devem ser feitas.'' ``Alguma coisa congela-
da'' 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.
2.2.7. Filosofia das Distribuies - Nenhum Bug Co-
nhecidos nas Distribuies
Colocamos muito tempo e esforo em tornar nossas distribuies livres de erros. Pelo nosso conhe-
cimento, no liberamos uma nica verso do MySSQL com qualquer erro conhecido 'fatal'.
Instalao do MySQL
76
Um erro fatal algo que faz o MySQL falhar com o uso normal, traz respostas erradas para consul-
tas 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 de-
senvolvimento, 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 nos-
so 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), documentare-
mos isto no manual. See Seco 1.8.6, Erros Conhecidos e Deficincias de Projetos no
MySQL.
Ns fazemos uma construo para todas as plataformas para as quais suportamos binrios (mais
de 15 plataformas) e executamos nosso pacote de teste e benchmarks para todas elas.
No publicaremos um binrio para uma plataforma na qual os testes do pacote de benchmarks
falharam. Se for um erro geral na fonte, o corrigimos e fazemos as contrues mais os teste em
todos os sistemas novamente.
Se ns, durante a o porcesso de construo e teste (que leva de 2 a 3 dias) recebermos um relat-
rio sobre um erro fatal (por exemplo, um que cause um core dump), o corrigiremos e reiniciare-
mos o processo de construo).
Depois de publicarmos os binrios em http://www.mysql.com/, enviamos um email de anncio
nas listas de email mysql e announce. See Seco 1.7.1.1, As Listas de Discusso do
MySQL. A mensagem de anncio contm uma lista de todas as alteraes da distribuio e
qualquer problema conhecido com ela. (A seo 'problemas conhecidos' na notas das distribui-
es s tem sido necessria em algumas da distribuies.)
Para darmos acesso rapidamente aos nossos usurios dos ltimos recursos do MySQL, fazemos
uma nova distribuio do MySQL a cada 4-8 semanas. Instantneos do cdigo finte so contru-
dos diariamente e esto disponveios em http://downloads.mysql.com/snapshots.php.
Se, depois da distribuio estar pronta, recebermos qualquer relatrio que houve (depois de tu-
do) qualquer coisa criticamente errada com a construo em uma plataforma especfica, corrigi-
remo-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.
Instalao do MySQL
77
2.2.8. Binrios MySQL compilados pela MySQL AB
Como um servio, ns na MySQL AB fornecemos um conjunto de distribuies binrias do MySQL
que so compiladas no nosso site ou em sites onde os clientes cordialmente nos do acesso as suas
mquinas.
Em adio aos binrios forncedios em formatos de pacotes especficos da plataforma (veja Sec-
o 2.1, Instalao rpida padro do MySQL), oferecemos distribuies binrios para outras plata-
formas atravs de arquivos tar compactados (.tar.gz).
Estas distribuies so geradas usando o script Build-tools/Do-compile que compila o c-
digo fonte e cria o arquivo binrio em tar.gz usando scripts/ma-
ke_binary_distribution. Estes binrios so configurados e construdos com os seguintes
compiladores e opes.
Binrios construdos no sistema de desenvolvimento da MySQL AB:
Linux 2.4.xx x86 com gcc 2.95.3
CFLAGS="-O2 -mcpu=pentiumpro" CXX=gcc CXXFLAGS="-O2 -mc-
pu=pentiumpro -felide-constructors" ./configure -
-prefix=/usr/local/mysql --with-extra-charsets=complex -
-enable-thread-safe-client --enable-local-infile -
-enable-assembler --disable-shared -
-with-client-ldflags=-all-static -
-with-mysqld-ldflags=-all-static
Linux 2.4.xx Intel Itanium 2 com ecc (Intel C++ Itanium Compiler 7.0)
CC=ecc CFLAGS="-O2 -tpp2 -ip -nolib_inline" CXX=ecc CXX-
FLAGS="-O2 -tpp2 -ip -nolib_inline" ./configure -
-prefix=/usr/local/mysql --with-extra-charsets=complex -
-enable-thread-safe-client --enable-local-infile
Linux 2.4.xx Intel Itanium com ecc (Intel C++ Itanium Compiler 7.0)
CC=ecc CFLAGS=-tpp1 CXX=ecc CXXFLAGS=-tpp1 ./configure -
-prefix=/usr/local/mysql --with-extra-charsets=complex -
-enable-thread-safe-client --enable-local-infile
Linux 2.4.xx alpha com ccc (Compaq C V6.2-505 / Compaq C++ V6.3-006)
CC=ccc CFLAGS="-fast -arch generic" CXX=cxx CXXFLAGS="-fast -
arch generic -noexceptions -nortti" ./configure -
-prefix=/usr/local/mysql --with-extra-charsets=complex -
-enable-thread-safe-client --enable-local-infile -
-with-mysqld-ldflags=-non_shared -
-with-client-ldflags=-non_shared --disable-shared
Linux 2.4.xx s390 com gcc 2.95.3
CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors"
./configure --prefix=/usr/local/mysql -
-with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --disable-shared -
-with-client-ldflags=-all-static -
-with-mysqld-ldflags=-all-static
Linux 2.4.xx x86_64 (AMD64) com gcc 3.2.1
CXX=gcc ./configure --prefix=/usr/local/mysql -
-with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --disable-shared
Instalao do MySQL
78
Sun Solaris 8 x86 com gcc 3.2.3
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXX-
FLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -
fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql
--localstatedir=/usr/local/mysql/data -
-libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex -
-enable-thread-safe-client --enable-local-infile -
-disable-shared --with-innodb
Sun Solaris 8 sparc com gcc 3.2
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXX-
FLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -
fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql
--with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --enable-assembler --with-named-z-libs=no -
-with-named-curses-libs=-lcurses --disable-shared
Sun Solaris 8 sparc 64bit com gcc 3.2
CC=gcc CFLAGS="-O3 -m64 -fno-omit-frame-pointer" CXX=gcc CXX-
FLAGS="-O3 -m64 -fno-omit-frame-pointer -felide-constructors -
fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql
--with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --enable-assembler --with-named-z-libs=no -
-with-named-curses-libs=-lcurses --disable-shared
Sun Solaris 9 sparc com gcc 2.95.3
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXX-
FLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -
fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql
--with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --enable-assembler -
-with-named-curses-libs=-lcurses --disable-shared
Sun Solaris 9 sparc com cc-5.0 (Sun Forte 5.0)
CC=cc-5.0 CXX=CC ASFLAGS="-xarch=v9" CFLAGS="-Xa -xstrconst -mt
-D_FORTEC_ -xarch=v9" CXXFLAGS="-noex -mt -D_FORTEC_ -xarch=v9"
./configure --prefix=/usr/local/mysql -
-with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --enable-assembler --with-named-z-libs=no -
-enable-thread-safe-client --disable-shared
IBM AIX 4.3.2 ppc com gcc 3.2.3
CFLAGS="-O2 -mcpu=powerpc -Wa,-many " CXX=gcc CXXFLAGS="-O2 -
mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions -
fno-rtti" ./configure --prefix=/usr/local/mysql -
-with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --with-named-z-libs=no --disable-shared
IBM AIX 4.3.3 ppc com xlC_r (IBM Visual Age C/C++ 6.0)
CC=xlc_r CFLAGS="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192"
CXX=xlC_r CXXFLAGS ="-ma -O2 -qstrict -qoptimize=2 -qmax-
mem=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
Instalao do MySQL
79
IBM AIX 5.1.0 ppc com gcc 3.3
CFLAGS="-O2 -mcpu=powerpc -Wa,-many" CXX=gcc CXXFLAGS="-O2 -
mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions -
fno-rtti" ./configure --prefix=/usr/local/mysql -
-with-extra-charsets=complex --with-server-suffix="-pro" -
-enable-thread-safe-client --enable-local-infile -
-with-named-z-libs=no --disable-shared
HP-UX 10.20 pa-risc1.1 com gcc 3.1
CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc CXX-
FLAGS="-DHPUX -I/opt/dce /include -felide-constructors -
fno-exceptions -fno-rtti -O3 -fPIC" ./configure -
-prefix=/usr/local/mysql --with-extra-charsets=complex -
-enable-thread-safe-client --enable-local-infile --with-pthread
--with-named-thread-libs=-ldce --with-lib-ccflags=-fPIC -
-disable-shared
HP-UX 11.11 pa-risc2.0 64 bit com aCC (HP ANSI C++ B3910B A.03.33)
CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure -
-prefix=/usr/local/mysql --with-extra-charsets=complex -
-enable-thread-safe-client --enable-local-infile -
-disable-shared
HP-UX 11.11 pa-risc2.0 32bit com aCC (HP ANSI C++ B3910B A.03.33)
CC=cc CXX=aCC CFLAGS="+DAportable" CXXFLAGS="+DAportable"
./configure --prefix=/usr/local/mysql -
-localstatedir=/usr/local/mysql/data -
-libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex -
-enable-thread-safe-client --enable-local-infile -
-disable-shared --with-innodb
Apple Mac OS X 10.2 powerpc com gcc 3.1
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXX-
FLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -
fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql
--with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --disable-shared
FreeBSD 4.7 i386 com gcc 2.95.4
CFLAGS=-DHAVE_BROKEN_REALPATH ./configure -
-prefix=/usr/local/mysql --with-extra-charsets=complex -
-enable-thread-safe-client --enable-local-infile -
-enable-assembler --with-named-z-libs=not-used --disable-shared
QNX Neutrino 6.2.1 i386 with gcc 2.95.3qnx-nto 20010315
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXX-
FLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -
fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql
--with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --disable-shared
Os seguintes binrios so contrudos em sistemas de terceiros gentilmente cedidos para a MySQL
AB pou outros usurios. Pou favor, note que eles s so fornecidos como cortesia. Uma vez que a
MySQL AB no tem total controle sobre estes sistemas, ns podemos fornecer apenas suporte limi-
tado para os binrios construdos nestes sistemas.
Instalao do MySQL
80
SCO Unix 3.2v5.0.6 i386 com gcc 2.95.3
CFLAGS="-O3 -mpentium" LDFLAGS=-static CXX=gcc CXXFLAGS="-O3 -
mpentium -felide-constructors" ./configure -
-prefix=/usr/local/mysql --with-extra-charsets=complex -
-enable-thread-safe-client --enable-local-infile -
-with-named-z-libs=no --enable-thread-safe-client -
-disable-shared
SCO OpenUnix 8.0.0 i386 com CC 3.2
CC=cc CFLAGS="-O" CXX=CC ./configure --prefix=/usr/local/mysql -
-with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --with-named-z-libs=no -
-enable-thread-safe-client --disable-shared
Compaq Tru64 OSF/1 V5.1 732 alpha com cc/cxx (Compaq C V6.3-029i / DIGITAL C++
V6.1-027)
CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast -
inline speed -speculate all" CXX="cxx -pthread" CXXFLAGS="-O4 -
ansi_alias -fast -inline speed -speculate all -noexceptions -
nortti" ./configure --prefix=/usr/local/mysql -
-with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --with-prefix=/usr/local/mysql -
-with-named-thread-libs="-lpthread -lmach -lexc -lc" -
-disable-shared --with-mysqld-ldflags=-all-static
SGI Irix 6.5 IP32 com gcc 3.0.1
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXXFLAGS="-O3 -
fno-omit-frame-pointer -felide-constructors -fno-exceptions -
fno-rtti" ./configure --prefix=/usr/local/mysql -
-with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --disable-shared
FreeBSD 5.0 sparc64 com gcc 3.2.1
CFLAGS=-DHAVE_BROKEN_REALPATH ./configure -
-prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data -
-libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex -
-enable-thread-safe-client --enable-local-infile -
-disable-shared --with-innodb
As seguintes opes de compilao foram usadas nos pacotes binrios que a MySQL AB costumava
fornecer no passado. Estes binrios no so mais atualizados, mas as opes de compilao so
mantidas aqui com o propsito de referncia.
Linux 2.2.xx sparc com egcs 1.1.2
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXX-
FLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -
fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql
--with-extra-charsets=complex --enable-thread-safe-client -
-enable-local-infile --enable-assembler --disable-shared
Linux 2.2.x com x686 com gcc 2.95.2
CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -
felide-constructors -fno-exceptions -fno-rtti" ./configure -
-prefix=/usr/local/mysql --enable-assembler -
Instalao do MySQL
81
-with-mysqld-ldflags=-all-static --disable-shared -
-with-extra-charsets=complex
SunOS 4.1.4 2 sun4c com gcc 2.7.2.1
CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" ./configure -
-prefix=/usr/local/mysql --disable-shared -
-with-extra-charsets=complex --enable-assembler
SunOS 5.5.1 (e acima) sun4u com egcs 1.0.3a ou 2.90.27 ou gcc 2.95.2 e mais novo
CC=gcc CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -
fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql
--with-low-memory --with-extra-charsets=complex -
-enable-assembler
SunOS 5.6 i86pc com gcc 2.8.1
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure -
-prefix=/usr/local/mysql --with-low-memory -
-with-extra-charsets=complex
BSDI BSD/OS 3.1 i386 com gcc 2.7.2.1
CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql
--with-extra-charsets=complex
BSDI BSD/OS 2.1 i386 com gcc 2.7.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure -
-prefix=/usr/local/mysql --with-extra-charsets=complex
AIX 2 4 com gcc 2.7.2.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure -
-prefix=/usr/local/mysql --with-extra-charsets=complex
Qualquer que tenha mais opes otimizadas para qualquer das configuraes listadas acima pode
sempre envi-los para a lista de email ``internals'' do MySQL. See Seco 1.7.1.1, As Listas de
Discusso do MySQL.
Distribuies RPM que anteceda o MySQL verso 3.22 so contribuies dos usurios. Os RPMs
gerados por ns da MySQL AB s comearam a ser fornecidos a partir da verso 3.22 do MySQL.
Se voc deseja compilar uma verso para depurao do MySQL, voc deve adicionar -
-with-debug ou --with-debug=full para as linhas de configurao acima e remover qual-
quer opo -fomit-frame-pointer.
Para distribuies do Windows, por favor, veja Seco 2.1.1, Instalando o MySQL no Windows.
2.2.9. Instalando uma Distribuio Binria do MySQL
Este captulo cobre a instalao da distribuio binria do MySQL (.tar.gz Archives) para vrias
plataformas (veja MySQL binaries para uma lista detalhada).
Em adio a estes pacotes genricos, tambm oferecemos binrios em formatos de pacote especfi-
cos da plataforma para plataformas selecionadas. Veja Seco 2.1, Instalao rpida padro do
MySQL para mais informaes sobre como\ intal-los.
As distribuies genricas do MySQL esto empacotados com arquivos GNU tar com compactao
gzip (.tar.gz). Voc precisa das seguintes ferramentas para instalar um distribuio binria do
Instalao do MySQL
82
MySQL:
GNU gunzip para descompactar a distribuio.
Um tar razovel para descompactar a distribuio. Sabemos que o GNU tar funciona. Algu-
mas 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 insta-
lar 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 aju-
daro os outros a solucionar o seu problema. Se no usar mysqlbug, voc ter diminuda a proba-
bilidade 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> groupadd mysql
shell> useradd -g mysql mysql
shell> cd /usr/local
shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf -
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> scripts/mysql_install_db
shell> chown -R root .
shell> chown -R mysql data
shell> chgrp -R mysql .
shell> bin/mysqld_safe --user=mysql &
Se a sua verso do MySQL mais antiga que a 4.0, substitua bin/safe_mysqld por bin/
mysqld_safe no comando final.
Voc pode adicionar novos usurios usando o script bin/mysql_setpermission se voc ins-
talar 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 instru-
es, 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 ser-
vidor mysqld extendido. Note que todos os binrios so contrudos a partir da mesma distri-
buio fonte do MySQL.
4. Adicione um usurio e grupo para o mysqld ser executado:
Instalao do MySQL
83
shell> groupadd mysql
shell> useradd -g mysql mysql
Estes comandos adicionam o grupo mysql e o usurio mysql. A sintaxe para useradd e
groupadd podem diferir um pouco nas diversas verses de Unix. Eles tambmpodem ser
chamado adduser e addgroup. Voc pode desejar criar o grupo e usurio com outro nome,
diferente de mysql.
5. Chame o diretrio no qual se pretende fazer a instalao:
shell> cd /usr/local
6. Descompacte a distribuio, que criar o diretrio de instalao. Ento crie um link simblico
para aquele diretrio:
shell> gunzip < /path/to/mysql-VERSO-SO.tar.gz | tar xvf -
shell> ln -s full-path-to-mysql-VERSO-SO mysql
O primeiro comando cria um diretrio chamado mysql-VERSO-SO. O segundo comando
cria um link simblico para o diretrio. Isto torna a referncia ao diretrio de instalao mais
fcil, chamado como /usr/local/mysql.
7. Altere para p diretrio de instalao:
shell> cd mysql
Voc encontrar diversos arquivos e subdiretrios no diretrio mysql. O mais importante para
propsitos de instalao so os subdiretrios bin e scripts.
bin
Este diretrio contm o programa cliente e o servidor. Voc deve adicionar o caminho com-
pleto deste diretrio a sua varivel de ambiente PATH e assim a sua shell encontrar o pro-
grama 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 da-
dos 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 dife-
rente do padro, voc deve alterar a localizao para onde o mysqlaccess espera encontrar
o cliente mysql. Edite o script bin/mysqlaccess aproximadamente na linha 18. Procure
pela linha que se parece com a apresentada abaixo:
$MYSQL = '/usr/local/bin/mysql'; # path to mysql executable
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 mysq-
laccess.
9. Crie as tabelas de permisso do MySQL (necessrio apenas se voc no tiver instalado o
MySQL anteriormente):
shell> scripts/mysql_install_db
Note que as verses mais antigas que a 3.22.10 iniciam o servidor MySQL quando voc execu-
Instalao do MySQL
84
ta o mysql_install_db. Isto no ocorre mais.
10. Altere o proprietrio dos binrios para o root e o proprietrio do diretrio de dados para o
usurio com o quel voc executar o mysqld:
shell> chown -R root /usr/local/mysql/.
shell> chown -R mysql /usr/local/mysql/data
shell> chgrp -R mysql /usr/local/mysql/.
O primeiro comando altera o atributo owner dos arquivos para o usurio root, o segundo al-
tera o atributo owner do diretrio de dados para o usurio mysql e o terceiro altera o atributo
group para o grupo mysql.
11. Se voc quiser instalar o suporte para a interface Perl DBI/DBD, veja Seco 2.7, Comentrios
de Instalao do Perl.
12. Se voc desejasse que o MySQL seja iniciado automaticamente quando voc iniciar a sua m-
quina, voc pode copiar support-files/mysql.server para o local onde o seu sistema
tem os arquivos de inicializao. Mais informaes podem ser encontradas no script sup-
port-files/mysql.server e em Seco 2.4.3, Inicializando e parando o MySQL auto-
maticamente..
Depois de tudo estar descompactado e instalado, voc deve inicializar e testar a sua distribuio.
Voc pode iniciar o servidor MySQL com o seguinte comando:
shell> bin/mysqld_safe --user=mysql &
Se a sua verso do MySQl for mais antiga do que a 4.0, substitua bin/safe_mysqld por bin/
mysqld_safe no comando.
Agora prossiga com Seco 4.8.2, mysqld-safe, o wrapper do mysqld e See Seco 2.4,
Configuraes e Testes Ps-instalao.
2.3. Instalando uma distribuio com fontes
do MySQL
Antes de voc continuar com as instalaes dos fontes, confira antes se nosso binrio est disponvel
para sua plataforma e se ela funcionar para voc. Ns colocamos muito esforo para ter certeza que
nossos binrios so contrudos com as melhores opes possveis.
Voc precisa das seguintes ferramentas para contruir e instalar o MySQL a partir do cdigo fonte:
GNU gunzip para descompactar a distribuio.
Um tar razovel para desempacotar a distribuio. Sabe-se que o GNU tar funciona. Algu-
mas 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 insta-
lar 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 al-
guns arquivos C++ perfeitamente corretos, como o sql/sql_base.cc. Se voc possui so-
mente o gcc 2.7.x voc deve atualiza-lo para conseguir compilar o MySQL. gcc 2.8.1 tam-
bm conhecido por ter problemas em algumas plataformas portanto ele deve ser evitado se exis-
tir um novo compilador para a plataforma.
Instalao do MySQL
85
gcc >= 2.95.2 recomendado quando compilar o MySQL Verso 3.23.x.
Um bom programa make. GNU make sempre recomendado e algumas vezes necessrio. Se
voc tiver problemas, recomendamos tentar o GNU make 3.75 ou mais novo.
Se voc estiver usando uma verso recente de gcc, recente o bastante para entender a opo -
fno-exceptions, MUITO IMPORTANTE que voc a use. De outra forma, voc pode com-
pilar um binrio que quebra randomicamente. Ns tambm recomendamos que voc use -
felide-constructors e -fno-rtti juntas com -fno-exception. Se estiver com dvi-
das, 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 desem-
pacotar a distribuio. See Seco 1.7.1.3, Como relatar erros ou problemas.
2.3.1. Viso geral da instalao rpida
Os comandos bsicos que voc deve executar para instalar o MysQL a partir da distribuio fonte
so:
shell> groupadd mysql
shell> useradd -g mysql mysql
shell> gunzip < mysql-VERSION.tar.gz | tar -xvf -
shell> cd mysql-VERSION
shell> ./configure --prefix=/usr/local/mysql
shell> make
shell> make install
shell> scripts/mysql_install_db
shell> chown -R root /usr/local/mysql
shell> chown -R mysql /usr/local/mysql/var
shell> chgrp -R mysql /usr/local/mysql
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> /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 remo-
ver 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.
Instalao do MySQL
86
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. Adicione um usurio e grupo para o mysql executar assim:
shell> groupadd mysql
shell> useradd -g mysql mysql
Estes comandos adicionam o grupo mysql e o usurio mysql. A sintaxe para useradd e
groupadd podem mudar um pouco em diferentes verses de Unix. Elas podem tambm ser
chamadas adduser e addgroup. Voc pode escolher outros nomes para o usurio e grupo
em vez de mysql.
5. Descompacte a distribuio para o diretrio corrente:
shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf -
Este comando cria um diretrio com o nome mysql-VERSION.
6. Mude para o diretrio da distribuio descompactada:
shell> cd mysql-VERSION
Note que agora voc deve configurar e construir o MySQL a partir deste diretrio raiz da distri-
buio. Voc no pode constru-lo em um diretrio diferente.
7. Configure o release e compile tudo:
shell> ./configure --prefix=/usr/local/mysql
shell> make
Quando voc executar configure, voc pode desejar especificar algumas opes. Execute
./configure --help para uma lista das opes. Seco 2.3.3, Opes tpicas do con-
figure , discute algumas das opes mais usadas.
Se o configure falhar, e voc for enviar uma mensagem para lista de email do MySQL para
pedir ajuda, por favor, inclua qualquer linhas de config.log que voc acha que pode ajudar
a resolver o problema. Tambm inclua as ltimas linhas da sada de configure se o con-
figure abortar. Envie o relatrio de erros usando o script mysqlbug. See Seco 1.7.1.3,
Como relatar erros ou problemas.
Se a compilao falhar, veja Seco 2.3.5, Lidando com Problemas de Compilao, para uma
ajuda com um varios problemas comuns.
8. Instalar tudo:
shell> make install
Instalao do MySQL
87
Voc deve executar este comando como root.
9. Crie as tabelas de permisses do MySQL (necessrias s se voc no tiver instalado o MySQL
anteriormente):
shell> scripts/mysql_install_db
Note que as verses do MySQL anteriores verso 3.22.10 iniciam o servidor MySQL quando
voc executa mysql_install_db. Isto no acontece mais!
10. Altere o dono dos binrios para root e do diretrio dados para o usurio que ir executar o
mysqld:
shell> chown -R root /usr/local/mysql
shell> chown -R mysql /usr/local/mysql/var
shell> chgrp -R mysql /usr/local/mysql
O primeiro comando altera o atributo de proriedade dos arquivos para o usurio root, o
segundo altera o atributo de propriedade do diretrio de dados para o usurio mysql, e o
terceiro altera o atributo de grupo para o grupo mysql.
11. Se voc deseja instalar suporte para a interface Perl DBI/DBD, veja Seco 2.7, Comentrios
de Instalao do Perl.
12. Se voc deseja que o MySQL inicie automaticamente quando voc ligar sua mquina, voc po-
de copiar support-files/mysql.server para o local onde seu sistema tem seus arqui-
vos de incializao. Mais informaes podem ser encontradas no prprio script support-fi-
les/mysql.server e em Seco 2.4.3, Inicializando e parando o MySQL automatica-
mente..
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 algu-
ma informao no arquivo diretrio-dados-mysql/'nome_maquina'.err. A razo po-
de ser que voc j possua outro servidor mysqld sendo executado. See Seco 4.2, Executando
Mltiplos MySQL Servers na Mesma Mquina.
See Seco 2.4, Configuraes e Testes Ps-instalao.
2.3.2. Aplicando patches
Algumas vezes patches aparecem na lista de mensagens ou so colocados na rea de patches do
MySQL. (http://www.mysql.com/downloads/patches.html).
Para aplicar um patch da lista de mensagens, salve a mensagem em que o patch aparece em um ar-
quivo, mude para o diretrio raiz da sua distribuio fonte de seu MySQL e execute estes comandos:
shell> patch -p1 < patch-file-name
shell> rm config.cache
shell> make clean
Patches do site FTP so distribudos como arquivos texto ou como arquivos compactados com
gzip. Aplique um patch no formato texto como mostrado acima para patches da lista de mensa-
Instalao do MySQL
88
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 come-
ando com o passo ./configure. Depois de executar o passo make install, reinicie seu ser-
vidor MySQL.
Voc pode precisar derrubar algum servidor atualmente em execuo antes de executar make
install. (Use mysqladmin shutdown para fazer isto.) Alguns sistemas no lhe permitem
instalar uma nova verso do programa se ele substitui agum que estiver em execuo.
2.3.3. Opes tpicas do configure
O script configure fornece uma grande gama de controle sobre como voc configura sua distri-
buio MySQL. Normalmente voc faz isto usando opes na linha de comando do configure.
Voc tambm pode alterar configure usando algumas variveis de ambiente. See Apndice F,
Variveis de Ambientes do MySQL. Para uma lista de opes suportadas pelo configure, execute
este comando:
shell> ./configure --help
Algumas das opes mais usadas normalmente com o configure esto descritas a seguir:
Para compilar apenas as bibliotecas clientes do MySQL e programas clientes e no o servidor,
use a opo --without-server:
shell> ./configure --without-server
Se voc no possui um compilador C++, mysql no ir compilar (ele o programa cliente que
exige C++). Neste caso, voc pode remover o cdigo no configure que testa pelo compilador
C++ e executar ./configure com a opo --without-server. O passo da compiao
continuar tentaindo construir mysql, mas voc pode ignorar as advertncias sobre
mysql.cc. (Se o make parar, tente make -k para continuar com o resto da compilao mes-
mo se erros ocorrerem.)
Se voc quiser uma biblioteca embutida do MySQL (libmysqld.a) voc deve usar a opo -
-with-embedded-server.
Se voc no deseja que seus arquivos de logs e diretrios de bancos de dados fiquem localizados
sobre /usr/local/var, use o comando configure; algo parecido com um destes:
shell> ./configure --prefix=/usr/local/mysql
shell> ./configure --prefix=/usr/local \
--localstatedir=/usr/local/mysql/data
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 diret-
rio 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 Sec-
o 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 di-
ferente do padro (normalmente no diretrio /tmp ou /var/run) use o comando configu-
re da seguinte forma:
Instalao do MySQL
89
shell> ./configure --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock
Perceba que o arquivo fornecido deve ter um caminho absoluto ! Voc tambm pode, mais tarde,
alterar a localizao de mysql.sock usando os arquivos de opes do MySQL. See Sec-
o A.4.5, Como Proteger ou AlterarHow to Protect or Change the MySQL Socket File /
tmp/mysql.sock.
Se voc deseja compilar programas linkeditados estaticamente (por exemplo, para criar uma dis-
tribuio 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 insta-
ladas, 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 CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors"
egcs 1.0.3a CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions
-fno-rtti"
gcc 2.95.2 CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -
mpentiumpro \ -felide-constructors -fno-exceptions -fno-rtti"
pgcc 2.90.29
or newer
CFLAGS="-O3 -mpentiumpro -mstack-align-double" CXX=gcc \ CXX-
FLAGS="-O3 -mpentiumpro -mstack-align-double -felide-constructors \ -
fno-exceptions -fno-rtti"
Na maioria dos casos voc pode obter um binrio MySQL razoavelmente otimizado usando as
opes acima e adicionar as seguintes opes para a linha de configurao:
--prefix=/usr/local/mysql --enable-assembler \
--with-mysqld-ldflags=-all-static
A linha completa de configurao dever ser, em outras palavras, algo como o seguinte para to-
das 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 compila-
dos 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
Instalao do MySQL
90
MySQL.
Se a construo falhar e produzir erros sobre seu compilador ou linkeditor no estarem aptos pa-
ra criarem a biblioteca compartilhada libmysqlclient.so.r# ('r#' um nmero de ver-
so), voc pode evitar este problema fornecendo a opo --disable-share para o confi-
gure. 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 Con-
junto 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 de-
ve 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 caracte-
res adicionais deve ser compilado no servidor.
Aqui LISTA uma lista de conjuntos de caracteres separados por espaos, complex para in-
cluir 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 so-
bre 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-sa-
fe 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 es-
pecficos de sistemas neste manual. See Seco 2.6, Notas especficas para os Sistemas Opera-
cionais.
2.3.4. Instalando pela rvore de fontes do desenvolvi-
mento
Instalao do MySQL
91
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 preci-
sar do Bitkeeper 3.0 ou posterior para acessar nosso repositrio.
2. Siga as instrues para instal-lo.
3. Depois que o BitKeeper estiver instalado, primeiro v ao diretrio no qual voc deseja traba-
lhar e ento use um dos seguintes comandos para clonar o ramo da verso MySQL de sua esco-
lha:
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 Bit-
Keeper 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:
Instalao do MySQL
92
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 bi-
son.
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 ar-
quitetura 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 usa-
das pelo seu servidor em produo.
6. Seja rgido com sua nova instalao e tente fazer com que os novos recursos falhem. Inicie exe-
cutando 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 infor-
me 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 d-
vida, no hesite em enviar um e-mail para lista de email ``internals'' do MySQL. See Sec-
o 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.
Instalao do MySQL
93
10. BitKeeper tem um timo utilitrio de ajudar que voc pode acessar via bk helptool.
11. Note que qualquer commit (bk ci ou bk citool) ir disparar o envio da mensagem com as
alteraes para nossa lista de email internos, bem como a submisso openlogging.org usual
apenas com os comentrios da alterao. Geralmente voc no precisar usar commit (j que o
rvore pblica no permitir bk push), mas prefervel usar o mtodo bk diffs descrito
arteriormente.
Voc tambm pode procurar alteraes, comentrios e cdigo fonte online procurando por ex.
http://mysql.bkbits.net:8080/mysql-4.1 para MySQL 4.1.
O manual est em uma rvore separad que pode ser clonada com:
shell> bk clone bk://mysql.bkbits.net/mysqldoc mysqldoc
Existe tambm um rvore pblica do BitKeeper para o MySQL Control Center e Connector/ODBC.
Eles podem ser clonados da seguintes forma, respectivamente:
Para clonar o MySQL Control center, use o seguinte comando:
shell> bk clone http://mysql.bkbits.net/mysqlcc mysqlcc
Para clonar o Connector/ODBC, use o seguinte comando:
shell> bk clone http://mysql.bkbits.net/myodbc3 myodbc3
2.3.5. Lidando com Problemas de Compilao
Todos programas MySQL compilam de forma limpa sem alertas no solaris usando gcc. Em outros
sistemas, alertas podem ocorrer devido a diferenas em arquivos include dos sistemas. Veja Sec-
o 2.3.6, Notas MIT-pthreads para avisos que podem ocorrer usando MIT-pthreads. Para outros
problemas, confira a lista abaixo.
A soluo para vrios problemas envolve reconfigurao. Se voc precisa reconfigurar, faa notas
do seguinte:
Se configure executado depois dele j ter sido chamado, ele pode usar informao que foi
colhida durante a chamada anterior. Esta informao armazenada no arquivo
config.cache. Quando configure inicia, ele procura por este arquivo, l seu contedo, se
ele existir, assumindo que aquela informao continua correta. Essa conjetura invlida quando
voc reconfigurar.
Cada vez que voc executa configure, voc deve executar make de novo para recompilar.
Entretanto, voc pode desejar remover primeiro antigos arquivos objeto de construes anterio-
res, 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:
Instalao do MySQL
94
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 hard-
ware 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 com-
pilao, 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, vo-
c 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 li-
gao 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)'
Instalao do MySQL
95
../mysys/libmysys.a(raid.o)(.text+0xdd): In function `my_raid_create':
: undefined reference to `operator delete(void*)'
../mysys/libmysys.a(raid.o)(.text+0x129): In function `my_raid_open':
: undefined reference to `operator new(unsigned)'
../mysys/libmysys.a(raid.o)(.text+0x189): In function `my_raid_open':
: undefined reference to `operator delete(void*)'
../mysys/libmysys.a(raid.o)(.text+0x64b): In function `my_raid_close':
: undefined reference to `operator delete(void*)'
collect2: ld returned 1 exit status
Se sua compilao falhar com erros, como um dos seguintes, voc deve atualizar sua verso de
make para GNU make:
making all in mit-pthreads
make: Fatal error in reader: Makefile, line 18:
Badly formed macro assignment
or
make: file `Makefile' line 18: Must be a separator (:
or
pthread.h: No such file or directory
O Solaris e o FreeBSD so conhecidos por terem alguns problemas com o make.
O GNU make verso 3.75 ir funcionar.
Se voc deseja definir algumas opes que devem ser usadas pelo seu compilador C ou C++,
adicione as opes para as variveis de ambiente CFLAGS e CXXFLAGS. Voc pode tambm es-
pecificar os nomes do compilador a ser usado da mesma forma utilizando CC e CXX. Exemplo:
shell> CC=gcc
shell> CFLAGS=-O3
shell> CXX=gcc
shell> CXXFLAGS=-O3
shell> export CC CFLAGS CXX CXXFLAGS
Olhe em Seco 2.2.8, Binrios MySQL compilados pela MySQL AB para uma lista de defi-
nio 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 con-
figure no detectou corretamente o tipo do ltimo argumento para accept(), getsock-
name() 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 es-
tas 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 con-
fig.h.)
Instalao do MySQL
96
O arquivo sql_yacc.cc gerado pelo sql_yacc.yy. Normalmente o processo de constru-
o 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 Sec-
o 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) pare-
cido com o seguinte:
libmysql.c:1329: warning: passing arg 5 of `gethostbyname_r' from incompatible pointer type
libmysql.c:1329: too few arguments to function `gethostbyname_r'
libmysql.c:1329: warning: assignment makes pointer from integer without a cast
make[2]: *** [libmysql.lo] Error 1
Por padro, o script configure tenta determinar o nmero correto de argumentos usando o
compilador GNU C++ g++. Ele testa os resultados errados permitidos, se o g++ no est insta-
lado. Existem dois modos de contornar este problema:
Certifique-se de que o GNU C++ g++ est instalado. Em algumas distribuies Linux, o pa-
cote exigido chamado gpp, em outro ele chamado gcc-c++.
Use o gcc como o seu compilador C++ configurando a variavel de ambiente CXX para
gcc:
export CXX="gcc"
Note que voc precisa executar o configure novamente aps isto.
2.3.6. Notas MIT-pthreads
Esta seo descreve alguns dos detalhes envolvidos no uso de MIT-pthreads.
Note que no Linux voc NO deve usar MIT-pthreads mas instalar LinuxThreads! See Seco 2.6.2,
Notas Linux (Todas as verses).
Se seu sistema no fornece suporte nativo a thread, voc precisar construir o MySQL usando o pa-
cote MIT-pthreads. Isto inclui antigos sistemas FreeBSD, SunOS 4.X, Solaris 2.4 e anteriores entre
outros. See Seco 2.2.3, Sistemas Operacionais suportados pelo MySQL.
Note que a partir do MySQL 4.0.2, MIT-pthreads no fazem mais parte da distribuio fonte. Se vo-
c precisar deste pacote, voc precisa fazer o download dele separadamente em
http://www.mysql.com/Downloads/Contrib/pthreads-1_60_beta6-mysql.tar.gz
Depois do download, extraia este arquivo fonte no nvel mais alto do diretrio de fontes do MySQL.
Ele criar um novo subdiretrio mit-pthreads.
Na maioria dos sitemas, voc pode forar o uso de MIT-pthreads executando o configure
com a opo --with-mit-threads:
shell> ./configure --with-mit-threads
Instalao do MySQL
97
Construo em um diretrio no fonte no suportado com o uso de MIT-pthreads, porque ns
queremos minimizar nossas alteraes para este cdigo.
As verificaes que determinam se MIT-pthreads ser usado ou no, ocorrer somente durante a
parte do processo de configurao que trata com o cdigo do servidor. Se voc configurou a dis-
tribuio 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. Co-
mo os sockets Unix no funcionam sob MIT-pthreads, isto significa que voc precisar usar -h
ou --host quando executar programas clientes.
Quando o MySQL compilado usando MIT-pthreads, travas de sistema so desabilitadas por
padro por razes de performance. Voc pode dizer ao servidor para usar travas de sistema com
a opo --external-locking. Isto s necessrio se voc quiser executar dois servidores
MySQL no mesmo diretrio de dados (no que no recomendado)
Algumas vezes o comando pthread bind() falha ao ligar a um socket sem nenhuma mensagem
de erro (pelo menos no Solaris). O resultado que todas conexes ao servidor falham. Por exem-
plo:
shell> mysqladmin version
mysqladmin: connect to server at '' failed;
error: 'Can't connect to mysql server on localhost (146)'
A soluo para isto matar o servidor mysqld e reinici-lo. Isto s aconteceu conosco quando
foramos uma queda do servidor e fizemos uma reinicializao imediata.
Com MIT-pthreads, a chamada de sistema sleep() no interrompvel com SIGINT (break).
Isto s percebido quando voc executa mysqladmin --sleep. Voc deve esperar pela
chamada sleep() para terminar, antes da interruo ser servida e o processo parar.
Na ligao, voc pode receber mensagens de alerta como estes (pelo menos no Solaris); elas po-
dem ser ignoradas:
ld: warning: symbol `_iob' has differing sizes:
(file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
file /usr/lib/libc.so value=0x140);
/my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
ld: warning: symbol `__iob' has differing sizes:
(file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
file /usr/lib/libc.so value=0x140);
/my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
Alguns outros alertas tambm podem ser ignorados:
implicit declaration of function `int strtoll(...)'
implicit declaration of function `int strtoul(...)'
No colocamos readline para funcionar com MIT-pthreads. (Isto no necessrio, mas pode
ser interessante para alguns.)
2.3.7. Instalando o MySQL a partir do Fonte no Win-
dows
Estas instrues descrevem como construir o binrio do MySQL a partir do fonte paras verses 4.1 e
acima no Windows. As instrues so fornecidas para construir binrios a partir de uma distribuio
fonte padro ou a partir da rvore do BitKeeper que contm o fonte do desenvolvimento mais atuais.
Nota: As instrues neste documento esto restritas aos usurios que queiram testar o MySQL no
Instalao do MySQL
98
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 par-
tir de um fonte. Normalmente melhor usar uma distribuio binria precompilada do MySQL que
construda especificamente para desempenho otimizado no Windows pela MySQL AB. Instrues
para instalar uma distribuio binria est disponvel em Seco 2.1.1, Instalando o MySQL no
Windows.
Para construir o MySQL no Windows a partir do fonte, voc precisa dos seguintes compiladores e
recursos disonveis em seu sistema Windows:
Compilador VC++ 6.0 (atualizado com o SP 4 ou 5 e pacote Pre-processador) O pacote Pre-
processador necessrio para a macro assembler. Mais detalhes em:
http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/faq.aspx.
Aproximadamente 45 MB de espao em disco.
64 MB de RAM
Voc tambm precisar de um distribuio fonte para o Windows. Existem dois modos de conseguir
uma distribuio fonte do MySQL verso 4.1 e acima:
1. Obtenha um pacote de uma distribuio fonte pela MySQL AB para a verso do MySQL que
voc est particularmente interessado. Distribuies fontes empacotadas esto disponveis para
verses distribudas do MySQ e podem ser obtidas em http://www.mysql.com/downloads/.
2. Voc pode empacotar um distribuio fonte voc mesmo a partir da ultima rvore fonte de de-
senvolvimento do BitKeeper. Se voc planeja fazer isto, voc deve criar o pacote em um siste-
ma Unix e ento transfr-lo para seu sistema Windows. (A razo para isto que alguns dos pas-
sos de configurao e construo exigem ferramentas que funcionam apenas no Unix.) A abor-
dagem do BitKeeper, exige:
Um sistema executando Unix ou um sistema tipo Unix, como o Linux
BitKeeper 3.0 instalado neste sistema. Voc pode obter o BitKeeper em
http://www.bitkeeper.com/.
Se voc estiver usando uma distribuio fonte do Windows, voc pode ir diretamente para Sec-
o 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 Desen-
volvimento.
Se voc encontrar alguma coisa que no est funcionando como esperado, ou tiver sugestes sobre o
mode de melhorar o processo de construo atual no Windows, envie uma mensagem para a lista de
email win32. See Seco 1.7.1.1, As Listas de Discusso do MySQL.
2.3.7.1. Construindo o MySQL Usando VC++
Nota: O MySQL 4.1 e arquivos do espeo de trabalho do VC++ so compatveis com o Microsoft
Visual Studio 6.0 e as edies acima (7.0/.NET) e testados pela equipe da MySQL AB antes de cada
distribuio.
Siga este procedimento para construir o MySQL:
1. Crie um diretrio de trabalho (ex.: workdir).
2. Descompacte a distribuio fonte no diretrio mencionado acima usando Winzip ou outra fer-
ramenta que possa ler arquivos .zip.
3. Inicie o compilador VC++ 6.0.
Instalao do MySQL
99
4. No menu File, selecione Open Workspace.
5. Abra o workspace mysql.dsw que voc encontrar no diretrio de trabalho.
6. No menu Build, selcione o menu Set Active Configuration.
7. Clique sobre a tela selecionada mysqld - Win32 Debug e clique OK.
8. Pressione F7 para iniciar a construo da depurao do servidor, bibliotecas e alguns aplicati-
vos clientes.
9. Compile as verses distribudas que voc desejar, do mesmo modo.
10. Verses depuradas dos programas e bibliotecas so colocados nos diretrios client_debug
e lib_debug. Verses liberadas dos programas e bibliotecas so colocados nos diretrios
client_release e lib_release. Note que se voc quiser construir tanto verses libera-
das 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 diret-
rio base e de dados do MySQL seja C:\mysql e C:\mysql\data por padro. Se voc qui-
ser testar o seu servidor usando o diretrio raiz de uma rvore fonte e seu diretrio de dados co-
mo 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, dependen-
do 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 for-
ma 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 \mysql
mkdir \mysql\bin
mkdir \mysql\data
mkdir \mysql\share
mkdir \mysql\scripts
Se voc quiser compilar outros clientes e lig-los ao MySQL, voc tambm deve criar diversos
diretrios adicionais:
mkdir \mysql\include
mkdir \mysql\lib
mkdir \mysql\lib\debug
mkdir \mysql\lib\opt
Se voc quiser fazer um benchamrk do MySQL, crie este diretrio:
mkdir \mysql\sql-bench
Instalao do MySQL
100
Benchmark exigem suporte Perl.
2. Copie do diretrio workdir para o diretrio c:\mysql os seguintes diretrios:
copy client_release\*.exe C:\mysql\bin
copy client_debug\mysqld.exe C:\mysql\bin\mysqld-debug.exe
xcopy scripts\*.* C:\mysql\scripts /E
xcopy share\*.* C:\mysql\share /E
Se voc quiser compilar outros clientes e lig-los ao MySQL, voc tambm deve fazer isto:
copy lib_debug\mysqlclient.lib C:\mysql\lib\debug
copy lib_debug\libmysql.* C:\mysql\lib\debug
copy lib_debug\zlib.* C:\mysql\lib\debug
copy lib_release\mysqlclient.lib C:\mysql\lib\opt
copy lib_release\libmysql.* C:\mysql\lib\opt
copy lib_release\zlib.* C:\mysql\lib\opt
copy include\*.h C:\mysql\include
copy 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 Sec-
o 2.1.1.3, Preparando o Ambiente MySQL do Windows.
2.3.7.2. Criando um Pacote Fonte do Windows a partir da ltima
Fonte de Desenvolvimento
Para construir o ltimo pacote fonte do Windows a partir da arvor fonte atual do BitKeeper, use as
seguintes instrues. Por favor, note que este procedimento deve ser realizado em um sistema exe-
cutando um sistema opercional Unix ou similar. (Sabe-se que este procedimento funciona bem com
o Linux, por exemplo.)
1. Clone a rvore fonte do BitKeeper para o MySQL (verso 4.1 ou acima, como desejado). Para
mais informaes sobre como clonar a rvore fonte veja as instrues em Seco 2.3.4,
Instalando pela rvore de fontes do desenvolvimento.
2. Configure e construa as distribuies para que voc tenha um binrio do servidor para traba-
lhar. 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 se-
guinte 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 Depura, sem criar o pacote
--tmp Especifica a localizao temporria
--suffix Nome de sufixo para o pacote
Instalao do MySQL
101
--dirname Nome do diretrio onde os arquivos so copiados (intermediario)
--silent No apresenta uma lista dos arquivos processados
--tar Cria um pacote tar.gz em vez de .zip
--help Mostra esta mensagem de ajuda
Por padro, make_win_src_distribution cria um arquivo zipado com o nome
mysql-VERSION-win-src.zip, onde VERSION representa a verso de sua rvore fonte
do MySQL.
4. Faa uma copia ou upload para a sua mquina o pacote fonte Windows que voc tiver criado.
Para compil-lo use as instrues em Seco 2.3.7.1, Construindo o MySQL Usando VC++.
2.4. Configuraes e Testes Ps-instalao
Uma vez instalado o MySQL (de uma distribuio binria ou fonte), voc deve inicializar as tabelas
de concesses, iniciar o servidor e ter certeza que o servidor est funcionando bem. Voc pode tam-
bm desejar que o servidor inicie e pare automaticamente quando seu sistema iniciar e desligar.
Normalmente voc instala as tabelas de concesses e inicia o servidor assim para instalaes basea-
das em uma distribuio fonte:
shell> ./scripts/mysql_install_db
shell> cd diretorio_instalao_mysql
shell> ./bin/mysqld_safe --user=mysql &
Para uma distribuio binria (sem ser pacotes RPM ou PKG), faa isto:
shell> cd diretorio_instalao_mysql
shell> ./bin/mysql_install_db
shell> ./bin/mysqld_safe --user=mysql &
O script mysql_install_db cria o banco de dados mysql que ir armazenar todos privilgios
do banco de dados, o banco de dados test que voc poder usar para testar o MySQL e tambm
entradas de privilgio para o usurio que usa o mysql_install_db e o usurio root. As estran-
das so criadas sem senhas. O script mysqld_safe inicia o servidor mysqld. (Se sua verso for
anterior a 4.0, use safe_mysqld em vez de mysqld_safe.)
mysql_install_db no ir sobrescrever nenhuma tabela de privilgios antiga, ento deve ser
seguro execut-lo em quaisquer circunstncias. Se voc no deseja ter o banco de dados test voc
pode remov-lo com mysqladmin -u root drop test depois de iniciar o servidor.
Testes so geralmente facilmente feitos de um diretrio raiz da distribuio MySQL. Para uma dis-
tribuio binria, este seu diretrio de instalao (normalmente algo como
/usr/local/mysql). Para uma distrubuio fonte, este o diretrio principal da sua rvore fon-
te do MySQL.
Nos comandos mostrados abaixo nesta seo e nas seguintes subsees, BINDIR o caminho para
a localizao na qual os programas como mysqladmin e mysqld_safe esto instalados. Para
uma distribuio binria este o diretrio bin. Para uma distribuio fonte, BINDIR provavel-
mente /usr/local/bin, a menos que voc especifique um diretrio de instalao diferente de /
usr/local quando voc executa configure. EXECDIR a localizao na qual o servidor
mysqld est instalado. Para uma distribuio binria, isto o mesmo que BINDIR. Para uma dis-
tribuio fonte, EXECDIR provavelmente /usr/local/libexec.
Os testes so descritos em detalhes abaixo:
1. Se necessrio, inicie o servidor mysqld e configure as tabelas de concesses iniciais contendo
os privilgios que determinam como os usurios esto permitidos a conectar ao servidor. Isto
Instalao do MySQL
102
feito normalmente com o script mysql_install_db:
shell> scripts/mysql_install_db
Normalmente, mysql_install_db precisa ser executado somente na primeira vez que voc
instala o MySQL. Portanto, se voc estiver atualizando uma instalao existente, voc pode pu-
lar este passo. (entretanto, mysql_install_db realmente seguro de usar e no ir atuali-
zar nenhuma tabela que j exista, ento se voc no tem certeza do que fazer, voc pode sem-
pre executar mysql_install_db.)
mysql_install_db cria seis tabelas (user, db, host, tables_priv, co-
lumns_priv e func) no banco de dados mysql. Uma descrio dos privilgios iniciais
fornecido em Seco 4.4.4, Configurando os Privilgios Iniciais do MySQL. De forma resu-
midao, estes privilgios permitem que o usurio root faa qualquer coisa no MySQL, e permi-
tem a qualquer um a criar ou usar bancos de dados com o nome de 'test' ou iniciando com
'test_' .
Se voc no configurar as tabelas de concesses, o seguinte erro ir aparecer no arquivo log
quando voc no iniciar o servidor:
mysqld: Can't find file: 'host.frm'
O erro acima pode tambm ocorrer com uma distribuio binria do MySQL se voc no inici-
ar o MySQL executando o ./bin/mysqld_safe! See Seco 4.8.2, mysqld-safe, o
wrapper do mysqld.
Voc deve precisar executar mysql_install_db como root. Entretanto, se voc preferir,
pode executar o servidor MySQL como um usurio (no-root) sem privilgios, desde que o
usurio possa ler e escrever arquivos no diretrio de banco de dados. Instrues para executar o
MySQL como um usurio sem privilgios detalhado em Seco A.3.2, Como Executar o
MySQL Como Um Usurio Normal
Se voc tiver problemas com o mysql_install_db, veja Seco 2.4.1, Problemas Execu-
tando o mysql_install_db.
Existem algumas alternativas para executar o script mysql_install_db como ele forne-
cido na distribuio MySQL:
Voc pode querer editar o mysql_install_db antes de execut-lo, para alterar os privi-
lgios iniciais que so instalados nas tabelas de concesses. Isto til se voc deseja insta-
lar 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 dire-
tamente.
possvel recriar as tabelas de permisses completamente depois delas j terem sido cria-
das. 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 Privil-
gios Iniciais do MySQL.
2. Inicie o servidor MySQL assim:
shell> cd diretorio_instalacao_mysql
shell> bin/mysqld_safe &
Instalao do MySQL
103
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 for-
necem 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 ver-
so 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 op-
o --help.
4. Verifique se voc pode desligar o servidor:
shell> BINDIR/mysqladmin -u root shutdown
5. Verifique que voc possa reiniciar o servidor. Faa isto usando mysqld_safe ou chamado o
mysqld diretamente. Por exemplo:
shell> BINDIR/mysqld_safe --log &
Se o mysqld_safe falhar, tente execut-lo do diretrio de instalao do MySQL (se voc j
no estiver l). Se no funcionar, veja Seco 2.4.2, Problemas Inicializando o Servidor
MySQL .
6. Execute alguns testes bsicos para verificar se o servidor est funcionando. A sada deve ser si-
milar ao mostrado abaixo:
shell> BINDIR/mysqlshow
+-----------+
| Databases |
+-----------+
| mysql |
+-----------+
shell> BINDIR/mysqlshow mysql
Database: mysql
+--------------+
| Tables |
+--------------+
Instalao do MySQL
104
| 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 instala-
o 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 neces-
srios 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 ver-
so 3.22 do MySQL, comearam a existir arquivos RPMs de benchmark chamados mysql-
bench-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.
2.4.1. Problemas Executando o mysql_install_db
O propsito do script mysql_install_db gerar novas tabelas de privilgios. Ele no ir afeter
nenhum outro dado! Ele tambm no far nada se voc j tem a tabela de privilgio do MySQL ins-
talada.
Se voc deseja refazer suas tabelas de privilgios, voc deve desligar o servidor mysqld, se ele j
est executando, ento faa assim:
mv diretorio-dados-mysql/mysql diretorio-dados-mysql/mysql-old
mysql_install_db
Instalao do MySQL
105
Esta seo relaciona alguns problemas que podem ser encontrados ao executar
mysql_install_db:
mysql_install_db no instala as tabelas de permisses
Voc pode descobrir que o mysql_install_db falha ao instalar as tabelas de permisses e
termina depois de mostrar as seguintes mensagens:
starting mysqld daemon with databases from XXXXXX
mysql daemon ended
Neste caso, voc deve examinar o arquivo de log com muito cuidado! O log deve se encontrar
no diretrio XXXXXX nomeado pela mensagem de erro, e deve indicar porque mysqld no ini-
cializa. Se voc no entende o que aconteceu, inclua o log quando voc postar um relato de erro
usando mysqlbug! See Seco 1.7.1.3, Como relatar erros ou problemas.
J existe um daemon mysqld sendo executado
Neste caso, provavelmente no ser necessrio executar o mysql_install_db. Voc deve
executar o mysql_install_db somente uma vez, quando voc instalar o MySQL da primei-
ra vez.
Instalair um segundo daemon mysqld no funciona quando um daemon
estiver em execuo.
Isto pode acontecer quando voc j tiver uma instalao do MySQL existente, mas deseja colo-
car uma nova instalao em um diferente lugar (por exemplo, para testes, ou talvez voc sim-
plesmente deseja executar duas instalaes ao mesmo tempo). Geralmente o problema que ocor-
re quando voc tenta executar o segundo servidor que ele tenta usar o mesmo socket e porta
que o outro. Neste caso voc ir obter a mensagem de erro: Can't start server: Bind
on TCP/IP port: Address already in use ou Can't start server: Bind
on unix socket.... See Seco 4.2, Executando Mltiplos MySQL Servers na Mesma
Mquina.
Voc no tem direito de escrita no diretrio /tmp
Se voc no tem direito de escrita para criar um arquivo socket no local padro (em /tmp) ou
permisso para criar arquivos temporris em /tmp, voc ir obter um erro quando executar
mysql_install_db ou quando iniciar ou usar mysqld.
Voc pode especificar socket e diretrio temporrio diferentes, como segue:
shell> TMPDIR=/algum_dir_tmp/
shell> MYSQL_UNIX_PORT=/algum_dir_tmp/mysqld.sock
shell> export TMPDIR MYSQL_UNIX_PORT
See Seco A.4.5, Como Proteger ou AlterarHow to Protect or Change the MySQL Socket File
/tmp/mysql.sock.
algum_dir_tmp deve ser o caminho para o mesmo diretrio no qual voc tem permisso de
escrita. See Apndice F, Variveis de Ambientes do MySQL.
Depois disto voc deve estar apto para executar mysql_install_db e iniciar o servidor com
estes comandos:
shell> scripts/mysql_install_db
Instalao do MySQL
106
shell> BINDIR/mysqld_safe &
mysqld falha imediatamente
Se voc estiver executando RedHat Verso 5.0 com uma verso de glibc anterior a 2.0.7-5 vo-
c deve ter certeza que voc instalou todos os patches para a glibc! Existe muita informao
sobre isto nos arquivos das listas de mensagens do MySQL. Links para os arquivos de correio
esto disponveis online em http://lists.mysql.com/. Veja tambm Seco 2.6.2, Notas Linux
(Todas as verses).
Voc pode tambm iniciar o mysqld manualmente usando a opo -
-skip-grant-tables e adicionar a informao de privilgios usando o mysql:
shell> BINDIR/mysqld_safe --skip-grant-tables &
shell> BINDIR/mysql -u root mysql
Do mysql, execute manualmente os comandos SQL em mysql_install_db. Tenha certeza
de executar mysqladmin flush_privileges ou mysqladmin reload aps dizer ao
servidor para recarregar as tabelas de permisses.
2.4.2. Problemas Inicializando o Servidor MySQL
Se voc for usar tabelas que suportem transaes (BDB, InnoDB), primeiro deve-se criar um arqui-
vo my.cnf e configurar opes de inicializao para os tipos de tabelas que voc planeja usar. See
Captulo 7, Tipos de Tabela do MySQL.
Geralmente, voc inicia o servidor mysqld de uma das trs maneiras:
Invocando mysql.server. Este script usado primariamente na inicializao e finalizao do
sistema, e descrito de forma mais completa em Seco 2.4.3, Inicializando e parando o
MySQL automaticamente..
Invocando mysqld_safe, que tenta determinar as opes apropriadas para mysqld e ento
execut-lo com estas opes. See Seco 4.8.2, mysqld-safe, o wrapper do mysqld.
Para o Windows NT/2000/XP, veja Seco 2.1.1.7, Iniciando o MySQL no Windows NT,
2000, ou XP.
Invocando o mysqld diretamente.
Quando o daemon mysqld inicia, ele altera o diretrio para o diretrio de dados. neste diretrio
que ele espera gravar arquivos de log e o arquivo pid (com o ID do processo) e onde ele espera en-
contrar 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 vo-
c 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 po-
dem 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 pa-
ra conferir o efeito das opees para se alterar o caminho (perceba que --help deve ser a opo fi-
nal do comando mysqld. Por exemplo:
Instalao do MySQL
107
shell> EXECDIR/mysqld --basedir=/usr/local --help
Uma vez que voc determina as configuraes de caminho que voc deseja, inicie o servidor sem a
opo --help.
Qualquer que tenha sido o mtodo utilizado para iniciar o servidor, se houver falha na inicializao,
confira o arquivo de log para ver se voc pode entender o porqu. Arquivos log esto localizados no
diretrio dados (normalmente /usr/local/mysql/data para uma distribuio binria, /
usr/local/var para uma distribuio fonte, \mysql\data\mysql.err no Windows.) Pro-
cure no diretrio de dados por arquivos com nomes no formato nome_maquina.err e no-
me_maquina.log onde nome_maquina o nome do servidor. Ento confira as ltimas linhas
destes arquivos:
shell> tail nome_maquina.err
shell> tail nome_maquina.log
Se voc encontrar algo como o seguinte no arquivo log:
000729 14:50:10 bdb: Recovery function for LSN 1 27595 failed
000729 14:50:10 bdb: warning: ./test/t1.db: No such file or directory
000729 14:50:10 Can't init databases
Significa que voc no inicializou o mysqld com --bdb-no-recover e o Berkeley DB encon-
trou algo errado com seus arquivos log quando ele tentou recuperar seus bancos de dados. Para po-
der 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, po-
de 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 conse-
gue encontrar outro servidor, voc pode tentar executar o comando telnet sua_maquina nu-
mero_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 usan-
do 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 da-
Instalao do MySQL
108
dos ou log. Neste caso voc tambm deve iniciar o mysqld como usurio root ou alterar a per-
misso 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 er-
ros (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 In-
noDB. 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 op-
es especificas de inicializao do BDB. Seco 7.6.3, Opes de Inicializao do BDB.
2.4.3. Inicializando e parando o MySQL automatica-
mente.
Os scripts mysql.server e mysqld_safe podem ser usados para iniciar o servidor automati-
camente na inicializao do sistema. mysql.server tambm pode ser usado para parar o servi-
dor.
O script mysql.server pode ser usado para inicializar ou parar o servidor utilizando-o com os
argumentos start ou stop:
shell> mysql.server start
shell> mysql.server stop
mysql.server pode ser encontrado no diretrio share/mysql sob o diretrio de instalao do
MySQL ou no diretrio support-files da rvore fonte do MySQL.
Note que se voc usa o pacote RPM do Linux (MySQL-server-VERSO.rpm), o script
mysql.server j estar instalada como /etc/init.d/mysql - voc no precisa instal-lo
manualmente. Veja Seco 2.1.2, Instalando o MySQL no Linux para mais informaes sobre pa-
cotes RPM Linux.
No Mac OS X, voc pode instalar um pacote do MySQL Startup Item separado para habilitar a inici-
alizao automtica do MySQL no boot so sistema. Veja Seco 2.1.3, Instalando o MySQL no
Mac OS X para maiores detalhes.
Antes do mysql.server iniciar o servidor, ele vai para o diretrio de instalao do MySQL, e
ento chama o mysqld_safe. Voc pode precisar editar o mysql.server se tiver uma distri-
buio binria instalada em um local no-padro. Modifique-o para chamar o diretrio (cd) apropri-
ado antes de executar o safe_mysql. Se voc deseja que o servidor seja executado com um usu-
rio especfico, adicione uma linha user apropriada para o arquivo /etc/my.cnf, como ser vis-
to posteriormente nesta seo.
mysql.server stop desliga o servidor MySQL enviando um sinal para ele. Voc pode desligar
o servidor manualmente executando mysqladmin shutdown.
Voc precisa adicionar estes comandos start e stop nos lugares apropriados de seus arquivos /
etc/rc.* quando voc quiser iniciar o MySQL automaticamente no seu servidor.
On most current Linux distributions, it is sufficient to copy the file mysql.server into the /
etc/init.d directory (or /etc/rc.d/init.d on older Red Hat systems). Afterwards, run the
following command to enable the startup of MySQL on system bootup:
Instalao do MySQL
109
shell> chkconfig --add mysql.server
No FreeBSD o script de inicializao normalmente deve ir no diretrio /
usr/local/etc/rc.d/. A pgina do manual rc(8) tambm diz que os scripts neste diretrio
s so executados, se o seu nome de base corresponder padro global da sheel *.sh. Qualquer ou-
tro arquivo ou diretrio presente dentro do diretrio so silenciosamente ignorados. Em outra pala-
vras, no FreeBSD voc deve instalar o arquivo mysql.server como /
usr/local/etc/rc.d/mysql.server.sh para habilitar a inicializao automtica.
Como uma alternativa para o exposto acima, alguns sistemas operacionais tambm usam /
etc/rc.local ou /etc/init.d/boot.local para inicializar servios adicionais durante o
boot. Para iniciar o MySQL usando este mtodo, voc poderia poderia adicionar algo como o segu-
inte a ele:
/bin/sh -c 'cd /usr/local/mysql; ./bin/mysqld_safe --user=mysql &'
Voc tambm pode adicionar opes para mysql.server em um arquivo global
/etc/my.cnf. Um tpico arquivo /etc/my.cnf pode parecer com isto:
[mysqld]
datadir=/usr/local/mysql/var
socket=/var/tmp/mysql.sock
port=3306
user=mysql
[mysql.server]
basedir=/usr/local/mysql
O script mysql.server entende as seguintes opes: datadir, basedir e pid-file.
A seguinte tabela mostra quais grupos de opes cada script de inicializao l dos arquivos de op-
es:
Script Grupos de opes
mysqld [mysqld], [server] e [mysqld-major-version]
mysql.ser
ver
[mysql.server], [mysqld], e [server]
mysqld_sa
fe
[mysql.server], [mysqld], e [server]
Para compatibilidade com verses anteriores, o mysql.server tambm l o grupo
[mysql_server] e mysqld_safe tambm l o grupo [safe_mysqld]. No entanto, voc
deve atualizar os seus arquivos de opes para usar os grupos [mysql.server] e
[mysqld_safe].
See Seco 4.1.2, Arquivo de Opes my.cnf.
2.5. Atualizando/Desatualizando o MySQL
Antes de fazer uma atualizao, voc deve fazer o backup de seus bancos de dados antigos.
Voc sempre pode mover os arquivos de formato e de dados do MySQL entre diferentes verses na
mesma arquitetura enquanto voc tiver verso base do MySQL. A verso base atual 4. Se voc al-
terar o conjunto de caracteres quando executar o MySQL, voc deve executar myisamchk -r -q
--set-character--set=charset em todas tabelas. De outra forma seus ndices podem no
ser corretamente ordenados, porque alterar o conjunto de caracteres tambm pode alterar a ordena-
o.
Se voc tem receio de novas verses, voc sempre pode renomear seu antigo mysqld para algo co-
Instalao do MySQL
110
mo mysqld-'nmero-da-verso-antiga'. Se o seu novo mysqld comportar de maneira inesperada,
voc simplesmente pode desliga-lo e reiniciar com seu antigo mysqld!
Se depois de uma atualizao, voc tiver problemas com programas clientes recompilados como
Commands out of sync ou ``core dumps'' inexperados, voc provavelmente usou um arquivo
de cabealho ou de biblioteca antigo na compilao de seus programas. Neste caso voc deve confe-
rir a data de seu arquivo mysql.h e da biblioteca libmysqlclient.a para verificar que eles
so da nova distribuio MySQL. Se no, por favor, recompile seus programas!
Se voc tiver problemas, como na inicializao do novo servidor mysqld ou caso voc no consiga
conectar sem uma senha, confira se o seu arquvo my.cnf o mesmo da antiga instalao! Voc
pode conferir com isto: nome-programa --print-defaults. Se isto no produzir outra sa-
da alm do nome do programa, voc tem um arquivo my.cnf ativo que est afetando a operaciona-
lidade do servidor!
uma boa idia reconstruir e reinstalar o mdulo Perl DBD-mysql sempre que instalar uma no-
va verso do MySQL. O mesmo se aplica para outras interfaces MySQL, como Python MySQLdb.
2.5.1. Atualizando da Verso 4.0 para 4.1
Varias comportamentos visveis foram alteradas entre o MySQL 4.0 e o MySQL 4.1 para corrigir
erros crticos e tornar o MySQL mais compatvel com o padro ANSI SQL. Estas alteraes podem
afetar sua aplicao.
Alguns dos comportamentos do MySQL 4.1 no 4.0 podem ser testados antes de realizar uma atuali-
zao completa para a verso 4.1, adicionamos s ltimas distribuies do MySQL 4.0 (a paritr da
4.0.12) a opo de inicializao --new para o mysqld.
Esta opo lhe d o comportamento da verso 4.1 para as alteraes mais crticas. Voc tambm po-
de habilitar estes comportamentos para a conexo de uma determinado cliente com o comando SET
@@new=1, ou desabilit-lo se ele for iniciado com SET @@new=0.
Se voc acredita que algumas das alteraes da verso 4.1 o afetaro, recomendamos que antes de
atualizar para a verso 4.1, voc faa o download da ltima distribuio do MySQL 4.0 e o execute
com a opo --new adicionando o seguinte ao seu arquivo de configurao:
[mysqld-4.0]
new
Deste modo voc pode testar o novo comportamento com seus aplicativos na verso 4.0 para certifi-
car-se que eles funcionam. Isto o ajudar a ter uma transio suave quando realizar uma atualizao
completa do MySQL 4.1. Fazendo isto do modo acima ir assegurar que voc no execute acidenta-
lemte a verso 4.1 com a opo --new mais tarde.
A seguinte lista descreve alteraes que podem afetar aplicaes e que voc deve observar ao atuali-
zar para a verso 4.1:
TIMESTAMP agora retornado como uma string com o formato 'YYYY-MM-DD
HH:MM:SS'. (A opo --new pode ser usada a partir da verso 4.0.12 para fazer um servidor
4.0 se comportar como 4.1 a este respeito.) Se voc quiser t-lo com um nmero (como a Verso
4.0 faz) deve-se adicionar +0 a coluna TIMESTAMP a eles:
mysql> SELECT ts_col + 0 FROM tbl_name;
Tamanhos de display para TIMESTAMP no so mais suportados. Por exemplo, se voc declarar
um coluna como TIMESTAMP(10), o (10) ignorado.
Esta mudana era necessria para compatibilidade com os padres SQL. Em uma verso futura.
Em uma verso futura, uma alterao adicional ser feita (compatvel com verses anteriores
com esta mudaa), permitindo que o tamanho do timestamp indique o nmero desejado de dgi-
tos de fraes de um segundo.
Instalao do MySQL
111
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 bin-
rio. Com esta alterao voc deve usar CAST() se voc quiser comparar valores binrios nume-
ricamente 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 ver-
so 4.0, um valor DEFAULT ignorado sem aviso, na 4.1 ocorre um erro).
LIMIT no aceita mais argumentos negativos. Use 18446744073709551615 em vez de -1.
SERIALIZE no mais uma opo vlida para sql_mode. Deve-se usar SET TRANSACTI-
ON 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 ser-
guintes passos:
Verifique na seo de alteraes se houve alguma mudana que pode afetar a sua aplicao.
Instalao do MySQL
112
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 es-
to 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 co-
necta de uma mquina remota que ainda no tenha sido atualizada para a verso 4.1). A seguinte lis-
ta indica algumas estratgias possveis de atualizao. Elas representam o que se deve fazer para es-
colher 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 Pre-
paradas da API C.
Atualizar para a verso 4.1 e executar o script mysql_fix_privilege_tables para au-
mentar 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 al-
terar 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 aumen-
tar a coluna Password na tabela user. Se voc sabe que todos os clientes tambm foram atua-
lizados para a verso 4.1, no execute o servidor com a opo --old-passwords. Em vez
disso, altere a senha em todas as contas existentes para que elas tenham o novo formato. Uma
instalao pura da verso 4.1 o mais seguro.
Informaes adicionais sobre hashing de senha em relao a autenticao no cliente e operaes de
alterao de senha podem ser encontrados em Seco 4.3.11, Hashing de Senhas no MySQL 4.1.
2.5.2. Atualizando da Verso 3.23 para 4.0
Em geral, o que voc deve fazer atualizar para a verso 4.0 um verso mais nova do MySQL:
Aps o upgrade, atualize a tabela de permisses para adicionar novos privilgios e recursos. O
procedimento usa o script mysql_fix_privilege_tables e est descrito em Sec-
o 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
Instalao do MySQL
113
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 compartilha-
das (com o Perl DBD-mysql). Se voc tiver, voc deve recompil-las j que as estruturas usa-
das 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 pri-
vilgios 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 Sin-
taxe de GRANT e REVOKE.
Para fazer estes novos privilgios funcionarem, deve se atualizar a tabela de permisses. O pro-
cedimento 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 mo-
mento para alterar os seus scripts e usar GRANT em vez de modificar a tabela de permisses di-
retamente.
A partir da verso 4.0.2 a opo --safe-show-database est obsoleta (e no faz mais na-
da). 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 ve-
rificar se voc precisa de alguma das novas concesses que voc no precisava antes. Em parti-
cular, voc precisar REPLICATION SLAVE (em vez de FILE) para novos slaves.
safe_mysqld renomeado para mysqld_safe. Para compatibilidade com verses anterio-
res, as distribuies binrias, iro, por algum tempo, incluir safe_mysqld como um link sim-
blico 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
Instalao do MySQL
114
de inicializao do servidor. Para compilar o MySQL sem suporte ao InnoDB, execute confi-
gure com a opo --without-innodb.
O parmetro de inicializao myisam_max_extra_sort_file_size e myi-
sam_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 neces-
srio).
A seguintes variveis/opes de inicializaao foram renomeadas:
Nome Antigo Novo Nome.
myisam_bulk_insert_tree_size bulk_insert_buffer_size
query_cache_startup_type query_cache_type
record_buffer read_buffer_size
record_rnd_buffer read_rnd_buffer_size
sort_buffer sort_buffer_size
warnings log-warnings
--err-log --log-error (para mysqld_safe)
As opes de inicializao record_buffer, sort_buffer e warnings ainda funciona-
ro no MySQL 4.0 mas estp obsoletas.
As seguintes veriveis SQL mudaram o nome.
Nome Antigo Novo Nome.
SQL_BIG_TABLES BIG_TABLES
SQL_LOW_PRIORITY_UPDATES LOW_PRIORITY_UPDATES
SQL_MAX_JOIN_SIZE MAX_JOIN_SIZE
SQL_QUERY_CACHE_TYPE QUERY_CACHE_TYPE
Os nomes antigos ainda funcionam no MySQL 4.0 mas esto obsoletos.
Voc deve usar SET GLOBAL SQL_SLAVE_SKIP_COUNTER=# em vez de SET
SQL_SLAVE_SKIP_COUNTER=#.
As opes de inicializao --skip-locking e --enable-locking foram renomeadas
para --skip-external-locking e --external-locking.
SHOW MASTER STATUS agora retorna um conjunto vazio se o log binrio no estiver habilita-
do.
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 ren-
dimento com alguns SO (Principalmente no Linux).
Colunas DOUBLE e FLOAT agora respeitam o parmetro UNSIGNED no armazenamento (antes,
UNSIGNED era ignortado por estas colunas).
ORDER BY coluna DESC ordena valores NULL por ltimo, como no MySQL 4.0.11. Na
verso 3.23 e anteriores da verso 4.0, isto nem sempre era consistente.
SHOW INDEX tem duas colunas a mais (Null e Index_type) que ele tinha nas verses 3.23.
Instalao do MySQL
115
CHECK, SIGNED, LOCALTIME e LOCALTIMESTAMP so agora palavras reservadas.
O resultado de todos os operadores bitwise (|, &, <<, >> e ~) agora so unsigned. Isto pode cau-
sar 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 ve-
rificar 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 pre-
cisa recontru-las com REPAIR TABLE nome_tabela USE_FRM.
LOCATE() e INSTR() so caso sensitivo se um dos argumentos uma string binria. De outra
forma elas so caso-insensitivo.
STRCMP() agora usa o conjunto de caracteres atual ao fazer comparaes, o que significa que o
comportamento padro das comparaes agora caso-insensitivo.
HEX(string) agora retorna os caracteres na string convertidos para hexadecimal. Se voc
quiser converter um nmero para hexadecimal, voc deve se assugurar que voc chama HEX()
com um argumento numrico.
Na verso 3.23, INSERT INTO ... SELECT sempre tem o IGNORE habilitado. Na verso
4.0.1, o MySQL ir parar (e possvelmente fazer um roll back) por padro no caso de
mysqld_safe ser renomeado para mysqld_safe. Por algum tempo incluiremos em nossa
distribuio binria o mysqld_safe como um link simblico para mysqld_safe.
um erro se voc no especificar IGNORE.
As funes antigas da API C mysql_drop_db(), mysql_create_db() e
mysql_connect() no s mais suportadas a menos que voc compile o MySQL com
CFLAGS=-DUSE_OLD_FUNCTIONS. No entanto, prefervel alterar o cliente para utilizar a
nova API 4.0.
Na estrutura MYSQL_FIELD, length e max_length foram alterados de unsigned int
para unsigned long. Isto no deve causar problemas, exceto que eles podem gerar mensa-
gens de avisos quando quando usado como argumento em uma classe printf() de funes.
Voc deve usar TRUNCATE TABLE quando quiser deletar todos os registros de uma tabela e
voc no precisa obter uma contagen de quantas colunas forma deletadas. (DELETE FROM
table_name retorna a contagem de linhas na verso 4.0, e TRUNCATE TABLE mais rpi-
do.)
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, co-
mo voc fez no MySQL 3.23). Usar strings ainda funicona, mas usar inteiros mais eficiente.
O formato de SHOW OPEN TABLE alterou.
Clientes multi-thread devem usar mysql_thread_init() e mysql_thread_end(). See
Seco 12.1.14, Como Fazer um Cliente em Threads.
Se voc quiser recompilar o mdulo Perl DBD::mysql, voc deve conseguir o DBD-mysql
verso 1.2218 ou mais novo porque os mdulos DBD mais antigos usam a chamada obsoleta
mysql_drop_db(). A verso 2.1022 ou mais nova recomendada.
Instalao do MySQL
116
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 Im-
plementao da Replicao.
2.5.3. Atualizando da verso 3.22 para 3.23
A Verso 3.23 do MySQL suporta tabelas do novo tipo MyISAM e do antigo tipo ISAM. Voc no
necessita converter suas antigas tabelas para us-las com a verso 3.23. Por padro, todas novas ta-
belas sero criadas usando o tipo MyISAM (a menos que voc inicie o mysqld com a opo -
-default-table-type=isam). Voc pode converterr uma tabela ISAM para uma formato
MyISAM com ALTER TABLE nome_tabela TYPE=MyISAM ou com o script Perl
mysql_convert_table_format.
Os clientes verses 3.22 e 3.21 iro trabalhar sem quaisquer problemas com um servidor verso
3.23.
As seguintes listas dizem o que voc deve conferir quando atualizar para a verso 3.23:
Todas tabelas que usam o conjunto de caracteres tis620 devem ser corrigidos com myi-
samchk -r ou REPAIR TABLE.
Se voc fizer um DROP DATABASE em um banco de dados ligado simbolicamente, a ligao e
o banco de dados original sero apagados. (Isto no acontece na 3.22 porque o configure no
detecta a disponibilidade da chamada de sistema readlink).
OPTIMIZE TABLE agora funciona somente para tabelas MyISAM. Para outros tipos de tabe-
las, voc pode usar ALTER TABLE para otimizar a tabela. Durante o OPTIMIZE TABLE a ta-
bela , 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 pri-
meiro argumento.
Colunas AUTO_INCREMENT no devem ser usadas para armazenar nmeros negativos. A razo
para isto que nmeros negativos causam problemas quando o -1 passa para 0. Voc no deve
armazenar 0 em uma coluna AUTO_INCREMENT tambm; CHECK TABLE ir reclamar sobre
valores 0 porque eles podem alterar se voc fizer um dump e restaurar a tabela. AU-
TO_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.
Instalao do MySQL
117
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 ta-
manho 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 opera-
dor '='. Se voc precisa do antigo compartamento, voc pdoe compilar o MySQL com a opo
CXXFLGAS=-DLIKE_CMP_TOUPPER.
REGEXP agora caso insensitivo se nenhuma das strings forem binrias.
Quando for necessrio dar manuteno ou reparar tabelas MyISAM .MYI deve ser usado a ins-
truo 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 ca-
da caractere formatador. (Verses mais antigas que o MySQL 3.22 aceitaivam esta sintaxe.)
mysql_fetch_fields_direct() agora uma funo (era uma macro) e ela retorna um
ponteiro para um MYSQL_FIELD no lugar de um MYSQL_FIELD.
mysql_num_fields() no pode mais ser usada em um objeto MYSQL* (agora uma funo
que obtem valores MYSQL_RES* como um argumento). Com um objeto MYSQL* agora voce
deve usar mysql_field_count().
No MySQL Verso 3.22, a sada de SELECT DISTINCT ... era na maioria das vezes orde-
nada. Na Verso 3.23, voc deve usar GROUP BY ou ORDER BY para obter a sada ordenada.
SUM() agora retorna NULL, em vez de 0 se no existir registros coincidentes. Isto de acordo
com o ANSI SQL.
Um AND ou OR com valores NULL agora retornam NULL no lugar de 0. Isto afetar, em grande
parte, pesquisas que usam NOT em uma expresso AND/OR como NOT NULL = NULL.
LPAD() e RPAD() reduziro a string resultante se ela for maior que o tamanho do argumento.
2.5.4. Atualizando da verso 3.21 para 3.22
Nada que afetaria a compatibilidade foi alterada entre a verso 3.21 e 3.22. A nica dificuldade
que novas tabelas que so criadas com colunas do tipo DATE usaro a nova forma de armazenar a
data. Voc no pode acessar esses novos campos com uma verso antiga de mysqld.
Depois de instalar o MySQL verso 3.22, voc deve iniciar o novo servidor e depois executar o
script mysql_fix_privilege_tables. Isto adicionar os novos privilgios que voc precisa-
r para usar o comando GRANT. Se voc se esquecer disto, sera retornado o erro Access denied
quando voc tentar usar ALTER TABLE, CREATE INDEX ou DROP INDEX. O procedimento pa-
ra atualizar a tabela de permisses est descrito em Seco 2.5.6, Atualizando a Tabela de Permis-
ses.
A interface API C para mysql_real_connect() foi alterada. Se voc tem um programa cliente
antigo que chama essa funo, voc deve colocar um 0 para o novo argumento db (ou recodificar o
cliente para enviar o elemento db para conexes mais rpidas). Voc tambm deve chamar
mysql_init() antes de chamar mysql_real_connect()! Esta alterao foi feita para per-
mitir nova funo mysql_options() salvar opes na estrutura do manipulador do MYSQL.
Instalao do MySQL
118
A varivel key_buffer do mysqld foi renomeada para key_buffer_size, mas voc ainda
pode usar o antigo nome nos seus arquivos de inicializao.
2.5.5. Atualizando da verso 3.20 para 3.21
Se voc estiver executando uma verso mais antiga que a Verso 3.20.28 e deseja mudar para a ver-
so 3.21 voc deve fazer o seguinte:
Inicie o servidor mysqld verso 3.21 com a opo --old-protocol para us-lo com clientes
de uma distribuio da verso 3.20 Neste caso, a nova funo cliente mysql_errno() no ir re-
tornar erro do servidor, somente CR_UNKNOWN_ERROR (mas isto funciona para erros de clientes) e
o servidor usa a forma funo password() anterior a 3.21 para verificao, ao invs do novo m-
todo.
Se voc NO estiver usando a opo --old-protocol para mysqld, voc precisar fazer as
seguir alteraes:
Todo o cdigo cliente deve ser recompilado. Se voc usa o ODBC, deve obter o novo driver
MyODBC 2.x.
O script scripts/add_long_password deve ser executado para converter o campo
Password na tabela mysql.user para CHAR(16).
Todas as senhas devem ser reatribuidas na tabela mysql.user (para obter 62-bits no lugar de
senhas 31-bits).
O formato das tabelas no foi alterado, ento no preciso converter nenhuma tabela.
A verso do MySQL 3.20.28 e superiores podem manipular o novo formato da tabela de usuri-
os 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 fa-
zer 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 nova-
mente.
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 altera-
o que deve ser feita se voc usa o mysqlperl alterar os argumentos para a funo con-
nect(). Os novos argumentos so: host, database, user, password (note que os argumen-
tos user e password foram alterados de lugar). See Seco 12.5.2, A interface DBI.
As seguintes alteraes podem afetar consultas em antigas aplicaes:
HAVING deve ser especificada antes de qualquer clusula ORDER BY.
Os parmetros para LOCATE() foram trocados.
Agora existem algumas palavras reservadasi novas. As mais notveis so DATE TIME e TI-
MESTAMP.
2.5.6. Atualizando a Tabela de Permisses
Instalao do MySQL
119
Algumas distribuies introduzem alteraes a estrutura da tabelas de permisses (a tabela no banco
de dados mysql) para adicionar novos privilgios ou recursos. Para ter certeza de que as suas tabe-
las de permisses esto corretas quando voc atualizar para uma nova verso do MySQL, voc deve
atualizar a sua tabela de permisso tambm.
Em sistemas Unix ou semelhantes, atualize a tabela de permisses executando o script
mysql_fix_privilege_tables:
shell> mysql_fix_privilege_tables
Voc deve executar este script enquanto o servidor est em execuo. Ele tenta se conectar ao servi-
dor na mquina local como root. Se sua conta root exige uma senha, indique a senha na linha de
comando. Para o MySQL 4.1 e acima, especifique a senha assim:
shell> mysql_fix_privilege_tables --password=senha_root
Antes do MySQL 4.1, especifique a senha desta forma:
shell> mysql_fix_privilege_tables senha_root
O script realiza mysql_fix_privilege_tables qualquer ao necessria para converter sua
tabela de permisses para o formato atual. Voc pode ver alguns avisos Duplicate column
name, durante a execuo, eles podem ser ignorados.
Depois de executar o script, pare o servidor e o reinicie.
No Windows, no existe uma modo fcil de se atualizar a tabela de permisses at o MySQL 4.0.15.
A partir desta verso, as distribuies do MySQL incluem um script SQL
mysql_fix_privilege_tables.sql que voc pode executar usando o cliente mysql. Se
sua instalao do MySQL est localizada em C:\mysql, o comando se parecer com este:
C:\mysql\bin> mysql -u root -p mysql
mysql> SOURCE C:\mysql\scripts\mysql_fix_privilege_tables.sql
Se sua instalao est localizada em algum outro diretrio, ajuste o caminha apropriadamente.
O comando ir lhe pedir a senha do root; digite-a quando pedido.
Como no procedimento com o Unix, voc pode ver alguns avisos Duplicate column name
enquanto o mysql processa as instrues no script mysql_fix_privilege_tables.sql;
eles podem ser ignorados.
Depois de executar o script, para o servidor e reinicie-o.
2.5.7. Atualizando para outra arquitetura
Se voc estiver usando o MySQL Verso 3.23, voc pode copiar os arquivos .frm, .MYI e .MYD
para tabelas MyISAM entre diferentes arquiteturas que suportem o mesmo formato de ponto flutuan-
te. (O MySQL cuida de cada detalhe de troca de bytes.) See Seco 7.1, Tabelas MyISAM.
Os arquivos ISAM de dados e ndices (*.ISD e *.ISM respectivamente) so dependentes da arqui-
tetura e em alguns casos dependentees do Sistema Operacional. Se voc deseja mover suas aplica-
es para outra mquina que tem uma arquitetura ou SO diferentes da sua mquina atual, voc no
deve tentar mover um banco de dados simplesmente copiando os arquivos para a outra mquina.
Use o mysqldump.
Por padro, o mysqldump ir criar um arquivo contendo declaraes SQL. Voc pode ento trans-
ferir o arquivo para a outra mquina e aliment-la como uma entrada para o cliente mysql.
Utilize mysqldump --help para ver quais opes esto disponveis. Se voc est movendo os
Instalao do MySQL
120
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 ar-
mazenar 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 # cria o banco de dados
shell> cat DUMPDIR/*.sql | mysql nome_bd # cria tabelas no banco de dados
shell> mysqlimport nome_bd DUMPDIR/*.txt # carrega dados nas tabelas
No se esquea de copiar o banco de dados mysql tambm, porque nele que as tabelas de permis-
ses (user, db e host) so armazenadas. Voc pode ter que executar comandos como o usurio
root do MySQL na nova mquina at que voc tenha o banco de dados mysql no lugar.
Depois de importar o banco de dados mysql para a nova mquina, execute mysqladmin
flush-privileges para que o servidor recarregue as informaes das tabelas de permisses.
2.5.8. Atualizando o MySQL no Windows
Qaundo atualizar o MySQL no Windows, siga os passo abaixo:
1. Faa o download do ltima distribuio MySQL do Windows.
Instalao do MySQL
121
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 utili-
trio de Servios se voc estiver exeutando MySQL como um servio, ou com mysqlad-
min shutdown).
5. Finalize o programa WinMySQLAdmin se ele estiver em execuo.
6. Execute o script de instalao do arquivo de distribuio do Windows, clicando no boto "Ins-
tall" no WinZip e seguindo os passos da instalao do script.
7. Voc pode sobrescrever a sua instalao antiga do MySQL (normalmente em C:\mysql), ou
instal-la em um diretrio diferente, como C:\mysql4. Sobrescrever a instalao antiga o
recomendado.
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. Atualize a tabela de permisses. O procedimento est descrito em Seco 2.5.6, Atualizando a
Tabela de Permisses.
Situaes de erros possveis:
A system error has occurred.
System error 1067 has occurred.
The process terminated unexpectedly.
Este erro significa que seu arquivo my.cnf (por padro C:\my.cnf) contm uma opo que no
pode ser reconhecido pela MySQL. Voc pode verificar que este o caso tentando reiniciar o
MySQL com o arquivo my.cnf renomeado, por exemplo, para my_cnf.old para prevenirt o ser-
vidor de us-lo. Uma vez verificado isto, voc precisa identificar qual parmetro o culpado. Crie
um novo arquivo my.cnf e mova as partes do arquivo antigo para ele (reiniciando o servidor de-
pois de mover cada parte) at que voc determine qual opo est fazendo a inicializao do servi-
dor falhar.
2.6. Notas especficas para os Sistemas Ope-
racionais
2.6.1. Notas Windows
Esta seo descreve assuntos especficos para usar MySQL no Windows.
2.6.1.1. Conectando em um MySQL Rematamente a Windows Uti-
lizando SSH
Aqui temos notas sobre como conectar a um servidor MySQL atravs de uma conexo remota e se-
gura usando o SSH (por David Carlson <dcarlson@mplcomm.com>:
1. Instale um cliente SSH na sua mquina Windows. Como um usurio, o melhor opo paga que
encontrei o SecureCRT da http://www.vandyke.com/. Outra opo o f-secure da
http://www.f-secure.com/. Voc tambm pode encontrar algumas verses livres no Google em
http://directory.google.com/Top/Computers/Security/Products_and_Tools/Cryptography/SSH/
Clients/Windows/.
2. Inicie seu cliente SSH Windows. Configure Host_Name =
Instalao do MySQL
122
IP_ou_Nome_servidormysql. Configure userid=seu_userid para logar no seu ser-
vidor. Este valor userid no pode ser o mesmo do nome do usurio se sua conta MySQL.
3. Configure a porta de acesso. E tambm faa um acesso remoto (Configure local_port:
3306, remote_host: ip_ou_nomeservidormysql, remote_port: 3306 ) ou
um acesso local (configure port: 3306, host: localhost, remote port: 3306).
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. Na sua mquina Windows, inicie algumas aplicaes ODBC (como o Access).
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 servi-
dora MySQL --- no nomeservidormysql.
Voc agora deve ter uma conexo ODBC ao MySQL, criptografada com SSH.
2.6.1.2. Compilando clientes MySQL no Windows
Em seus arquivos fontes, voc deve incluir my_global.h antes de mysql.h:
#include <my_global.h>
#include <mysql.h>
my_global.h inclui qualquer outro arquivo necessrio para compatibilidade de Windows (como
o windows.h) se o arquivo compilado no Windows.
Voc tambm pode ligar seu cdigo coma biblioteca dinmica libmysq.lib, que apenas um
wrapper para carregar em libmysql.dll sobre demanda, ou ligar com a biblioteca esttica
mysqlclient.lib.
Perceba que como as bibliotecas clientes do MySQL so compiladas como bibliotecas threaded, vo-
c tambm deve compilar seu cdigo para ser multi-threaded!
2.6.1.3. MySQL para Windows Comparado com o MySQL para
Unix
O MySQL para Windows tem provado ser muito estvel. Esta verso do MySQL tem os mesmos re-
cursos que sua verso correspondente Unix com as seguintes excees:
Win95 e threads
O Win95 perde aproximadamente 200 bytes de memria principal para cada thread criada. Cada
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 pos-
samos usar a interface readfile()/writefile() no NT/2000/XP para obter mais veloci-
dade. 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
Instalao do MySQL
123
O MySQL usa uma leitura de blocos para cada conexo, que tem as seguintes implicaes:
Uma conexo no ir ser disconectada automaticamente depois de 8 horas, como acontece
com a verso Unix do MySQL.
Se uma conexo trava, impossvel a finaliza-la sem matar o MySQL.
mysqladmin kill no ir funcionar em uma conexo adormecida.
mysqladmin shutdown no pode abortar enquanto existirem conexes adormecidas.
Planejamos corrigir este problema quando nossos desenvolvedores Windows tiverem consegui-
do um boa soluo.
DROP DATABASE
Voc no pode remover um banco de dados que est em uso por alguma thread.
Matando o MySQL do gerenciador de tarefas
Voc no pode matar o MySQL do gerenciador de tarefas ou com o utilitrio shutdown no
Win95. Voc deve deslig-lo com mysqladmin shutdown.
Nomes case-insensitivo
Nomes de arquivos no so caso sensitivo no Windows, portanto, nomes de bancos de dados e
tabelas do MySQL tambm no so caso sensitivo no Windows. A nica restrio que os no-
mes de bancos de dados e tabelas devem usar o mesmo caso em uma sentena fornecida. See
Seco 6.1.3, Caso Sensitivo nos Nomes.
O caracter de diretrio '\'
Componentes de nomes de caminho no Win95 so separados pelo caracter '\' o qual tambm o
caractere de escape no MySQL. Se voc estiver usando LOAD DATA INFILE ou SELECT
... INTO OUTFILE, use nomes de arquivo no estilo Unix com caracteres '/':
mysql> LOAD DATA INFILE "C:/tmp/skr.txt" INTO TABLE skr;
mysql> SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
Uma alternativa dobrar o caracter '/':
mysql> LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr;
mysql> SELECT * INTO OUTFILE 'C:\\tmp\\skr.txt' FROM skr;
Problems with pipes.
Pipes no funcionam com confiana na linha de comando do Windows. Se o pipe incluir o ca-
racter ^Z / CHAR(24), o Windows achar que ele encontrou o fim de um arquivo e abortar o
programa.
Isto um problma principalmente quando se tenta aplicar um log binrio como a seguir:
mysqlbinlog binary-log-name | mysql --user=root
Se voc obter um problema aplicando o log e suspeitar que seja devido a um caracter
^Z/CHAR(24) voc pode usar a seguinte alternativa:
Instalao do MySQL
124
mysqlbinlog binary-log-file --result-file=/tmp/bin.sql
mysql --user=root --eexecute "source /tmp/bin.sql"
O ltimo comando pode tambm ser usado para leitura em qualquer arquivo sql que contenha
dados binrios.
erro: Can't open named pipe
Se voc utiliza um servidor MySQL verso 3.22 no NT com o os programas clientes MySQL
mais novos, ser apresentado o seguinte erro:
error 2017: can't open named pipe to host: . pipe...
Isto ocorre porque a verso do MySQL usa named pipes no NT por padro. Voc pode evitar es-
te erro usando a opo --host=localhost para os novos clientes MySQL ou criar um ar-
quivo de opes c:\my.cnf que contenha a seguinte informao:
[client]
host = localhost
A partir da verso 3.23.50, named pipes so habilitados somente se o mysqld-nt ou
mysqld-nt-max for iniciado com a opo --enable-name-pipe.
Erro Access denied for user
Se voc tenta executar um programa cliente MySQL para conectar a um servidor em execuo
na mesma mquina, nas obtem o erro Access denied for user: 'some-
user@unknown' to database 'mysql' quando acessar um servidor MySQL na mes-
ma mquina, signifca que o MySQL no pode resolver seu nome de mquina corretamente.
Para corrigir isto, voc deve criar um arquivo \Windows\hosts com a seguinte informao:
127.0.0.1 localhost
ALTER TABLE
Enquanto voc est executando uma instruo ALTER TABLE, a tabela est bloqueada para ser
usado por outras threads. Isto ocorre devido ao fato de que no Windows, voc no pode deletar
um aruivo que est em uso por outra threads. No futuro, podemos encontrar algum modo de con-
tornarmos este problema.
DROP TABLE
DROP TABLE em uma tabela que est em uso por uma tabela MERGE no funcionar no Win-
dows porque o manipulador do MERGE faz o mapeamento da tabela escondido da camada supe-
rior do MySQL. Como o Windows no permite que voc delete arquivos que esto abertos, voc
primeiro deve descarregar todas as tabelas MERGE (com FLUSH TABLES) ou apagar a tabela
MERGE antes de deletar a tabela. Corrigiremos isto assim que introduzirmos views.
DATA DIRECTORY e INDEX DIRECTORY
As opes DATA DIRECTORY e INDEX DIRECTORY para CREATE TABLE so ignoradas
no Windows, porque ele no suporta links simblicos.
Aqui esto alguns assuntos em aberto para qualquer um que queira melhorar o MySQL no Win-
Instalao do MySQL
125
dows:
Adicionar alguns cones agradveis para o start e shutdown na instalao do MySQL.
Seria muito interessante conseguir matar o mysqld do gerenciador de tarefas. Para o momento,
deve ser usado o mysqladmin shutdown.
Portar o readline para Windows para uso na ferramenta de linha de comando mysql.
Verses GUI dos clientes MySQL padres (mysql, mysqlshow, mysqladmin e mysql-
dump) seria timo.
Seria muito bom se as funes de leitura e escrita no socket em net.c fosse interrompveis. Is-
to tornaria possvel matar threads abertas com mysqladmin kill no Windows.
Adicionar macros para usar os mtodos mais rpidos de incremento/decremento de threads segu-
ras fornecidos pelo Windows.
2.6.2. Notas Linux (Todas as verses)
As notas abaixo a respeito da glibc aplicam-se somente na situao quando o MySQL construido
por voc mesmo. Se voc est executando Linux em uma mquina x86, na maioria dos casos mui-
to melhor para voc usar nosso binrio. Ns ligamos nossos binrios com a melhor verso alterada
da glibc, podemos escolher as melhores opes do compilador, em uma tentativa de torn-la funcio-
nal para um servidor muito exigido. Para um usurio comum, mesmo para configuraes com vrias
conexes concorrentes e/ou tabelas excedendo o limite de 2 GB, nosso binrio , na maioria das ve-
zes, a melhor escolha. Portanto se voc ler o texto abaixo, e est em dvida sobre o que deve fazer,
tente usar o nosso binrio primeiro para ver se ele preenche suas necessidades, e preocupe-se com
uma construo prpria apenas se voc descobrir que nosso binrio no bom o suficiente para vo-
c. Neste caso, iramos apreciar se fosse feito uma observao sobre isto, para que possamos fazer
uma melhor verso binris da prxima vez.
O MySQL usa LinuxThreads no Linux. Se voc usa uma verso do Linux que no tenha a glibc2,
voc deve instalar LinuxThreads antes de tentar compilar o MySQL. Voc pode obter o LinuxThre-
ads em http://www.mysql.com/downloads/os-linux.html.
NOTA: Temos visto alguns problemas estranhos com o Linux 2.2.14 e MySQL em sistemas SMP;
Se voc tem um sistema SMP, recomendamos a atualizao para o Linux 2.4! Seu sistema ficar
mais rpido e mais estvel.
Perceba que as verses da glibc iguais ou anteriores Verso 2.1.1 tem um bug fatal no tratamen-
to do pthread_mutex_timedwait, que usado quando voc executar instrues INSERT
DELAYED. Recomendamos no usar INSERT DELAYED antes de atualizar a glibc.
Se voc planeja ter mais de 1000 conexes simultneas, ser necessrio fazer algumas alteraes na
LinuxThreads, recompile-a e religue o MySQL ao novo libpthread.a. Aumente PTHRE-
AD_THREADS_MAX em sysdeps/unix/sysv/linux/bits/local_lim.h para 4096 e
abaixe o STACK_SIZE no linuxthreads/internals.h para 256KB. Os caminhos so rela-
tivos raiz da glibc. Note que o MySQL no ser estvel com cerca de 600-1000 conexes se o
valor de STACK_SIZE for o padro de 2MB.
Se voc tiver um problema com o MySQL, no qual ele no consiga abrir vrios arquivos ou cone-
xes, pode ser que voc no tenha configurado o Linux para lidar com o nmero de arquivos sufici-
ente.
No Linux 2.2 e posteriores, voc pode conferir o valor para a alocao dos arquivos fazendo:
cat /proc/sys/fs/file-max
cat /proc/sys/fs/dquot-max
cat /proc/sys/fs/super-max
Instalao do MySQL
126
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 ferra-
menta sysctl, que usada por muitas distribuies Linux (No SuSE a partir da verso 8.0). Ape-
nas 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 pi-
lha de cada thread, mas pequena o bastante para manter a pilha de alguma thread executando dos da-
dos globais mysqld. Infelizmente, a implementao Linux de mmap(), como descobrimos em ex-
perincias, 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 c-
digo 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 per-
maneam 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 es-
tiver 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 he-
ap 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 pe-
naliza um processo por bifurcar-se ou clonar um filho na tentativa de prevenir um ataque de separa-
o. 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 mlti-
plas 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 exten-
sivos 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 usuri-
os 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
Instalao do MySQL
127
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 through-
put 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 servi-
dor 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 in-
clu-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 progra-
mas com vrias threads que travam o mutex por um tempo curto. Em um sistema SMP, ironicamen-
te, se voc liga o MySQL com LinuxThreads sem modificaes, removendo processadores da m-
quina, 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 me-
lhor,mesmo que o patch na glibc-2.1.3. Avisamos, entretando, que sobre algumas condies, o cdi-
go mutex no glibc-2.2.2 overspins, que prejudica a performance do MySQL. A chance desta condi-
o 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 fu-
turos 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 pa-
dres sero corrigidos para valores mais aceitveis para configuraes pesadasa do MySQL no futu-
ro, 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 bibliote-
ca 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 al-
guns 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. Is-
to 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.
Instalao do MySQL
128
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 Fa-
zer Se o MySQL Continua Falhando.
Para obter um descarga do core no Linux se o mysqld finalizar com um sinal SIGSEGV, voc po-
de iniciar o mysqld com a opo --core-file. Perceba que provavelmente voc tambm preci-
sar 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, mysqld-
safe, o wrapper do mysqld.
Se voc estiver ligando seu prprio cliente MySQL e obter o erro:
ld.so.1: ./my: fatal: libmysqlclient.so.4:
open failed: No such file or directory
Quando execut-los, o problema pode ser evitado com um dos seguintes mtodos:
Ligue o cliente com a seguinte opo (no lugar de -Lpath): -
Wl,r/path-libmysqlclient.so.
Copie libmysqclient.so para /usr/lib.
Adicione o caminho do diretrio onde libmysqlclient.so est localizado para a varivel
de ambiente LD_RUN_PATH antes de executar seu cliente.
Se voc estiver usando o compilador Fujitsu (fcc / FCC) voc ter alguns problemas compilan-
do o MySQL porque os arquivos de cabealho Linux so muito orientados ao gcc.
A seguinte linha configure deve funcionar com fcc/FCC:
CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE \
-DCONST=const -DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib \
-K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=const \
-Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO \
'-D_EXTERN_INLINE=static __inline'" ./configure --prefix=/usr/local/mysql \
--enable-assembler --with-mysqld-ldflags=-all-static --disable-shared \
--with-low-memory
2.6.2.1. Notas Linux para distribuies binrias
O MySQL necessita pelo menos do Linux verso 2.0
Aviso: Percebemos que alguns usurios do MySQL tiveram serios problemas de estabilidade com o
MySQL e o kernel 2.2.14 do Linux. Se voc estiver usando este kernel voc deve atualiz-lo para o
2.2.19 (ou posterior) ou para o kernel 2.4. Se voc tiver um gabinete multi-cpu, ento voc deve
considerar seriamente o uso do kernel 2.4 uma vez que ele lhe trar uma melhora significante na ve-
locidade.
A verso binria ligada com -static, que significa que voc normalmente no precisa se preo-
cupar com qual verso das bibliotecas do sistema voc tem. Voc no precisa instalar LinuxThreads.
Um programa ligado com a opo -static um pouco maior que um programa ligado dinamica-
mente e tambm um pouco mais rpido (3-5%). Um problema, entretanto, que voc no pode usar
funes definidas pelo usurio (UDF) com um programa ligado estaticamente. Se voc for escrever
ou usar funes UDF (isto algo para programadores C ou C++), voc deve compilar o MySQL,
usando ligaes dinamicas.
Se voc estiver usando um sistema baseado em libc (em vez de um sistema glibc2), voc, pro-
vavelmente, ter alguns problemas com resoluo de nomes de mquinas e getpwnam() com a
verso binria. (Isto porque o glibc infelizmente depende de algumas bibliotecas externas para
resolver nomes de mquinas e getpwent(), mesmo quando compilado com -static). Neste
Instalao do MySQL
129
caso, voc provavelmente obter a seguinte mensagem de erro quando executar
mysql_install_db:
Sorry, the host 'xxxx' could not be looked up
ou o seguinte erro quando voc tentar executar mysqld com a opo --user:
getpwnam: No such file or directory
Voc pode resolver este problema usando de um dos modos seguintes:
Obtenha uma distribuio fonte do MySQL (uma distribuio RPM ou tar.gz) e a instale.
Execute mysql_install_db --force; Isto no executar o teste resolveip no
mysql_install_db. O lado ruim que voc no poder usar nomes de mquinas nas tabelas
de permisses; voc deve usar nmeros IP no lugar (exceto para localhost). Se voc estiver
usando uma release antiga do MySQL que no suporte --force, voc deve remover o teste
resolveip no mysql_install com um editor.
Inicie mysqld com su no lugar de usar --user.
As distribuies binrias Linux-Intel e RPM do MySQL so configuradas para o mximo de desem-
penho possvel. Ns sempre tentamos usar o compilador mais rpido e estvel disponvel.
Suporte MySQL ao Perl exige Perl Verso 5.004_03 ou mais novo.
Em algumas verses 2.2 do kernel Linux,voc pode obter o erro Resource temporarily
unavailable quando voc faz vrias novas conexes para um servidor mysqld sobre TCP/IP.
O problema que o Linux tem um atraso entre o momento em que voc fecha um socket TCP/IP at
que ele seja realmente liberado pelo sistema. Como s existe espao para um nmero finito de slots
TCP/IP, voc ir obter o erro acima se voc tentar fazer muitas novas conexes TCP/IP durante um
pequeno tempo, como quando voc executa o benchmark do MySQL test-connect sobre TCP/
IP.
Ns enviamos emails sobre este problema vrias vezes para diferentes listas de discusso Linux mas
nunca conseguimos resolver este problema apropriadamente.
A nica 'correo' conhecida , para este problema usar conexes persistentes nos seus clientes ou
usar sockets, se voc estiver executando o servidor de banco de dados e clientes na mesma mquina.
Ns experamos que o kernel Linux 2.4 corrija este problema no futuro.
2.6.2.2. Notas Linux x86
O MySQL exige a verso 5.4.12 ou mais nova da libc. Sabe-se que funciona com a libc 5.4.46.
A verso 2.0.6 e posterior da glibc tambm deve funcionar. Existem alguns problemas com os
RPMs glibc da RedHat, portanto se voc tiver problemas, confira se existe alguma atualizao!
Sabemos que os RPMs glibc 2.0.7-19 e 2.0.7-29 funcionam.
Se voc estiver usando o Red Hat 8.0 ou uma nova biblioteca glibc 2.2.x, voc deve iniciar o
mysqld com a opo --thread-stack=192K (Use -O thread_stack=192K antes
do MySQL 4). Se voc no fizer isto o mysqld finlizar em gethostbyaddr() porque a nova
biblioteca glibc exige mais de 128K de memria na pilha para esta chamada. Este tamanho de pilha
o padro agora no MySQL 4.0.10 e acima.
Se voc est usando o gcc 3.0 e acima para compilar o MySQL, voc deve instalar a biblioteca
libstdc++v3 antes de compilar o MySQL; se voc no fizer isto, voc obter um erro sobre um
smbolo __cxa_pure_virtual perdido durante a ligao.
Em algumas distribuies Linux mais antigas, configure pode produzir um erro como este:
Instalao do MySQL
130
Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file.
See the Installation chapter in the Reference Manual.
Faa apenas o que a mensagem de erro diz e adicione um caractere sublinhado para a macro _P que
tem somente um caractere sublinhado e ento tente novamente.
Voc pode obter alguns aviso quando estiver compilando; os mostrados abaixo podem ser ignora-
dos:
mysqld.cc -o objs-thread/mysqld.o
mysqld.cc: In function `void init_signals()':
mysqld.cc:315: warning: assignment of negative value `-1' to
`long unsigned int'
mysqld.cc: In function `void * signal_hand(void *)':
mysqld.cc:346: warning: assignment of negative value `-1' to
`long unsigned int'
O mysql.server pode ser encontrado no diretrio share/mysql sob o diretrio de instalao
MySQL ou no diretrio support-files da rvore fonte MySQL.
Se o mysqld sempre descarregar um core na inicializao, o problema pode ser que voc tenha um
antigo /lib/libc.a. Tente renome-lo depois remova sql/mysqld e faa um novo make
install e tente novamente. Este problema foi relatado em algumas instalaes Slackware.
Se voc obter o seguinte erro quando ligar o mysqld, significa que seu libg++.a no est insta-
lado corretamente:
/usr/lib/libc.a(putc.o): In function `_IO_putc':
putc.o(.text+0x0): multiple definition of `_IO_putc'
Voc pode evitar o uso de libg++.a executando configure desta forma:
shell> CXX=gcc ./configure
2.6.2.3. Notas Linux SPARC
Em algumas implementaes, readdir_r() est quebrada. O sintoma que SHOW DATABASES
sempre retorna um conjunto vazio. Isto pode ser corrigido removendo HAVE_READDIR_R do
config.h depois de configurar e antes de compilar.
2.6.2.4. Notas Linux Alpha
O MySQL Verso 3.23.12 a primeira verso do MySQL que testada no Linux-Alpha. Se voc
planeja usar o MySQL no Linux-Alpha, voc deve ter certeza que possui esta verso ou mais nova.
Temos testado o MySQL no Alpha com nossos pacotes de benchmarks e testes, e ele parece funci-
nar muito bem.
Quando ns compilamos o binrios MySQL padres, ns estvamos usando SuSE 6.4, kernel
2.2.13-SMP, Compilador C Compaq (V6.2-504) e compilador C++ Compaq (V6.3-005) em uma
mquina Compaq DS20 com um processador Alpha EV6.
Voc pode encontrar os compiladores acima em http://www.support.compaq.com/alpha-tools. Usan-
do estes compiladores, em vez do gcc, obtemos 9-14 % de melhora na performance com MySQL.
Note que a linha de configurao otimiza o binrio para a CPU atual; isto significa que voc s pode
utilizar nosso binrio se voc tiver um processador Alpha EV6. Ns tambm compilamos estatica-
mente para evitar problemas de bibliotecas.
A partir das prximas distribuies adicionamos o parmetro -arch generic em nossas opes
Instalao do MySQL
131
de compilao, o qual assegura que o binrio execute em todos os processadores Alpha. Ns tam-
bm 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 des-
carregar um arquivo core no incio. Em outras palavras, NO use -
-with-mysqld-ldflags=-all-static com gcc.
2.6.2.5. Notas Linux PowerPC
O MySQL deve funcionar no MkLinux com o mais novo pacote glibc (testado com glibc
2.0.7).
2.6.2.6. Notas Linux MIPS
Para ter o MySQL funcionando no Qube2. (Linux Mips), voc precisar das bibliotecas glibc
mais novas (Sabemos que glibc-2.0.7.29C2 funciona). Voc tambm deve usar o compilador
egcs C++ (egcs-1.0.2-9, gcc 2.95.2 ou mais nova).
2.6.2.7. Notas Linux IA-64
Para conseguir compilar o MySQL no Linux Ia64, usamos a seguinte linha de compilao: Usando
gcc-2.96:
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc \
CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors \
-fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql \
"--with-comment=Official MySQL binary" --with-extra-charsets=complex
No Ia64 os binrios do cliente MySQL esto usando bibliotecas compartilhadas. Isto significa se vo-
c instalar nossa distribuio binrias em algum outro lugar diferente de /usr/local/mysql vo-
c precisa modificar o /etc/ld.so.conf ou adicionar o caminho da o diretrio onde est locali-
zado o libmysqlclient.so na varivel de ambiente LD_LIBRARY_PATH.
See Seco A.3.1, Problemas de Ligao com a Biblioteca do Cliente MySQL.
2.6.3. Notas Solaris
No Solaris, voc deve ter problemas mesmo antes de descompactar a distribuio MySQL! O tar
do Solaris no pode tratar grandes nomes de arquivos, portanto voc pode ver um erro deste tipo
quando descompactar o MySQL:
Instalao do MySQL
132
x mysql-3.22.12-beta/bench/Results/ATIS-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase, 0 bytes, 0 tape blocks
tar: directory checksum error
Neste caso, voc deve usar o GNU tar (gtar) para desempacotar a distribuio. Voc pode en-
contrar 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 anterio-
res, 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 de-
ve 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 con-
figure 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 parme-
tros 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 exigi-
das 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 adicio-
nando LIBS=-lrt para a linha de configurao
Instalao do MySQL
133
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 inclu-
de 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 ar-
quivos 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.
Instalao do MySQL
134
Se voc est ligando seu prprio cliente MySQL, voc deve obter o seguinte erro quando tentar exe-
cut-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 (em vez de -Lpath): -
Wl,r/full-path-to-libmysqlclient.so.
Copie o arquivo libmysqclient.so para /usr/lib.
Adicione o caminho do diretrio onde libmysqlclient.so est localizado varivel de
ambiente LD_RUN_PATH antes de executar seu cliente.
Se voc tiver problemas com o configure tentando ligar com -lz e voc no tem a zlib instalada,
voc ter duas opes:
Se voc deseja usar o protocol de comunio de compactado voc precisar obter e instalar a
zlib from ftp.gnu.org.
Configure com --with-named-z-libs=no.
Se voc estiver usando o gcc e tiver problemas carregando funes UDF no MySQL, tente adicionar
-lgcc para a linha de ligao para a funo UDF.
Se voc deseja que o MySQL inicie automaticamente, voc pode copiar support-fi-
les/mysql.server para /etc/init.d e criar um link simblico para ele, chamado /
etc/rc.3.d/S99mysql.server.
Como o Solaris no suporta core files para aplicaes setuid(), voc no pode obter um core file
do mysqld se voc estiver usando a opo --user.
2.6.3.1. Notas Solaris 2.7/2.8
Voc pode utilizar normalmente um binrio Solaris 2.6 no Solaris 2.7 e 2.8. A maioria dos detalhes
do Solaris 2.6 tambm se aplicam ao Solaris 2.7 e 2.8.
Note que o MySQL verso 3.23.4 e superiores devem estar aptos para autodetectar novas verses do
Solaris e habilitar solues para os problemas seguintes!
Solaris 2.7 / 2.8 tem alguns bugs nos arquivos include. Voc pode ver o seguinte erro quando voc
usa o gcc:
/usr/include/widec.h:42: warning: `getwc' redefined
/usr/include/wchar.h:326: warning: this is the location of the previous
definition
Se isto ocorrer, voc pode fazer o seguinte para corrigir o problema:
Copie /usr/include/widec.h para .../lib/gcc-lib/os/gcc-version/include
e mude a linha 41 :
#if !defined(lint) && !defined(__lint)
para
#if !defined(lint) && !defined(__lint) && !defined(getwc)
Instalao do MySQL
135
Uma alternativa editar o /usr/include/widec.h diretamente. Desta forma, depois de fazer a
correo, voc deve remover o config.cache e executar o configure novamente !
Se voc obter erros como estes quando voc executar o make, porque o configure no encon-
trou o arquivo curses.h (provavelmente devido ao erro no arquivo
/usr/include/widec.h):
In file included from mysql.cc:50:
/usr/include/term.h:1060: syntax error before `,'
/usr/include/term.h:1081: syntax error before `;'
A soluo para isto fazer uma das seguintes opes:
Configure com CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H
./configure.
Edite o /usr/include/widec.h como indicado acima e re-execute o configure.
Remova a linha #define HAVE_TERM do arquivo config.h e execute make novamente.
Se o seu ligador tiver problemas para encontrar o -lz quando ligar ao seu programa cliente, prova-
velmente o problema que seu arquivo libz.so est instalado em /usr/local/lib. Voc po-
de corrigir isto usando um dos seguintes mtodos:
Adicione /usr/local/lib ao LD_LIBRARY_PATH.
Adicione um link para libz.so a partir de /lib.
Se voc estiver usando o Solaris 8, voc pode instalar a zlib opcional do CD de distribuio do
Solaris 8.
Configure o MySQL com a opo --with-named-z-libs=no.
2.6.3.2. Notas Solaris x86
No Solaris 8 no x86, mysqld ir descarregar um core se voc executar um 'strip' no mesmo.
Se voc estiver usando gcc ou egcs no Solaris X86 e voc tiver problemas com descarregos de
core, voc deve utilizar o seguinte comando configure:
CC=gcc CFLAGS="-O3 -fomit-frame-pointer -DHAVE_CURSES_H" \
CXX=gcc \
CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -DHAVE_CURSES_H" \
./configure --prefix=/usr/local/mysql
Isto ir evitar problemas com a biblioteca libstdc++ e com excees C++.
Se isto no ajudar, voc pode compilar uma verso com debug e execut-lo com um arquivo de ra-
treamento (trace) ou sob gdb. See Seco E.1.3, Depurando o mysqld no gdb.
2.6.4. Notas BSD
Esta seo fornece informao para os vrios tipos de BSD, assim como a verso especfica para
eles.
2.6.4.1. Notas FreeBSD
Instalao do MySQL
136
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 habili-
tada do FreeBSD.
Configurao e construo automtica.
Scripts de inicializao instalados em /usr/local/etc/rc.d.
Habilidade para ver quais arquivos esto instalados com pkg_info -L. E para remover todos com
pkg_delete se voc no quiser mais o MySQL na mquina.
recomendado que voc utilize MIT-pthreads no FreeBSD 2.x e threads nativas nas Verses 3 e su-
periores. 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 thre-
ads, principalmente a funo gethostbyname(), que usada pelo MySQL para converter nomes
de mquinas em endereos IPs. Sob certas circunstncias, o processo mysqld ir criar repentina-
mente 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 com-
parao muito boa do LinuxThreads vs. threads nativas d uma olhada no artigo "FreeBSD or Linux
for your MySQL Server?" de Jeremy Zawodny em
http://jeremy.zawodny.com/blog/archives/000697.html
Os problemas conhecidos usando LinuxThreads na FreeBSD so:
wait_timeout no est funcionando (provavemente problema de manipulao do signal em
FreeBSD/LinuxThreads). Isto deveria ter sido corrigido no FreeBSD 5.0. O sintome que cone-
xes persistentes podem se manter por um longo tempo sem serem fechadas.
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
Instalao do MySQL
137
./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 configu-
re 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 au-
mente 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 no-
me_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 aju-
dar. See Apndice F, Variveis de Ambientes do MySQL.
Para obter um sistema seguro e estvel voc deve usar somente kernels FreeBSD que estejam mar-
cados com -STABLE.
2.6.4.2. Notas NetBSD
Para compilar no NetBSD voc precisa do GNU make. De outra forma o compilador quebraria
quando o make tentasse executar lint em arquivos C++.
2.6.4.3. Notas OpenBSD
No OpenBSD Verso 2.5, voc pode compilar o MySQL com threads nativas com as seguintes op-
es:
CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no
2.6.4.4. Notas OpenBSD 2.8
Nossos usurios relataram que o OpenBSD 2.8 tem um bug nas threads que causa problemas com o
MySQL. Os desenvolvedores do OpenBSD j corrigiram o problema, mas em 25 de Janeiro de 2001
a correo foi disponvel apenas no ramo ``-current''. Os sintomas deste bug nas threads so: respos-
ta lenta, alta carga, alto uso de CPU e quedas do servidor.
Se voc obter um erro como Error in accept:: Bad file descriptor ou erro 9 ao
tentar abrir tabelas ou diretrios, o problema provavelmente que voc no alocou memria sufici-
ente para os descritores de arquivo do MySQL.
Neste caso tente iniciar o mysqld_safe como root com as seguintes opes:
shell> mysqld_safe --user=mysql --open-files-limit=2048 &
2.6.4.5. Notas BSDI Verso 2.x
Instalao do MySQL
138
Se voc obter o seguinte erro quando estiver compilando o MySQL, seu valor ulimit para mem-
ria 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 esti-
ver 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 con-
figure estar apto a compilar o sql_yacc.cc.
Se voc tiver problemas com a data atual no MySQL, configurar a varivel TZ provavelmente aju-
dar. See Apndice F, Variveis de Ambientes do MySQL.
2.6.4.6. Notas BSD/OS Verso 3.x
Atualize para BSD/OS Verso 3.1. Se isto no for possvel, instale BSDIpatch M300-038.
Use o seguinte comando quando configurar o MySQL:
shell> env CXX=shlicc++ CC=shlicc2 \
./configure \
--prefix=/usr/local/mysql \
--localstatedir=/var/mysql \
--without-perl \
--with-unix-socket-path=/var/mysql/mysql.sock
O comeando seguinte tambm funciona:
shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 \
./configure \
--prefix=/usr/local/mysql \
--with-unix-socket-path=/var/mysql/mysql.sock
Voc pode alterar as localizaes dos diretrios se voc desejar, ou apenas usar os padres no espe-
cificando nenhuma localizao.
Se voc tiver problemas com performance sob alta carga, tente usar a opo -
-skip-thread-priority para mysqld! Isto ir executar todas as threads com a mesma prio-
ridade; no BSDI verso 3.1, isto fornece melhor performance (pelo menos at o BSDI corrigir seu
organizador de threads).
Se voc obter o erro virtual memory exhausted enquanto estiver compilando, deve tentar
usar ulimit -v 80000 e executar make novamente. Se isto no funcionar e voc estiver usan-
do bash, tente trocar para csh ou sh; alguns usurios BSDI relataram problemas com bash e
ulimit.
2.6.4.7. Notas BSD/OS Verso 4.x
O BSDI Verso 4.x tem alguns bugs relacionados s threads. Se voc deseja usar o MySQL nesta
verso, voc deve instalar todas as correes relacionadas s threads. Pelo menos a M400-23 deve
estar instalada.
Em alguns sistemas BSDI verso 4.x, voc pode ter problemas com bibliotecas compartilhadas. O
sintoma que voc no pode executar nenhum programa cliente, por exemplo, mysqladmin. Nes-
te caso voc precisa reconfigurar o MySQL, para ele no usar bibliotecas compartilhadas, com a op-
o --disable-shared.
Instalao do MySQL
139
Alguns clientes tiveram problemas no BSDI 4.0.1 que o binrio do mysqld no conseguia abrir ta-
belas depois de um tempo em funcionamento. Isto porque alguns bugs relacionados a biblioteca/sis-
tema 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 pa-
ra outro diretrio ou fazer um link simblico a uma tabela para outro banco de dados no BSDI!
(Criar um link simblico para outro disco funciona).
2.6.5. Notas Mac OS X
2.6.5.1. Mac OS X 10.x
O MySQL deve funcionar sem problemas no Mac OS X 10.x (Darwin). Voc no precisa dos pat-
ches pthread para este SO.
Isto tambm se aplica ao Mac OS X 10.x Server. A compilao para a plataforma Server a mesma
para a verso cliente do Mac OS X. No entanto note que o MySQL vem preinstalado no Servidor !
Nosso binrio para Mac OS X compilado no Darwin 6.3 com a seguinte linha de configurao:
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc \
CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors \
-fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql \
--with-extra-charsets=complex --enable-thread-safe-client \
--enable-local-infile --disable-shared
See Seco 2.1.3, Instalando o MySQL no Mac OS X.
2.6.5.2. Mac OS X Server 1.2 (Rhapsody)
Antes de tentar configurar o MySQL no MAC OS X server 1.2 (aka Rhapsody), primeiro voc deve
instalar o pacote pthread encontrado em: http://www.prnet.de/RegEx/mysql.html.
See Seco 2.1.3, Instalando o MySQL no Mac OS X.
2.6.6. Notas de Outros Unix
2.6.6.1. Notas HP-UX para distribuies binrias
Alguma das distribuies binrias do MySQL para HP-UX distribuida como um arquivo depot da
HP e como um arquivo tar. Para usar o arquivo depot voc deve estar executando pelo menos o HP-
UX 10.x para ter acesso s ferramentas de arquivos depot da HP.
A verso HP do MySQL foi compilada em um servidor HP 9000/8xx sob HP-UX 10.20, usando
MIT-pthreads. Sob esta configurao o MySQL funciona bem. O MySQL Verso 3.22.26 e mais
novas tambm podem ser construidas com o pacote thread nativo da HP.
Outras configuraes que podem funcionar:
HP 9000/7xx executando HP-UX 10.20+
HP 9000/8xx executando HP-UX 10.30
As seguintes configuraes definitivamente no funcionaro:
Instalao do MySQL
140
HP 9000/7xx ou 8xx executando HP-UX 10.x where x < 2
HP 9000/7xx ou 8xx executando HP-UX 9.x
Para instalar a distribuio, utilze um dos comandos abaixo, onde /path/to/depot o caminho
completo do arquivo depot:
Para instalar tudo, incluindo o servidor, cliente e ferramentas de desenvolvimento:
shell> /usr/sbin/swinstall -s /path/to/depot mysql.full
Para instalar somente o servidor:
shell> /usr/sbin/swinstall -s /path/to/depot mysql.server
Para instalar somente o pacote cliente:
shell> /usr/sbin/swinstall -s /path/to/depot mysql.client
Para instalar somente as ferramentas de desenvolvimento:
shell> /usr/sbin/swinstall -s /path/to/depot mysql.developer
O depot copia os binrios e bibliotecas em /opt/mysql e dados em /var/opt/mysql. O depot
tambm cria as entradas apropriadas em /etc/init.d e /etc/rc2.d para iniciar o servidor
automaticamente na hora do boot. Obviamente, para instalar o usurio deve ser o root.
Para instalar a distribuio HP-UX tar.gz, voc deve ter uma cpia do GNU tar.
2.6.6.2. Notas HP-UX Verso 10.20
Existem alguns pequenos problemas quando compilamos o MySQL no HP-UX. Ns recomendamos
que voc use o gcc no lugar do compilador nativo do HP-UX, porque o gcc produz um cdigo me-
lhor!
Ns recomendamos o uso do gcc 2.95 no HP-UX. No utilize opes de alta otimizao (como -
O6) ja que isto pode no ser seguro no HP-UX.
A seguine linha do configure deve funcionar com o gcc 2.95:
CFLAGS="-I/opt/dce/include -fpic" \
CXXFLAGS="-I/opt/dce/include -felide-constructors -fno-exceptions \
-fno-rtti" CXX=gcc ./configure --with-pthread \
--with-named-thread-libs='-ldce' --prefix=/usr/local/mysql --disable-shared
A seguinte linha do configure deve funcionar com o gcc 3.1:
CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc \
CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions \
-fno-rtti -O3 -fPIC" ./configure --prefix=/usr/local/mysql \
--with-extra-charsets=complex --enable-thread-safe-client \
--enable-local-infile --with-pthread \
--with-named-thread-libs=-ldce --with-lib-ccflags=-fPIC
--disable-shared
2.6.6.3. Notas HP-UX Verso 11.x
Instalao do MySQL
141
Para HP-UX Verso 11.x ns recomendamos o MySQL Verso 3.23.15 ou posterior.
Por causa de alguns bugs crticos nas bibliotecas padro do HP-UX, voc deve instalar as seguintes
correes antes de tentar executar o MySQL no HP-UX 11.0:
PHKL_22840 Streams cumulative
PHNE_22397 ARPA cumulative
Isto ir resolver um problema que tem como retorno EWOLDBLOCK de recv() e EBADF de ac-
cept() em aplicaes threads.
Se voc estiver usando gcc 2.95.1 em um sistema HP-UX 11.x sem correes, voc obter o erro:
In file included from /usr/include/unistd.h:11,
from ../include/global.h:125,
from mysql_priv.h:15,
from item.cc:19:
/usr/include/sys/unistd.h:184: declaration of C function ...
/usr/include/sys/pthread.h:440: previous declaration ...
In file included from item.h:306,
from mysql_priv.h:158,
from item.cc:19:
O problema que o HP-UX no define consistentemente a pthreads_atfork(). Ela tem prot-
tipos coflitantes em /usr/include/sys/unistd.h:184 e /
usr/include/sys/pthread.h:440 (detalhes abaixo).
Uma soluo copiar /usr/include/sys/unistd.h em mysql/include e editar
unistd.h alterando-o para coincidir com a definio em pthread.h. Aqui est o diff:
183,184c183,184
< extern int pthread_atfork(void (*prepare)(), void (*parent)(),
< void (*child)());
---
> extern int pthread_atfork(void (*prepare)(void), void (*parent)(void),
> void (*child)(void));
Depois disto, a seguinte linha configure deve funcionar:
CFLAGS="-fomit-frame-pointer -O3 -fpic" CXX=gcc \
CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -O3" \
./configure --prefix=/usr/local/mysql --disable-shared
Segue algumas inforamaes que um usurio do HP-UX Verso 11.x nos enviou sobre compilao
do MySQL com o compilador HP-UX:
CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure --with-extra-character-set=complex
Voc pode ignorar qualquer erro do tipo:
aCC: warning 901: unknown option: `-3': use +help for online documentation
Se voc obter o seguinte erro do configure
checking for cc option to accept ANSI C... no
configure: error: MySQL requires a ANSI C compiler (and a C++ compiler).
Try gcc. See the Installation chapter in the Reference Manual.
Confira se voc no tem o caminho para o compilador K&R antes do caminho para o compilador C
e C++ do HP-UX.
Instalao do MySQL
142
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 rela-
tos de alguns usurios de que esses binrios funcionam bem no HP-UX 11.00. Se voc encontrar
problemas, verifique o nvel do pacth de seu HP-UX.
2.6.6.4. Notas IBM-AIX
Deteco automtica de xlC est faltando no Autoconf, portando um comando configure deste
tipo necessrio quando estiver compilando o MySQL (Este exemplo usa o compilador IBM):
export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 "
export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192"
export CFLAGS="-I /usr/local/include"
export LDFLAGS="-L /usr/local/lib"
export CPPFLAGS=$CFLAGS
export CXXFLAGS=$CFLAGS
./configure --prefix=/usr/local \
--localstatedir=/var/mysql \
--sysconfdir=/etc/mysql \
--sbindir='/usr/local/bin' \
--libexecdir='/usr/local/bin' \
--enable-thread-safe-client \
--enable-large-files
Acima esto as opes usadas para compilar a distribuio MySQL que pode ser encontrada em
http://www-frec.bull.com/.
Se voc alterar o -O3 para -O2 na linha de configurao acima, voc tambm deve remover a op-
o -qstrict (isto uma limitao no compilador C da IBM).
Se voc estiver usando gcc ou egcs para compilar o MySQL, voc DEVE usar a opo -
fno-exceptions, j que o manipulador de excees no gcc/egcs no seguro para threads!
(Isto foi testado com egcs 1.1). Existem tambm alguns problemas conhecidos com o assembler da
IBM que pode gerar cdigo errado quando usado com gcc.
Ns recomendamos a seguinte linha do configure com egcs e gcc 2.95 no AIX:
CC="gcc -pipe -mcpu=power -Wa,-many" \
CXX="gcc -pipe -mcpu=power -Wa,-many" \
CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \
./configure --prefix=/usr/local/mysql --with-low-memory
O -Wa,-many necessrio para o compilador ser bem sucedido. IBM est ciente deste problema
mas no est com pressa de corrig-lo devido ao fato do problema poder ser contornado. Ns no sa-
bemos se o -fno-exceptions necessrio com gcc 2.9.5, mas como o MySQL no utiliza
excees e a opo acima gera cdigo mais rpido, recomendamos que voc sempre use esta opo
com o egcs/gcc.
Se voc tiver algum problema com cdigo assembler tente alterar o -mcpu=xxx para o seu processa-
dor. Normalmente power2, power ou powerpc podem ser usados, de uma maneira alternativa voc
pode precisar usar 604 ou 604e. No tenho certeza mas acredito que usar "power" deve satisfazer a
maioria dos casos, mesmo em uma mquina power2.
Se voc no sabe qual o seu processador, utilize o comando "uname -m", isto ir fornecer a voc
uma string que parece com "000514676700", com um formato de xxyyyyyymmss onde xx e ss so
sempre 0s, yyyyyy o ID nico do sistema e mm o ID da CPU Planar. Uma tabela destes valores
podem ser encontrados em
http://publib.boulder.ibm.com/doc_link/en_US/a_doc_lib/cmds/aixcmds5/uname.htm. Isto ir lhe
fornecer um tipo de mquina e um modelo de mquina que voc pode usar para determinar que tipo
de cpu voc tem.
Se voc tiver problemas com sinais (MySQL finaliza sem notificao sob alta carga) voc pode ter
Instalao do MySQL
143
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 clien-
tes que esto ``dormindo'' em uma conexo com mysqladmin kill ou mysqladmin shut-
down. 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 em:
http://publib16.boulder.ibm.com/pseries/en_US/aixprggd/genprogc/lrg_prg_support.htm.
2.6.6.5. Notas SunOS 4
No SunOS 4, necessrio a MIT-pthreads para compilar o MySQL, o que significa que voc precisa
do GNU make.
Alguns sistemas SunOS 4 tem problemas com bibliotecas dinmicas e libtool. Voc pode usar a
seguinte linha do configure para evitar este problema:
shell> ./configure --disable-shared --with-mysqld-ldflags=-all-static
Quando compilando readline, voc pode obter alguns avisos sobre definies duplicadas que po-
dem ser ignoradas.
Ao compilar o mysqld, vo existir alguns alertas sobre implicit declaration of func-
tion que tambm podem ser ignoradas.
2.6.6.6. Notas Alpha-DEC-UNIX (Tru64)
Se voc est usando o egcs 1.1.2 no Digital Unix, voc atualizar par o gcc 2.95.2, j que o egcs no
DEC tem vrios erros graves !
Instalao do MySQL
144
Quando compilando programas com threads no Digital Unix, a documentao recomenda usar a op-
o -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 detec-
tar erros e no alertas.
Se voc inicia o servidor diretamente da linha de comando, voc pode ter problemas com a finaliza-
o 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 usan-
do 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 exem-
plo acima, quando estiver ligando ao mysqld, voc deve conseguir contornar este problema usan-
do:
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
Instalao do MySQL
145
2.6.6.7. Notas Alpha-DEC-OSF1
Se voc tiver problemas com compilao e tem o DEC CC e o gcc instalados, tente executar o
configure desta forma:
CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \
./configure --prefix=/usr/local/mysql
Se voc tiver problemas com o arquivo c_asm.h, voc pode criar e usar um arquivo c_asm.h
'burro' com:
touch include/c_asm.h
CC=gcc CFLAGS=-I./include \
CXX=gcc CXXFLAGS=-O3 \
./configure --prefix=/usr/local/mysql
Perceba que os seguintes problemas com o programa ld pode ser corrigido fazendo o download do
ltimo kit de atualizao da DEC (Compaq) de http://ftp.support.compaq.com/public/unix/.
Com o OSF1 V4.0D e o compilador "DEC C V5.6-071 no Digital Unix V4.0 (Rev. 878)" o compi-
lador tem alguns comportamentos estranhos (simbolos asm indefinidos). /bin/ld tambm apare-
ce estar quebrado (problemas com erros _exit undefined ocorrendo ao ligar no mysqld).
Neste sistema, temos compilado o MySQL com a seguinte linha configure, depois de substituir
/bin/ld com a verso do OSF 4.0C:
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
Com o compilador da Digital "C++ V6.1-029", o seguinte deve funcionar:
CC=cc -pthread
CFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all \
-arch host
CXX=cxx -pthread
CXXFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all \
-arch host -noexceptions -nortti
export CC CFLAGS CXX CXXFLAGS
./configure --prefix=/usr/mysql/mysql --with-mysqld-ldflags=-all-static \
--disable-shared --with-named-thread-libs="-lmach -lexc -lc"
Em algumas verses do OSF1, a funo alloca() est quebrada. Corrija isto removendo a linha
no config.h que define 'HAVE_ALLOCA'.
A funo alloca() pode tambm ter um prottipo incorreto em /usr/include/alloca.h.
O alerta resultante deste erro pode ser ignorado.
configure ir usar a seguinte biblioteca thread automaticamente: -
-with-named-thread-libs="-lpthread -lmach -lexc -lc".
Quando usar o gcc, voc tambm pode tentar executar configure desta forma:
shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure ....
Se voc tiver problemas com sinais (MySQL finalzar inesperadamente sobre alta carga), voc pode
ter encontrado um erro com threads e sinais no SO. Neste caso voc pode dizer ao MySQL para no
usar sinais configurando-o com:
shell> CFLAGS=-DDONT_USE_THR_ALARM \
CXXFLAGS=-DDONT_USE_THR_ALARM \
./configure ...
Instalao do MySQL
146
Isto no afeta a performance do MySQL, mas tem efeitos colaterais que no permitem finalizar cli-
entes 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 al-
gumas opo -O na sua linha de compilao.) Depois disto feito voc deve apenas voltar ao diret-
rio superior e executar make novamente.
2.6.6.8. Notas SGI Irix
Se voc estiver usando Irix Verso 6.5.3 ou mais novo, o mysqld s ir conseguir criar threads se
voc execut-lo como um usurio com privilgios de CAP_SCHED_MGT (como root) ou dar ao
servidor mysqld este privilgio com o seguinte comando shell:
shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld
Voc pode precisar indefinir alguns simbolos em config.h depois de executar configure e an-
tes de compilar.
Em algumas implementaes Irix, a funo alloca() est quebrada. Se o servidor mysqld mor-
rer em alguma instruo SELECT, remova as linhas de config.h que definem HAVE_ALLOC e
HAVE_ALLOC_H. Se mysqladmin create no funciona, remova a linha do config.h que
define HAVE_READDIR_R. Voc tambm deve precisar remover a linha HAVE_TERM_H.
A SGI recomenda que voc instale todos os patches desta pgina:
http://support.sgi.com/surfzone/patches/patchset/6.2_indigo.rps.html
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 executan-
do, o sistema fica lento. Pode se evitar isto iniciando outro cliente. Isto pode acarretar num cresci-
mento 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 re-
solvido.
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 \
Instalao do MySQL
147
--with-named-thread-libs=-lpthread
No Irix 6.5.11 com Irix C nativo e compiladores C++ ver. 7.3.1.2, o seguinte ir funcionar
CC=cc CXX=CC CFLAGS='-O3 -n32 -TARG:platform=IP22 -I/usr/local/include \
-L/usr/local/lib' CXXFLAGS='-O3 -n32 -TARG:platform=IP22 \
-I/usr/local/include -L/usr/local/lib' ./configure \
--prefix=/usr/local/mysql --with-innodb --with-berkeley-db \
--with-libwrap=/usr/local \
--with-named-curses-libs=/usr/local/lib/libncurses.a
2.6.6.9. Notas SCO
A verso atual foi testado somente nos sistemas ``sco3.2v5.0.4'' e ``sco3.2v5.0.5''. A versoo para o
``sco 3.2v4.2'' tambm tem tido muito progresso.
At o momento o compilador recomendado no OpenServer o gcc 2.95.2. Com isto voc deve estar
apto a compilar o MySQL apenas com:
CC=gcc CXX=gcc ./configure ... (opes)
1. Para o OpenServer 5.0.X voc precisa usar gcc-2.95.2p1 ou mais novo da Skunkware.
http://www.SCO.com/skunkware/ e ecolher o pacote OpenServer browser ou por ftp em ftp to
ftp2.SCO.com no diretrio pub/skunkware/osr5/devtools/gcc.
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 ob-
ter 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 Open-
Desktop 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. Para construir a FSU Pthreads no seu sistema, faa o seguinte:
a. Execute ./configure no diretrio threads/src e selecione a opo SCO OpenSer-
ver. 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. Lembre de usar o GNU make quando estiver construindo o MySQL.
7. Se voc no iniciou o mysqld_safe como root, voc provavelmente s ir obter, por 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:
Instalao do MySQL
148
shell> ./configure --prefix=/usr/local/mysql --disable-shared
9. Com SCO 3.2V4.2, voc deve usar FSU Pthreads verso 3.5c ou mais nova. O seguinte coman-
do configure deve funcionar:
shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \
./configure \
--prefix=/usr/local/mysql \
--with-named-thread-libs="-lgthreads -lsocket -lgen -lgthreads" \
--with-named-curses-libs="-lcurses"
Voc pode ter alguns problemas com alguns arquivos de incluso. Neste caso, voc pode en-
contrar novos arquivos de incluso especficos do SCO em
http://www.mysql.com/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz. Voc deve descompac-
tar este arquivo no diretrio include da sua rvore fonte do MySQL.
Notas de desenvolvimento SCO:
O MySQL deve detectar automaticamente FSU Pthreads e ligar o mysqld com -lgthreads
-lsocket -lgthreads.
As bibliotecas de desenvolvimento SCO so re-entrantes nas FSU Pthreads. A SCO diz que suas
bibliotecas de funes so re-entrantes, ento elas devem ser re-entrantes com as FSU-Pthreads.
FSU Pthreads no OpenServer tentam usar o esquema SCO para criar bibliotecas re-entrantes.
FSU Pthreads (ao menos a verso em http://www.mysql.com) vem ligada com GNU malloc.
Se voc encontrar problemas com uso de memria, tenha certeza que o gmalloc.o esteja in-
cludo em libgthreads.a e libgthreads.so.
Na FSU Pthreads, as seguintes chamadas de sistema so compatveis com pthreads: read(),
write(), getmsg(), connect(), accept(), select() e wait().
O CSSA-2001-SCO.35.2 (O patch listado de costume como patch de segurana
erg711905-dscr_remap ver 2.0.0) quebra FSU threads e deixa o mysqld instvel. Voc deve re-
move-lo se voc deseja executar o mysqld em uma mquina OpenServer 5.0.6.
A SCO fornece Patches do Sistema Operacional em ftp://ftp.sco.com/pub/openserver5 para
OpenServer 5.0.x
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
Correes de segurana pre-OSR506. Tamb a correo do telnetd em
ftp://stage.caldera.com/pub/security/openserver/ ou
ftp://stage.caldera.com/pub/security/openserver/CSSA-2001-SCO.10/ com a libsocket.so.2 e li-
bresolv.so.1 com instrues para instalar em sistemas pre-OSR506.
provavelmente uma boa idia para instalar os patches acima tentando compilar/usar o MySQL.
Se voc deseja instalar o DBI no SCO, voc deve editar o Makefile em DBI-xxx e cada subdire-
trio.
Note que o exemplo abaixo considera o gcc 2.95.2 ou mais novo:
OLD: NEW:
CC = cc CC = gcc
CCCDLFLAGS = -KPIC -W1,-Bexport CCCDLFLAGS = -fpic
CCDLFLAGS = -wl,-Bexport CCDLFLAGS =
Instalao do MySQL
149
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.
2.6.6.10. Notas SCO Unixware Version 7.0
Voc deve usar uma verso de MySQL pelo menos to recente quando a Verso 3.22.13 e UnixWa-
re 7.1.0 porque esta verso corrige alguns problemas de portabilidade sob o Unixware.
Ns temos compilado o MySQL com o seguinte comando configure no UnixWare Verso 7.1.x:
CC=cc CXX=CC ./configure --prefix=/usr/local/mysql
Se voc deseja usar o gcc, dever ser usado o gcc 2.95.2 ou mais novo.
CC=gcc CXX=g++ ./configure --prefix=/usr/local/mysql
1. A SCO fornece Patches do Sistema Operacional em ftp://ftp.sco.com/pub/unixware7 para
UnixWare 7.1.1 e 7.1.3 ftp://ftp.sco.com/pub/openunix8 para OpenUNIX 8.0.0
2. A SCO fornece informao sobre Security Fixes em ftp://ftp.sco.com/pub/security/OpenUNIX
para OpenUNIX ftp://ftp.sco.com/pub/security/UnixWare para UnixWare
2.6.7. Notas OS/2
O MySQL usa poucos arquivos aberto. Por isto, voc deve adicionar uma linha parecida com a abai-
xo em seu arquivo CONFIG.SYS:
SET EMXOPT=-c -n -h1024
Se voc no fizer isto, provavelmente vai ter o seguinte erro:
File 'xxxx' not found (Errcode: 24)
Quando usar o MysQL com OS/2 Warp 3, o FixPack 29 ou superior necessrio. Com OS/2 Warp
4, FixPack 4 ou acima necessrio. Isto uma exigncia da biblioteca Pthreads. O MySQL deve es-
tar instalado em uma partio que suporta nomes longos de arquivos como no HPFS, FAT32, etc.
O script INSTALL.CMD deve ser executado pelo prprio CMD.EXE do OS/2 e opde no funcionar
com shells substitutas como o 4OS2.EXE.
O script scripts/mysql-install-db foi renomeado. Agora ele chamado install.cmd
e um script REXX, que ir atualizar as configuraes padres de segurana do MySQL e criar os
cones na WorkPlace Shell para o MySQL.
Suporte a mdulos dinmicos compilado mas no totalmente testado. Mdulos dinmicos devem
Instalao do MySQL
150
ser compilados usando a biblioteca run-time Pthreads.
gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \
-o example udf_example.cc -L../lib -lmysqlclient udf_example.def
mv example.dll example.udf
Nota: Devido a limitaes no OS/2, o nome do mdulo UDF no deve esceder 8 caracteres. Mdu-
los so armazenados no diretrio /mysql2/udf; o script safe-mysqld.cmd ir colocar este
diretrio na varivel de ambiente BEGINLIBPATH. Quando usando mdulos UDF, extenses espe-
cficas so ignoradas --- consuidera-se que seja .udf. Por exemplo, no Unix, o mdulo comparti-
lhado deve ser nomeado example.so e voc deve carregar uma funo dele desta forma:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so";
No OS/2, o mdulo deve ter o nome de example.udf, mas voc no deve especificar a extenso
do mdulo:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example";
2.6.8. Notas Novell NetWare
Portar o MySQL para NetWare foi um grande esforo da Novell. Os clientes da Novell estaro
satisfeitos ao notarem que o NetWare 6.5 vir com os binrios do MySQL, completa com uma licen-
a de uso comercial automatica para todos os servidores executando esta verso do NetWare.
See Seco 2.1.4, Instalando o MySQL no NetWare.
MySQL para NetWare compilado usando um combinao do Metrowerks CodeWarrior
for NetWare e uma verso especial de compilao cruzada do GNU autotools. Verifique esta se-
o no futuro para mais informaes sobre construo e otimizao do MySQL para NetWare.
2.6.9. Notas BeOS
Ns j falamos com alguns desenvolvedores BeOS que disseram que o MySQL est 80% portado
para o BeOS, mas ns no sabemos qual a situao no momento.
2.7. Comentrios de Instalao do Perl
2.7.1. Instalando Perl no Unix
O suporte Perl para o MySQL fornecido pela interface cliente DBI/DBD. See Seco 12.5, API
Perl do MySQL. O cdigo do cliente Perl DBD/DBI exige Perl Verso 5.004 ou posterior. A inter-
face no funcionar se voc tiver uma verso mais do Perl.
O suporte MySQL Perl tambm exige que voc tenha instalado o suporte a programao do cliente
MySQL. Se voc instalou o MySQL a partir de arquivos RPM, os programas cliente esto no cliente
RPM, mas o suporte a programao do cliente est no RPM de desenvolvimento. Certifique de se
instalar este RPM posteriormente.
Na Verso 3.22.8, o suporte Perl distribudo separadamente do dsitribuio principal do MySQL.
Se voc quiser instalar o suporte Perl, os arquivos que voc precisr pode ser obtidos em
http://www.mysql.com/downloads/api-dbi.html.
As distribuies Perl so fornecidas como arquios tar compactados e so chamados MODULE-
VERSION.tar.gz, onde MODULE o nome do modulo e VERSION o nmero da verso. Voc
deve conseguir as distribuies Data-Dumper, DBI, e DBD-mysql e instal-las nesta ordem. O
procedimento de instalao mostrado aqui. O exemplo mostrado para o mdulo Data-Dumper,
mas o procedimento o mesmo para todas as distribuies:
Instalao do MySQL
151
1. Descompacte as distribuies no diretrio atual:
shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf -
Este comando cria um diretrio chamado Data-Dumper-VERSION.
2. Entre no diretrio principal da distribuio descompactada:
shell> cd Data-Dumper-VERSION
3. Contrua a dsitribuio e compile tudo:
shell> perl Makefile.PL
shell> make
shell> make test
shell> 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 no-
va distribuio do MySQL, particularmente se voc notar simntomas como se todos os seus scripts
DBI realizarem dump core depois de voc atualizar o MySQL.
Se voc no tem o direito para instalar os mdulos Perl no diretrio de sistema ou se voc quiser
instalar mdulos Perl locais, a seguinte referncia pode ajud-lo:
http://servers.digitaldaze.com/extensions/perl/modules.html#modules
Procure sob o ttulo Installing New Modules that Require Locally Installed
Modules.
2.7.2. Instalaando ActiveState Perl no Windows
Para instalar o mdulo DBD do MySQL com ActiveState Perl no Windows, voc deve fazer o segu-
inte:
Obter o ActiveState Perl em http://www.activestate.com/Products/ActivePerl/ e instal-lo.
Abrir um prompt do DOS.
Se exigido, configurar a varivel HTTP_proxy. Por exemplo, voc pode tentar:
set HTTP_proxy=my.proxy.com:3128
Inicie o progrma PPM:
C:\> c:\perl\bin\ppm.pl
Se voc j no o fez, instale o DBI:
ppm> install DBI
Se der tudo certo, execute o seguinte comando:
install \
Instalao do MySQL
152
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 conec-
tar ao servidor MySQL atravs do ODBC:
use DBI;
$dbh= DBI->connect("DBI:ODBC:$dsn",$user,$password) ||
die "Got error $DBI::errstr when connecting to $dsn\n";
2.7.3. Problemas Usando a Interface Perl DBI/DBD
Se Perl informar que no pode encontrar o mdulo ../mysql/mysql.so, ento o problema mais
provvel que o Perl no pode localizar a biblioteca compartilhada libmysqlclient.so.
Voc pode corrigir isto por qualquer um dos seguintes mtodos:
Compile a distribuio DBD-mysql com perl Makefile.PL -static -config em
vez de perl Makefile.PL.
Copie libmysqlclient.so para a diretrio onde sua bibliotecas compartilhadas esto loca-
lizadas (provavelmente /usr/lib ou /lib).
No Linux voc pode adicionar o caminho do diretrio onde libmysqlclient.so est locali-
zado ao arquivo /etc/ld.so.conf.
Adicione o caminho do diretrio onde libmysqlclient.so est localizada varivel de
ambiente LD_RUN_PATH.
Se voce receber os seguintes erros de DBD-mysql, voc provavelmente est usando gcc (ou usan-
do 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 ca-
so, 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";
Instalao do MySQL
153
Altere esta linha para:
$sysliblist .= " -lm -lz";
Depois disto, voc deve executar 'make realclean' e proceder com o instalao desde o incio.
Se voc quiser usar o mdulo Perl em um sistema que no suporta ligao dinmica (como SCO)
voc pode gerar uma verso esttica do Perl que inclui DBI e DBD-mysql. O modo que isto funci-
ona que voc gera uma verso do Perl com o odigo DBI ligado e instalado no topo do seu Perl
atual. Entao voc o utiliza para construir uma verso do Perl que adicionalmente tem o cdigo DBD
ligado em si, e instale-o.
No SCO, voc deve ter as seguintes variveis de ambiente configuradas:
shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib
ou
shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\
/usr/progressive/lib:/usr/skunk/lib
shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\
/usr/progressive/lib:/usr/skunk/lib
shell> MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:\
/usr/skunk/man:
Primeiro crie um Perl que inclui um mdulo DBI ligado estaticamente executando estes comandos
no diretrio onde a sua distribuio DBI est localiada:
shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl
Ento voc deve intalar o novo Perl. A sada de make perl indicar o comando make exato que
voc precisar executar para realizar a instalao. No SCO, isto make -f Makefile.aperl
inst_perl MAP_TARGET=perl.
A seguir use o Perl rcem criado para criar outro Perl que tambm inclui uma DBD::mysql estati-
camente ligado rodando estes comandos no diretrio onde sua distribuio DBD-mysql est locali-
zada:
shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl
Finalmente voc deve instalar este novo Perl. Novamente, a sada de make perl indica o coman-
do a usar.
Instalao do MySQL
154
Captulo 3. Tutorial de Introduo Do
MySQL
Este captulo fornece um tutorial de introduo ao MySQL demonstrando como usar o programa cli-
ente mysql para criar e usar um banco de dados simples. mysql (algumas vezes apresentado como
o ``terminal monitor'' ou apenas ``monitor'') um programa interativo que lhe permite conectar a um
servidor MySQL, executar consultas e visualizar os resultados. mysql pode tambm ser executado
em modo batch: voc coloca suas consultas em um arquivo, depois diz ao mysql para executar o
contedo do arquivo. Cobrimos aqui ambas as formas de utilizar o mysql.
Para ver uma lista de opes conhecidas pelo mysql, chame-o com a opo --help:
shell> mysql --help
Este captulo presume que o mysql est instalado na sua mquina e que um servidor MySQL est
disponvel para quem puder conectar. Se isto no for verdade, contate seu administrador MySQL.
(Se voc o administrador, voc precisar consultar outras sees deste manual.)
Este captulo descreve todo o processo de configurao e uso de um banco de dados. Se voc estiver
interessado em apenas acessar um banco de dados j existente, podera pular as sees que descre-
vem como criar o banco de dados e suas respectivas tabelas.
Como este captulo um tutorial, vrios detalhes so necessariamente omitidos. Consulte as sees
relevantes do manual para mais informaes sobre os tpicos cobertos aqui.
3.1. Conectando e Desconectando do Servi-
dor
Para conectar ao servidor, normalmente voc precisar fornecer um nome de usurio quando o
mysql for chamado e, na maioria dos casos, uma senha. Se o servidor executa em uma mquina di-
ferente de onde voc est, voc tambm precisar especificar um nome de mquina. Contate seu ad-
ministrador para saber quais parmetros de conexo voc deve usar para conectar (isto , qual m-
quina, usurio e senha usar). Uma vez que voc saiba quais os parmetros corretos, voc deve estar
pronto para conectar da seguinte forma:
shell> mysql -h servidor -u usuario -p
Enter password: ********
Os asteriscos (********) representam sua senha; digite-a quando o mysql mostrar o prompt En-
ter password:.
Se isto funcionar, voc deve ver algumas informaes iniciais seguidas de um prompt mysql>
shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 25338 to server version: 4.0.14-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
O prompt lhe diz que o mysql est pronto para que voc digite os comandos.
Algumas instalaes MySQL permitem aos usurios de se conectarem como usurios annimos ao
servidor executando na mquina local. Se isto o caso na sua mquina, voc deve conseguir conec-
tar ao servidor chamando o mysql sem qualquer opo:
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>.
3.2. Fazendo Consultas
Tenha certeza que voc est conectado ao servidor, como discutido na seo anterior. Isto feito, no
ser selecionado nenhum banco de dados para trabalhar, mas no tem problemas. Neste momento,
mais importante saber um pouco sobre como fazer consultas do que j criar tabelas, carregar dados
para elas, e recuperar dados delas. Esta seo descreve os princpios bsicos da entrada de coman-
dos, usando diversas consultas voc pode tentar se familiarizar com o funcionamento do mysql.
Aqui est um comando simples que solicita ao servidor seu nmero de verso e a data atual. Digite-
o como visto abaixo seguindo o prompt mysql> e digite a tecla RETURN:
mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| version() | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19 |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>
Esta consulta ilustra vrias coisas sobre o mysql:
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 an-
teriormente, 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 co-
mando.
O mysql mostra a sada da consulta em forma tabular (linhas e colunas). A primeira linha con-
tm rtulos para as colunas. As linhas seguintes so o resultado da consulta. Normalmente, rtu-
los 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 execu-
tar, 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 afeta-
dos 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 equivalen-
tes:
mysql> SELECT VERSION(), CURRENT_DATE;
Tutorial de Introduo Do MySQL
156
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
Aqui est outra consulta. Ela demonstra que voc pode usar o mysql como uma calculadora sim-
ples:
mysql> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
| 0.707107 | 25 |
+-------------+---------+
As consultas mostradas at agora tm sido instrues relativamente pequenas, de uma linha. Voc
pode tambm entrar com mltiplas instrues em uma nica linha. Basta finalizar cada uma com um
ponto e vrgula:
mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| VERSION() |
+--------------+
| 3.22.20a-log |
+--------------+
+---------------------+
| NOW() |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+
Um comando no necessita estar todo em uma nica linha, ento comandos extensos que necessitam
de vrias linhas no so um problema. O mysql determina onde sua instruo termina atravs do
ponto e vrgula terminador, e no pelo final da linha de entrada. (Em outras palavras, o myqsl acei-
ta entradas de livre formato: Ele coleta linhas de entrada mas no as executa at chegar o ponto e
vrgula.)
Aqui est uma instruo simples usando mltiplas linhas:
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+--------------------+--------------+
| USER() | CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18 |
+--------------------+--------------+
Neste exemplo, note como o prompt altera de mysql> para -> depois de voc entrar a primeira li-
nha de uma consulta com mltiplas linhas. Isto como o mysql indica que ainda no achou uma
instruo completa e est esperando pelo resto. O prompt seu amigo, porque ele fornece um retor-
no valioso. Se voc usa este retorno, voc sempre estar ciente do que o mysql est esperando.
Se voc decidir que no deseja executar um comando que est no meio do processo de entrada, can-
cele-o digitando \c:
mysql> SELECT
-> USER()
-> \c
mysql>
Note o prompt aqui tambm. Ele troca para o mysql> depois de voc digitar \c, fornecendo retor-
no para indicar que o mysql est pronto para um novo comando.
Tutorial de Introduo Do MySQL
157
A seguinte tabela mostra cada dos prompts que voc pode ver e resume o que ele significa sobre o
estado em que o mysql se encontra:
Prompt Significado
mysql> Pronto para novo comando.
-> Esperando pela prxima linha de comando com mltiplas linhas.
'> Esperando pela prxima linha, coletando uma string que comece com uma aspas sim-
ples (''').
"> Esperando pela prxima linha, coletando uma string que comece com aspas duplas ('"').
`> Esperando pela prxima linha, coletando uma string que comece com crase ('`').
muito comum instrues multi-linhas ocorrerem por acidente quando voc pretende publicar um
comando em uma nica linha, mas esquece o ponto e vrgula terminador. Neste caso,o mysql espe-
ra por mais entrada:
mysql> SELECT USER()
->
Se isto ocorrer com voc (acha que entrou uma instruo mas a nica resposta um prompt ->), o
mais provvel que o mysql est esperando pelo ponto e vrgula. Se voc no perceber o que o
prompt est lhe dizendo, voc pode parar por um tempo antes de entender o que precisa fazer. Entre
com um ponto e vrgula para completar a instruo, e o mysql ir execut-la:
mysql> SELECT USER()
-> ;
+--------------------+
| USER() |
+--------------------+
| joesmith@localhost |
+--------------------+
O prompt '> e "> ocorrem durante a coleta de strings. No MySQL, voc pode escrever strings utili-
zando os caracteres ''' ou '"' (por exemplo, 'hello' ou "goodbye"), e o mysql permite a en-
trada de strings que consomem mltiplas linhas. Quando voc ver um prompt '> ou ">, significa
que voc digitou uma linha contendo uma string que comea com um caracter de aspas ''' ou '"'
mas ainda no entrou com a aspas que termina a string. Isto bom se voc realmente est entrando
com uma string com mltiplas linhas, mas qual a probalidade disto acontecer ? No muita. Geral-
mente, os prompts '> e "> indicam que voc, por algum descuido, esqueceu algum caracter de as-
pas. Por exemplo:
mysql> SELECT * FROM minha_tabela WHERE nome = "Smith AND idade < 30;
">
Se voc entrar esta sentena SELECT, apertar ENTER e esperar pelo resultado, nada ir acontecer.
Em vez de se perguntar o porqu desta query demorar tanto tempo, perceba a pista fornecida pelo
prompt ">. Ele lhe diz que o mysql espera pelo resto de uma string no terminada. (Voc ve o erro
na declarao? Falta a segunda aspas na string "Smith.)
O que fazer neste ponto ? A coisa mais simples cancelar o comando. Entretanto, voc no pode
simplesmente digitar \c neste caso, porque o mysql o intrerpreta como parte da string que est co-
letando! Digite o caracter de aspas para fechar (ento o mysql sabe que voc fechou a string), ento
digite \c:
mysql> SELECT * FROM minha_tabela WHERE nome = "Smith AND idade < 30;
"> "\c
mysql>
Tutorial de Introduo Do MySQL
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.
3.3. Criao e Utilizao de um Banco de Da-
dos
Agora que voc j sabe como entrar com os comandos, hora de acessar um banco de dados.
Suponha que voc tenha diversos animais de estimao em sua casa (menagerie) e voc gostaria de
ter o registro de vrios tipos de informaes sobre eles. Voc pode fazer isto criando tabelas para ar-
mazenar seus dados e carreg-los com a informao desejada. Depois voc pode responder diferen-
tes tipos de questes sobre seus animais recuperando dados das tabelas. Esta seo mostrar como:
Criar um banco de dados
Criar uma tabela
Carregar dados na tabela
Recuperar dados de uma tabela de vrias maneiras
Usar mltiplas tabelas
O banco de dados menagerie ser simples (deliberadamente), mas no difcil pensar em situaes
na vida real em que um tipo similar de banco de dados pode ser usado. Por exemplo, um banco de
dados deste tipo pode ser usado por um fazendeiro para gerenciar seu estoque de animais, ou por um
veterinrio para gerenciar registros de seus pacientes. Uma distribuio do menagerie contendo al-
gumas 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 DATABA-
SES. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE.
Se o banco de dados test existir, tente acess-lo:
Tutorial de Introduo Do MySQL
159
mysql> USE test
Database changed
Perceba que o USE, como o QUIT, no necessitam de um ponto e vrgula. (Voc pode terminar tais
declaraes com uma ponto e vrgula se gostar; isto no importa) A instruo USE especial em ou-
tra maneira, tambm: Ela deve ser usada em uma nica linha.
Voc opde usar o banco de dados test (Se voc tiver acesso a ele) para os exemplos que seguem
mas qualquer coisa que voc criar neste banco de dados pode ser removido por qualquer um com
acesso a ele. Por esta razo, voc provavelmente deve pedir permisso ao seu administrador MySQL
para usar um banco de dados prprio. Suponha que voc o chame de menagerie. O administrador
precisar executar um comando como este:
mysql> GRANT ALL ON menagerie.* TO 'your_mysql_name'@'your_client_host';
onde seu_usurio_mysql o nome do usurio MySQL atribuido a voc e
your_client_host a mquina da qual voc se conecta ao servidor.
3.3.1. Criando e Selecionando um Banco de Dados
Se o administrador criar seu banco de dados quando configurar as suas permisses, voc pode come-
ar a us-lo. Seno, voc mesmo precisa cri-lo:
mysql> CREATE DATABASE menagerie;
No Unix, nomes de bancos de dados so caso sensitivo (ao contrrio das palavras chave SQL), por-
tanto voc deve sempre fazer referncia ao seu banco de dados como menagerie e no Menage-
rie, MENAGERIE ou outra variao. Isto tambm verdade para nomes de tabelas. (No Windows,
esta restrio no se aplica, entiretanto voc deve referenciar os bancos de dados e tabelas usando o
mesmo caso em toda a parte da consulta.)
Criar um bancos de dados no o seleciona para o uso; voc deve fazer isso de forma explcita. Para
fazer o menagerie o banco de dados atual, use o comando:
mysql> USE menagerie
Database changed
Seu banco de dados necessita ser criado somente uma nica vez, mas voc deve selecion-lo para o
uso cada vez que voc iniciar uma seo mysql. Voc pode fazer isso usando a instruo USE co-
mo visto no exemplo. Uma forma alternativa selecionar o banco de dados na linha de comando
quando voc chamar o mysql. Apenas especifique seu nome depois de qualquer parmetro de co-
nexo que voc pode precisar fornecer. Por exemplo:
shell> mysql -h servidor -u usuario -p menagerie
Enter password: ********
Perceba que menagerie no sua senha no comando mostrado. Se voc precisar passar sua senha
na linha de comando depois da opo -p, voc deve faz-lo sem usar espaos (por exemplo, -
pminhasenha e no como em -p minhasenha). Entretando, colocando sua senha na linha de
comando no recomendado, porque isto expe sua senha permitindo que outro usurio utilize a sua
mquina.
3.3.2. Criando uma Tabela
Criar o banco de dados a parte fcil, mas neste ponto ele est vazio, como o SHOW TABLES mos-
trar:
mysql> SHOW TABLES;
Tutorial de Introduo Do MySQL
160
Empty set (0.00 sec)
A parte mais difcil decidir qual a estrutura que seu banco de dados deve ter: quais tabelas voc
precisar e que colunas estaro em cada uma delas.
Voc ir precisar de uma tabela para guardar um registro para cada um de seus animais de estima-
o. Esta tabela pode ser chamada pet, e ela deve conter, pelo menos, o nome de cada animal. Co-
mo o nome por si s no muito interessante, a tabela dever conter outras informaes. Por exem-
plo, se mais de uma pessoa na sua famlia tambm tem animais, voc pode desejar listar cada dono.
Voc pode tambm desejargravar algumas informaes descritivas bsicas como espcie e sexo.
Que tal a idade? Pode ser do interesse, mas no uma boa coisa para se armazenar em um banco de
dados. A idade muda medida em que o tempo passa, o que significa que voc sempre ter de atua-
lizar seus registros. Em vez disso, melhor armazenar um valor fixo como a data de nascimento.
Ento, sempre que voc precisar da idade, basta voc calcul-la como a diferena entre a data atual e
a data de aniversrio. O MySQL fornece funes para fazer aritmtica de datas, ento isto no dif-
cil. Armazenando datas de aniversrio no lugar da idade tambm oferece outras vantagens:
Voc pode usar o banco de dados para tarefas como gerar lembretes para aniversrios que esto
chegando. (Se voc pensa que este tipo de query algo bobo, perceba que a mesma questo
que voc perguntar no contexto de um banco de dados comercial para identificar clientes para
quais voc precisar enviar carto de aniversrio, para um toque pessoal assistido pelo computa-
dor.)
Voc pode calcular a idade em relao a outras datas diferente da data atual. Por exemplo, se vo-
c 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), es-
pcie(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 co-
luna 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 forne-
ce 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;
Tutorial de Introduo Do MySQL
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.
3.3.3. Carregando dados em uma tabela
Depois de criar sua tabela, voc precisar povo-la. As instrues LOAD DATA e INSERT so teis
para isto.
Suponha que seu registro de animais possa ser descrito como abaixo: (Observe que o MySQL es-
pera datas no formato AAAA-MM-DD; isto pode ser diferente do que voc est acostumado.)
name owner species sex birth death
Fluffy Harold cat f 1993-02-04
Claws Gwen cat m 1994-03-17
Buffy Harold dog f 1989-05-13
Fang Benny dog m 1990-08-27
Bowser Diane dog m 1979-08-31 1995-07-29
Chirpy Gwen bird f 1998-09-11
Whistler Gwen bird 1997-12-09
Slim Benny snake m 1996-04-29
Como voc est comeando com uma tabela vazia, uma forma simples de povo-la criar um arqui-
vo 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 vi-
vos), voc pode usar valores NULL. Para represent-lo em seu arquivo texto, use \N (barra inverti-
dam N mausculo). Por exemplo, o registro para Whistler the bird podem parecer com isto (onde o
espao em branco entre os valores um simples caractere de tabulao):
name owner species sex birth death
Whistler Gwen 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
Tutorial de Introduo Do MySQL
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 IN-
SERT 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 car-
regar seus registros inicialmente utilizando diversas instrues INSERT do que uma simples instru-
o LOAD DATA.
3.3.4. Recuperando Informaes de uma Tabela
A instruo SELECT usada para recuperar informaes de uma tabela. A forma geral da instruo
:
SELECT o_que_mostrar
FROM de_qual_tabela
WHERE condies_para_satisfazer;
o_que_mostrar indica o que voc deseja ver. Isto pode ser uma lista de colunas ou * para indi-
car ``todas colunas.'' de_qual_tabela indica a tabela de onde voc deseja recuperar os dados. A
clusula WHERE opcional. Se estiver presente, condies_para_satisfazer especificam
as condies que os registros devem satisfazer para fazer parte do resultado.
3.3.4.1. Selecionando Todos os Dados
A forma mais simples do SELECT recuperar tudo de uma tabela:
mysql> SELECT * FROM pet;
+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+--------+---------+------+------------+------------+
Esta forma do SELECT til se voc deseja ver sua tabela inteira como agora, depois de voc aca-
bar de carreg-la com os dados iniciais. Por exempo, voc pode pensar que a data de nascimento do
Bowser no est correta. Consultando seus papis originais de pedigree, descobriu que o ano correto
do nascimento deve ser 1989, no 1979.
Existem pelo menos duas formas de corrigir isto:
Edite o arquivo pet.txt para corrigir o erro, depois limpe a tabela e recarregue-o usando DE-
Tutorial de Introduo Do MySQL
163
LETE e LOAD DATA:
mysql> DELETE FROM pet;
mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
Entretanto, se voc fizer isto, voc tambm deve refazer a entrada para Puffball.
Corrigir somente o registro errado com uma instruo UPDATE:
mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser";
O UPDATE altera apenas o registro em questo e no exige que voc recarregue a tabela.
3.3.4.2. Selecionando Registros Especficos
Como foi mostrado na seo anterior, fcil recuperar uma tabela inteira. Apenas omita a clusula
WHERE da instruo SELECT. Mas normalmente voc no quer ver toda a tabela, particularmente
quando a tabela ficar grande. Em vez disso, voc estar mais interessado em ter a resposta de uma
questo em particular, no qual voc especifica detalhes da informao que deseja. Vamos ver algu-
mas consultas de seleo nos termos das questes sobre seus animais.
Voc pode selecionar apenas registros especficos da sua tabela. Por exemplo, se voc deseja verifi-
car a alterao que fez na data de nascimento do Bowser, selecione o registro desta forma:
mysql> SELECT * FROM pet WHERE name = "Bowser";
+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
A sada confirma que o ano foi gravado corretamente agora como 1989 e no 1979.
Comparaes de strings normalmente so caso insensitivo, ento voc pode especificar o nome co-
mo "bowser", "BOWSER", etc. O resultado da pesquisa ser o mesmo.
Voc pode especificar condies em qualquer coluna, no apenas no name. Por exemplo, se voc
deseja saber quais foram os animais que nasceram depois de 1998, teste o campo birth:
mysql> SELECT * FROM pet WHERE birth >= "1998-1-1";
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+
Voc pode combinar condies, por exemplo, para encontrar cadelas (dog/f):
mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
A consulta anterior utiliza o operador lgico AND (e). Existe tambm um operador OR (ou):
mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird";
+----------+-------+---------+------+------------+-------+
Tutorial de Introduo Do MySQL
164
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+----------+-------+---------+------+------------+-------+
AND e OR podem ser misturados, embora AND tem maior precedncia que OR. Se voc usar ambos
os operadores, uma tima idia usar parnteses para indicar explicitamente quais condies devem
ser agrupadas:
mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")
-> OR (species = "dog" AND sex = "f");
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
3.3.4.3. Selecionando Colunas Especficas
Se voc no desejar ver todo o registro de sua tabela, especifique as colunas em que voc estiver in-
teressado, separado por vrgulas. Por exemplo, se voc deseja saber quando seus animais nasceram,
selecione as colunas name e birth:
mysql> SELECT name, birth FROM pet;
+----------+------------+
| name | birth |
+----------+------------+
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
Para saber quem so os donos dos animais, use esta consulta:
mysql> SELECT owner FROM pet;
+--------+
| owner |
+--------+
| Harold |
| Gwen |
| Harold |
| Benny |
| Diane |
| Gwen |
| Gwen |
| Benny |
| Diane |
+--------+
Entretanto, perceba que a query simplesmente retornou o campo owner de cada registro, e alguns
deles apareceram mais de uma vez. Para minimizar a sada, recupere cada registro apenas uma vez,
adicionando a palavra chave DISTINCT:
mysql> SELECT DISTINCT owner FROM pet;
Tutorial de Introduo Do MySQL
165
+--------+
| owner |
+--------+
| Benny |
| Diane |
| Gwen |
| Harold |
+--------+
Voc pode usar uma clusula WHERE para combinar seleo de registros com seleo de colunas.
Por exemplo, para obter a data de nascimento somente dos gatos e cachorros, utilize esta query:
mysql> SELECT name, species, birth FROM pet
-> WHERE species = "dog" OR species = "cat";
+--------+---------+------------+
| name | species | birth |
+--------+---------+------------+
| Fluffy | cat | 1993-02-04 |
| Claws | cat | 1994-03-17 |
| Buffy | dog | 1989-05-13 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
+--------+---------+------------+
3.3.4.4. Ordenando Registros
Voc deve ter percebido nos exemplos anteriores que os registros retornados no so mostrados de
forma ordenada. Normalmente mais fcil examinar a sada da consulta quando os registros so or-
denados com algum sentido. Para ordenar o resultado, utilize uma clusula ORDER BY.
Aqui est o dia de nascimento dos animais, ordenado por data:
mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name | birth |
+----------+------------+
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang | 1990-08-27 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
Em colunas de tipo de caracter, ordenaio como qualquer outra operao de comparao nor-
malmente realizada no modo caso insensitivo. Isto significa que a ordem ser indefinida para colu-
nas que so idnticas exceto quanto ao caso da letra. Voc pode forar uma ordenao em caso seni-
tivo para uma coluna usando a coero BINARY: ORDER BY BINARY(campo).
A ordenao padro crescente, com os valores menores em primeiro. Para ordenao na ordem re-
versa, adicione a palavra chave DESC (descendente) ao nome da coluna que deve ser ordenada:
mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name | birth |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Claws | 1994-03-17 |
Tutorial de Introduo Do MySQL
166
| Fluffy | 1993-02-04 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+----------+------------+
Voc pode ordenar por mltiplas colunas e voc pode classificar colunas em direes diferentes. Por
exemplo, para ordenar o tipo de animal em ordem crescente, depois por dia de nascimento dentro do
tipo de animal em ordem decrescente (com os mais novos primeiro), utilize a seguinte consulta:
mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;
+----------+---------+------------+
| name | species | birth |
+----------+---------+------------+
| Chirpy | bird | 1998-09-11 |
| Whistler | bird | 1997-12-09 |
| Claws | cat | 1994-03-17 |
| Fluffy | cat | 1993-02-04 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
| Buffy | dog | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim | snake | 1996-04-29 |
+----------+---------+------------+
Perceba que a palavra chave DESC aplica somente para o nome da coluna precedente (birth); ela
no afeta a ordenao da coluna species.
3.3.4.5. Clculo de Datas
O MySQL fornece vrias funes que voc pode usar para realizar clculos em datas, por exemplo,
para calcular idades ou extrair partes de datas.
Para determinar quantos anos cada um do seus animais tem, compute a diferena do ano da data atu-
al e a data de nascimento (birth), depois subtraia se a o dia/ms da data atual for anterior ao dia/ms
da data de nascimento. A consulta seguinte, mostra, para cada animal, a data de nascimento, a data
atual e a idade em anos.
mysql> SELECT name, birth, CURDATE(),
-> (YEAR(CURDATE())-YEAR(birth))
-> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
-> AS age
-> FROM pet;
+----------+------------+------------+------+
| name | birth | CURDATE() | age |
+----------+------------+------------+------+
| Fluffy | 1993-02-04 | 2003-08-19 | 10 |
| Claws | 1994-03-17 | 2003-08-19 | 9 |
| Buffy | 1989-05-13 | 2003-08-19 | 14 |
| Fang | 1990-08-27 | 2003-08-19 | 12 |
| Bowser | 1989-08-31 | 2003-08-19 | 13 |
| Chirpy | 1998-09-11 | 2003-08-19 | 4 |
| Whistler | 1997-12-09 | 2003-08-19 | 5 |
| Slim | 1996-04-29 | 2003-08-19 | 7 |
| Puffball | 1999-03-30 | 2003-08-19 | 4 |
+----------+------------+------------+------+
Aqui, YEAR() separa a parte do ano de uma data e RIGHT() separa os cinco caracteres mais a di-
reita 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.
Tutorial de Introduo Do MySQL
167
A consulta funciona, mas o resultado pode ser mais compreensvel se os registros forem apresenta-
dos em alguma ordem. Isto pode ser feito adicionando uma clusula ORDER BY name para orde-
nar 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 es-
pecial 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 DA-
Tutorial de Introduo Do MySQL
168
YOFMONTH(). MONTH a funo apropriada aqui. Para ver como ela funciona, execute uma con-
sulta 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 adicio-
nar 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. As-
sim 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 Novem-
bro (11) para Janeiro (1).
3.3.4.6. Trabalhando com Valores Nulos (NULL)
O valor NULL pode ser supreendente at voc us-lo. Conceitualmente, NULL significa valor em
falta ou valor desconhecido e tratado de uma forma diferente de outros valores. Para testar o valor
NULL, voc no pode usar os operadores de comparaes aritmticas como em =, <, ou !=. Para de-
monstrar para voc mesmo, tente executar a seguinte consulta:
mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
Tutorial de Introduo Do MySQL
169
+----------+-----------+----------+----------+
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 ani-
mais 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 in-
dependente da ordem escolhida.
3.3.4.7. Combinao de padres
O MySQL fornece combinao de padres do SQL bem como na forma de combinao de padres
baseado nas expresses regulares extendidas similares quelas usadas pelos utilitrios Unix como o
vi, grep e sed.
A combinao de padres SQL lhe permite voc usar _ para coincidir qualquer caractere simples e
% para coincidir um nmero arbitrrio de caracteres (incluindo zero caracter). No MySQL, padres
SQL so caso insensitivo por padro. Alguns exemplos so vistos abaixo. Perceba que voc no usa
= ou != quando usar padres SQL; use os operadores de comparao LIKE ou NOT LIKE neste
caso.
Para encontrar nomes comeando com 'b':
mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
Para encontrar nomes com o final 'fy':
mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
Para encontrar nomes contendo um 'w':
mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
Tutorial de Introduo Do MySQL
170
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
Para encontrar nomes contendo exatamente cinco caracteres, use cinco instncias do caracter '_':
mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
O outro tipo de combinao de padres fornecido pelo MySQL usa expresses regulares extendidas.
Quando voc testa por uma combinao para este tipo de padro, utilize os operadores REGEXP e
NOT REGEXP (ou RLIKE e NOT RLIKE, que so sinnimos).
Algumas caractersticas das expresses regulares extendidas so:
'.' combina qualquer caractere nico
Uma classe de caracteres '[...]' combina qualquer caractere que consta dentro dos colchetes.
Por exemplo, '[abc]' combina com 'a', 'b', ou 'c'. Para nomear uma sequncia de caracteres uti-
lize 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 testa-
do, utilize '^' no comeo ou '$' no final do padro.
Para demonstrar como expresses regulares extendidas funcionam, as consultas com LIKE mostra-
das 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 retor-
nar nenhum registro. Neste caso, para combinar letras 'b' maisculas e minsculas, utilize esta con-
sulta:
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
Tutorial de Introduo Do MySQL
171
consulta ir combinar somente com 'b's minsculos no comeo de um nome:
mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";
Para encontrar nomes finalizados com 'fy', utilize '$' para combinar com o final do nome:
mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
Para encontrar nomes contendo um 'w', utilize esta consulta:
mysql> SELECT * FROM pet WHERE name REGEXP "w";
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
Como uma expresso regular extendida encontra padres coincidentes se eles ocorrem em qualquer
lugar no valor comparado, no necessrio utiliar, na consulta anterior, nenhum metacaracter em
nenhum dos lados do padro para faz-lo coincidir com todo o valor, como seria feito se fosse utili-
zado o padro SQL.
Para encontrar nomes contendo exatamente cinco caracteres, utilize '^' e '$' para combinar com o
comeo e fim do nome e cinco instncias de '.' entre eles.
mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
Voc pode tambm escrever a consulta anterior utilizando o operador '{n}' ``repete-n-vezes'':
mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
3.3.4.8. Contando Registros
Bancos de dados normalmente so usados para responder a perguntas, ``Qual a frequncia que certo
tipo de dados ocorre em uma tabela?'' Por exemplo, voc deve querer saber quantos animais tem, ou
quantos animais cada dono tem, ou voc pode querer fazer vrios outros tipos de operaes de censo
com seus animais.
Contando o nmero total de animais que voc tem a mesma questo como em ``Quantos registros
existem na tabela pet?'' porque existe um registro por animal. COUNT(*) conta o nmero de resul-
tados no-NULL, portanto a pesquisa para contar seus animais parecer com isto:
Tutorial de Introduo Do MySQL
172
mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+
Logo, voc recuperar os nomes das pessoas que possuam animais. Voc pode usar COUNT() se
voc desejar encontrar quantos animais cada dono possui:
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner | COUNT(*) |
+--------+----------+
| Benny | 2 |
| Diane | 2 |
| Gwen | 3 |
| Harold | 2 |
+--------+----------+
Perceba o uso de GROUP BY para agrupar todos os registros para cada owner (dono). Sem ele, vo-
c teria uma mensagem de erro:
mysql> SELECT owner, COUNT(*) FROM pet;
ERROR 1140: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause
COUNT() e GROUP BY so teis para personalizar seus dados de diversas maneiras. Os seguintes
exemplos mostram diferentes maneiras para realizar operaes de censo nos animais.
Nmero de animais por espcie:
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird | 2 |
| cat | 2 |
| dog | 3 |
| hamster | 1 |
| snake | 1 |
+---------+----------+
Nmero de animais por sexo:
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex | COUNT(*) |
+------+----------+
| NULL | 1 |
| f | 4 |
| m | 4 |
+------+----------+
(Nesta sada, NULL indica que o sexo desconhecido.)
Nmero de animais combinando espcie e sexo:
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| bird | NULL | 1 |
Tutorial de Introduo Do MySQL
173
| 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 |
+---------+------+----------+
3.3.4.9. Utilizando Mltiplas Tabelas
A tabela pet mantm informaes de quais animais voc tem. Se voc deseja gravar outras infor-
maes sobre eles como eventos em suas vidas, tais como visitas ao veterinrio ou sobre suas crias,
voc necessitar de outra tabela. Como esta tabela deve se parecer ? Ela precisa:
Conter o nome do animal para que voc saiba a qual animal pertence o evento.
Uma data para que voc saiba quando ocorreu o evento.
Um campo para descrever o evento.
Um campo com o tipo de evento, se voc desejar classific-los por categoria.
Dadas estas consideraes, a instruo CREATE TABLE para a tabela event deve se parecer com
isto:
mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
-> type VARCHAR(15), remark VARCHAR(255));
Tutorial de Introduo Do MySQL
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 4 kittens, 3 female, 1 male
Buffy 1993-06-23 litter 5 puppies, 2 female, 3 male
Buffy 1994-06-19 litter 3 puppies, 3 female
Chirpy 1999-03-21 vet needed beak straightened
Slim 1997-08-03 vet broken rib
Bowser 1991-10-12 kennel
Fang 1991-10-12 kennel
Fang 1998-08-28 birthday Gave him a new chew toy
Claws 1998-03-17 birthday Gave him a new flea collar
Whistler 1998-12-09 birthday First birthday
Carregue os registros usando:
mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;
Baseado no que voc j aprendeu com as consultas realizadas na tabela pet, voc deve estar apto
para realizar pesquisas na tabela event; os princpios so o mesmo. Mas quando a tabela event,
sozinha, insuficiente para responder s suas questes?
Suppose you want to find out the ages at which each pet had its litters. We saw earlier how to calcu-
late ages from two dates. The litter date of the mother is in the event table, but to calculate her age
on that date you need her birth date, which is stored in the pet table. This means the query requires
both tables:
Suponha que voc deseje descobrir as idades de cada animal quando eles tiveram cria. Ns vemos
logo que possvel calcular a idade a partir das duas datas. A idade dos filhotes est na tabela
event, mas para calcular a idade da me, voc precisar da data de nascimento dela, que est arma-
zenado na tabela pet. Isto significa que voc precisar das duas tabelas para a consulta:
mysql> SELECT pet.name,
-> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age,
-> remark
-> FROM pet, event
-> WHERE pet.name = event.name AND type = "litter";
+--------+------+-----------------------------+
| name | age | remark |
+--------+------+-----------------------------+
| Fluffy | 2 | 4 kittens, 3 female, 1 male |
| Buffy | 4 | 5 puppies, 2 female, 3 male |
| Buffy | 5 | 3 puppies, 3 female |
+--------+------+-----------------------------+
Existem vrias coisas que devem ser percebidas sobre esta consulta:
A clusula FROM lista as duas tabelas porque a consulta precisa extrair informao de ambas.
Quando combinar (unir) informaes de mltiplas tabelas, voc precisa especificar como regis-
tros em uma tabela podem ser coincididas com os registros na outra. Isto simples porque am-
bas 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
Tutorial de Introduo Do MySQL
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.
3.4. Obtendo Informaes Sobre Bancos de
Dados e Tabelas
E se voc esquecer o nome de um banco de dados ou tabela, ou como a estrutura de uma certa ta-
bela (por exemplo, como suas colunas so chamadas)? O MySQL resolve este problema atravs de
diversas instrues que fornecem informaes sobre os bancos de dados e as tabelas que ele suporta.
Voc j viu SHOW DATABASES, que lista os bancos de dados gerenciados pelo servidor. Para saber
qual banco de dados est sendo usado atualmente, utilize a funo DATABASE():
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| menagerie |
+------------+
Se voc ainda no selecionou nenhum banco de dados ainda, o resultado NULL. (ou a string vazia
antes do MySQL 4.1.1).
Para saber quais tabelas o banco de dados atual contm (por exemplo, quando voc no tem certeza
sobre o nome de uma tabela), utilize este comando:
mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| event |
| pet |
+---------------------+
Se voc deseja saber sobre a estrutura de uma tabela, o comando DESCRIBE til; ele mostra in-
formaes sobre cada uma das colunas da tabela:
mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
Tutorial de Introduo Do MySQL
176
| 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 in-
dica se a coluna pode conter valores nulos (NULL), key indica se a coluna indexada ou no e De-
fault especifica o valor padro da coluna.
Se voc tem ndices em uma tabela, SHOW INDEX FROM tbl_nome traz informaes sobre
eles.
3.5. Utilizando mysql em Modo Batch
Nas sees anteriores, voc usou mysql interativamente para fazer consultas e ver os resultados.
Voc pode tambm executar mysql no modo batch. Para fazer isto, coloque os comando que voc
deseja executar em um arquivo, e diga ao mysqld para ler sua entrada do arquivo:
shell> mysql < batch-file
Se voc estiver executando o mysql no Windows e tiver algum caracter especial no arquivo que
provocou o problema, voc pode fazer:
dos> mysql -e "source batch-file"
Se voc precisa especificar parmetros de conexo na linha de comando, o comando deve parecer
com isto:
shell> mysql -h host -u user -p < batch-file
Enter password: ********
Quando voc utilizar o mysql desta forma, voc estar criando um arquivo script, depois executan-
do o script.
Se voc quiser que o script continue mesmo se hopuver erros, voc deve usar a opo de linha de
comando --force.
Por que usar um script? Existem vrias razes:
Se voc executa uma query repetidamente (digamos, todos os dias ou todas as semanas), trans-
form-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, particu-
larmente 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 p-
ginador.
shell> mysql < batch-file | more
Tutorial de Introduo Do MySQL
177
Voc pode capturar a sada em um arquivo para processamento posterior:
shell> mysql < batch-file > mysql.out
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 consul-
ta 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 speci-
es FROM pet se parece com isto quando voc o executa interativamente:
+---------+
| species |
+---------+
| bird |
| cat |
| dog |
| hamster |
| snake |
+---------+
Mas fica assim quando voc o executa no modo batch:
species
bird
cat
dog
hamster
snake
Se voc desejar obter o formato de sada interativa no modo batch, utilize mysql -t. Para mostrar
a sada dos comandos que so executados, utilize mysql -vvv.
Voc tambm pode utilizar scripts no prompt de linha de comando mysql usando o comando
source:
mysql> source filename;
3.6. Exemplos de Consultas Comuns
Aqui esto os exemplos de como resolver problemas comuns com o MySQL.
Alguns dos exemplos usam a tabela shop para armazenar o preo de cada tem (article) para certas
revendas (dealers). Supondo que cada revenda tenha um preo fixo por artigo, ento (article,
dealer) uma chave primria para os registros.
Inicie a ferramenta de linha de comando mysql e selecione um banco de dados:
shell> mysql o-nome-do-seu-banco-de-dados
(Na maioria das instalaes do MySQL, voc pode usar o banco de dados test).
Voc pode criar e popular a tabela exemplo assim:
mysql> CREATE TABLE shop (
-> article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
Tutorial de Introduo Do MySQL
178
-> dealer CHAR(20) DEFAULT '' NOT NULL,
-> price DOUBLE(16,2) DEFAULT '0.00' NOT NULL,
-> PRIMARY KEY(article, dealer));
mysql> INSERT INTO shop VALUES
-> (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),
-> (3,'D',1.25),(4,'D',19.95);
Depois de executar as instrues a tabela deve ter o seguinte contedo:
mysql> SELECT * FROM shop;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001 | A | 3.45 |
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | B | 1.45 |
| 0003 | C | 1.69 |
| 0003 | D | 1.25 |
| 0004 | D | 19.95 |
+---------+--------+-------+
3.6.1. O Valor Mximo para uma Coluna
``Qual o maior nmero dos tens?''
SELECT MAX(article) AS article FROM shop;
+---------+
| article |
+---------+
| 4 |
+---------+
3.6.2. O Registro que Armazena o Valor Mximo para
uma Coluna Determinada
``Encontre o nmero, fornecedor e preo do tem mais caro.''
No SQL ANSI isto feito fcilmente com uma sub-consulta:
SELECT article, dealer, price
FROM shop
WHERE price=(SELECT MAX(price) FROM shop);
No MySQL (que ainda no suporta sub-selects), faa isto em dois passos:
1. Obtenha o valor do preo mximo da tabela com uma instruo SELECT.
mysql> SELECT MAX(price) FROM shop;
+------------+
| MAX(price) |
+------------+
| 19.95 |
+------------+
2. Usando o valor 19.95 mostrado pela consulta anterior como o preo mximo do artigo, grave
uma consulta para localizar e mostrar o registro correspondente:
Tutorial de Introduo Do MySQL
179
mysql> SELECT article, dealer, price
-> FROM shop
-> WHERE price=19.95;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0004 | D | 19.95 |
+---------+--------+-------+
Outra soluo ordenar todos os registros por preo de forma descendente e obtenha somente o pri-
meiro registro utilizando a clusula especfica do MySQL LIMIT:
SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;
NOTA: Se existir diversos tens mais caros, cada um com um preo de 19.95, a soluo LIMIT
mostra somente um deles !
3.6.3. Mximo da Coluna por Grupo
``Qual o maior preo por tem?''
SELECT article, MAX(price) AS price
FROM shop
GROUP BY article
+---------+-------+
| article | price |
+---------+-------+
| 0001 | 3.99 |
| 0002 | 10.99 |
| 0003 | 1.69 |
| 0004 | 19.95 |
+---------+-------+
3.6.4. As Linhas Armazenando o Group-wise Mximo
de um Certo Campo
``Para cada tem, encontre o(s) fornecedor(s) com o maior preo.''
No SQL-99 (e MySQL 4.1 ou superior), o problema pode ser solucionado com uma subconsulta co-
mo esta:
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);
Em verses anteriores a do MySQL 4.1 melhor faz-lo em diversos passos:
1. Obtenha a lista de pares (article,maxprice).
2. Para cada tem, obtenha os registros correspondentes que tenham o maior preo.
Tutorial de Introduo Do MySQL
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 co-
luna concatenada no cliente.
3.6.5. Utilizando Variveis de Usurio
Voc pode usar variveis de usurios no MySQL para lembrar de resultados sem a necessidade de
armazen-las em variveis no cliente. See Seco 6.1.4, Variveis de Usurio.
Por exemplo, para encontrar os tens com os preos mais altos e mais baixos voc pode fazer isto:
select @min_price:=min(price),@max_price:=max(price) from shop;
select * from shop where price=@min_price or price=@max_price;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0003 | D | 1.25 |
| 0004 | D | 19.95 |
+---------+--------+-------+
3.6.6. Utilizando Chaves Estrangeiras
No MySQL 3.23.44 e acima, tabelas InnoDB suportam verificao de restries de chaves estran-
gerias. See Seco 7.5, Tabelas InnoDB. Veja tambm Seco 1.8.4.5, Chaves Estrangeiras.
Voc no precisa de chaves estrangeiras para unir 2 tabelas. Para outros tipos de tabela diferentes de
InnoDB, As nicas coisas que o MySQL atualmente no faz so 1) CHECK, para ter certeza que as
chaves que voc usa realmente existem na tabela ou tabelas referenciadas e 2) apagar automatica-
mente registros da tabela com uma definio de chave estrangeira. Usando suas chaves para unir a
tabela funcionar bem:
Tutorial de Introduo Do MySQL
181
CREATE TABLE person (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
name CHAR(60) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE shirt (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
colour ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
PRIMARY KEY (id)
);
INSERT INTO person VALUES (NULL, 'Antonio Paz');
INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', LAST_INSERT_ID()),
(NULL, 'dress', 'white', LAST_INSERT_ID()),
(NULL, 't-shirt', 'blue', LAST_INSERT_ID());
INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');
INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', LAST_INSERT_ID()),
(NULL, 'polo', 'red', LAST_INSERT_ID()),
(NULL, 'dress', 'blue', LAST_INSERT_ID()),
(NULL, 't-shirt', 'white', LAST_INSERT_ID());
SELECT * FROM person;
+----+---------------------+
| id | name |
+----+---------------------+
| 1 | Antonio Paz |
| 2 | Lilliana Angelovska |
+----+---------------------+
SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style | colour | owner |
+----+---------+--------+-------+
| 1 | polo | blue | 1 |
| 2 | dress | white | 1 |
| 3 | t-shirt | blue | 1 |
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
| 7 | t-shirt | white | 2 |
+----+---------+--------+-------+
SELECT s.* FROM person p, shirt s
WHERE p.name LIKE 'Lilliana%'
AND s.owner = p.id
AND s.colour <> 'white';
+----+-------+--------+-------+
| id | style | colour | owner |
+----+-------+--------+-------+
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
+----+-------+--------+-------+
3.6.7. Pesquisando em Duas Chaves
O MySQL ainda no otimiza quando voc pesquisa em duas chaves diferentes combinadas com OR
(Pesquisa em uma chave com diferentes partes OR muito bem otimizadas).
SELECT field1_index, field2_index FROM test_table
WHERE field1_index = '1' OR field2_index = '1'
A razo que ns ainda no tivemos tempos para fazer este tratamento de uma maneira eficiente no
caso geral. (A manipulao do AND , em comparao, completamente geral e funciona muito bem).
No MySQL 4.0 e acimo, voc pode solucionar este problema eficientemente usando um UNION que
Tutorial de Introduo Do MySQL
182
combina a sada de duas instrues SELECT separadas. See Seco 6.4.1.2, Sintaxe UNION. Cada
SELECT busca apenas uma chave e pode ser otimizada.
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'
UNION
SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1';
Em verses do MySQL anteirores a 4.0, voc pode conseguir o mesmo efeito usando uma tabela
TEMPORARY e instrues SELECT separadas. Este tipo de otimizao tambm muito boa se voc
estiver utilizando consultas muito complicadas no qual o servidor SQL faz as otimizaes na ordem
errada.
CREATE TEMPORARY TABLE tmp
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1';
INSERT INTO tmp
SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1';
SELECT * from tmp;
DROP TABLE tmp;
A maneira descrita acima para resolver esta consulta uma unio (UNION) de duas consultas.
3.6.8. Calculando Visitas Dirias
O seguinte exemplo mostra como voc pode usar as funes binrias de agrupamento para calcular
o nmero de dias por ms que um usurio tem visitado uma pgina web.
CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, day INT(2) UNSIGNED ZEROFILL);
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),(2000,2,23),(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 consul-
ta:
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month;
que retornar:
+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+------+
O exemplo acima calcula quantos dias diferentes foram usados para uma combinao fornecida de
ms/ano, com remoo automtica de entradas duplicadas.
3.6.9. Usando AUTO_INCREMENT
O atributo AUTO_INCREMENT pode ser usado para gerar uma identificao nica para um novo re-
gistro:
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO animals (name) VALUES ("dog"),("cat"),("penguin"),
("lax"),("whale"),("ostrich");
SELECT * FROM animals;
Tutorial de Introduo Do MySQL
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 AU-
TO_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 calcula-
do 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 va-
lor de AUTO_INCREMENT ser reutilizado se voc deletar a linha com o maior valor AU-
TO_INCREMENT em qualquer grupo. Isto caontece mesmo para tabelas MyISAM, para as quais os
valores AUTO_INCREMENT normalmente no so reusados.)
3.7. Consultas de Projetos Gmeos
Em Analytikerna e Lentus, ns estamos fazendo os sistemas e trabalho de campo para um grande
projeto de pesquisa. Este projeto uma colaborao entre o Institudo de Medicina Ambiental em
Karolinksa Institutet Stockholm e a Seo de Pesquisa Clnica em Envelhecimento e Psicologia na
University of Southern California.
O projeto envolve uma parte de seleo onde todos os gmeos na Sucia mais velhos que 65 anos
Tutorial de Introduo Do MySQL
184
so entrevistados por telefone. Gmeos que preenchem certos critrios passam para o prximo est-
gio. Neste estgio posterior, gmeos que desejam participar so visitados por uma equipe de douto-
res/enfermeiros. Alguns dos consultas incluem exames fsicos e neuropsicolgico, testes de labora-
trio, imagem neural, determinao do estado psicolgico e coletas de histrico familiar. Adicional-
mente, dados so coletados em fatores de riscos mdicos e ambientais.
Mais informaes sobre o estudos dos gmeos pode ser encontrados em:
http://www.mep.ki.se/twinreg/index_en.html
A parte posterior do projeto administrada com uma interface Web escrita utilizando a linguagem
Perl e o MySQL.
Cada noite todos dados das entrevistas so movidos para um banco de dados MySQL.
3.7.1. Encontrando Todos Gmeos No-distribudos
A seguinte consulta usada para determinar quem vai na segunda parte do projeto:
SELECT
CONCAT(p1.id, p1.tvab) + 0 AS tvid,
CONCAT(p1.christian_name, " ", p1.surname) AS Name,
p1.postal_code AS Code,
p1.city AS City,
pg.abrev AS Area,
IF(td.participation = "Aborted", "A", " ") AS A,
p1.dead AS dead1,
l.event AS event1,
td.suspect AS tsuspect1,
id.suspect AS isuspect1,
td.severe AS tsevere1,
id.severe AS isevere1,
p2.dead AS dead2,
l2.event AS event2,
h2.nurse AS nurse2,
h2.doctor AS doctor2,
td2.suspect AS tsuspect2,
id2.suspect AS isuspect2,
td2.severe AS tsevere2,
id2.severe AS isevere2,
l.finish_date
FROM
twin_project AS tp
/* For Twin 1 */
LEFT JOIN twin_data AS td ON tp.id = td.id
AND tp.tvab = td.tvab
LEFT JOIN informant_data AS id ON tp.id = id.id
AND tp.tvab = id.tvab
LEFT JOIN harmony AS h ON tp.id = h.id
AND tp.tvab = h.tvab
LEFT JOIN lentus AS l ON tp.id = l.id
AND tp.tvab = l.tvab
/* For Twin 2 */
LEFT JOIN twin_data AS td2 ON p2.id = td2.id
AND p2.tvab = td2.tvab
LEFT JOIN informant_data AS id2 ON p2.id = id2.id
AND p2.tvab = id2.tvab
LEFT JOIN harmony AS h2 ON p2.id = h2.id
AND p2.tvab = h2.tvab
LEFT JOIN lentus AS l2 ON p2.id = l2.id
AND p2.tvab = l2.tvab,
person_data AS p1,
person_data AS p2,
postal_groups AS pg
WHERE
/* p1 gets main twin and p2 gets his/her twin. */
/* ptvab is a field inverted from tvab */
p1.id = tp.id AND p1.tvab = tp.tvab AND
Tutorial de Introduo Do MySQL
185
p2.id = p1.id AND p2.ptvab = p1.tvab AND
/* Just the sceening survey */
tp.survey_no = 5 AND
/* Skip if partner died before 65 but allow emigration (dead=9) */
(p2.dead = 0 OR p2.dead = 9 OR
(p2.dead = 1 AND
(p2.death_date = 0 OR
(((TO_DAYS(p2.death_date) - TO_DAYS(p2.birthday)) / 365)
>= 65))))
AND
(
/* Twin is suspect */
(td.future_contact = 'Yes' AND td.suspect = 2) OR
/* Twin is suspect - Informant is Blessed */
(td.future_contact = 'Yes' AND td.suspect = 1
AND id.suspect = 1) OR
/* No twin - Informant is Blessed */
(ISNULL(td.suspect) AND id.suspect = 1
AND id.future_contact = 'Yes') OR
/* Twin broken off - Informant is Blessed */
(td.participation = 'Aborted'
AND id.suspect = 1 AND id.future_contact = 'Yes') OR
/* Twin broken off - No inform - Have partner */
(td.participation = 'Aborted' AND ISNULL(id.suspect)
AND p2.dead = 0))
AND
l.event = 'Finished'
/* Get at area code */
AND SUBSTRING(p1.postal_code, 1, 2) = pg.code
/* Not already distributed */
AND (h.nurse IS NULL OR h.nurse=00 OR h.doctor=00)
/* Has not refused or been aborted */
AND NOT (h.status = 'Refused' OR h.status = 'Aborted'
OR h.status = 'Died' OR h.status = 'Other')
ORDER BY
tvid;
Algumas explicaes:
CONCAT(p1.id, p1.tvab) + 0 AS tvid
N queremos ordenar o id e o tvab concatenados na ordem numrica. Adicionando 0 ao resul-
tado faz o MySQL tratar o resultado como um nmero.
coluna id
Esta identifica um par de gmeos. Ela uma chave em todas as tabelas.
column tvab
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 ta-
bela 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 con-
sultas mais rpidas.
Tutorial de Introduo Do MySQL
186
Na nossa mquina de produo (Um UltraSPARC 200MHz), esta consulta retorna entre 150-200 li-
nhas 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
3.7.2. Mostrando uma Tabela sobre a Situao dos Pa-
res Gmeos
Cada entrevista termina com um cdigo da situao chamado event. A consulta mostrada abaixa
usada para mostrar uma tabela sobre todos pares gmeos combinados por evento. Ela indica em
quantos pares ambos gmeos terminaram, em quantos pares um gmeo terminou e o outro foi recu-
sado e assim por diante.
SELECT
t1.event,
t2.event,
COUNT(*)
FROM
lentus AS t1,
lentus AS t2,
twin_project AS tp
WHERE
/* We are looking at one pair at a time */
t1.id = tp.id
AND t1.tvab=tp.tvab
AND t1.id = t2.id
/* Just the sceening survey */
AND tp.survey_no = 5
/* This makes each pair only appear once */
AND t1.tvab='1' AND t2.tvab='2'
GROUP BY
t1.event, t2.event;
3.8. Utilizando MySQL com Apache
Existem programas que lhe permite autenticar seus usurios a partir de um banco de dados MySQL
e tambm permite gravar seus arquivos de log em uma tabela MySQL.
Voc pode alterar o formato de log do Apache para ser facilmente lido pelo MySQL colocando o se-
guinte no arquivo de configurao do Apache:
LogFormat \
"\"%h\",%{%Y%m%d%H%M%S}t,%>s,\"%b\",\"%{Content-Type}o\", \
\"%U\",\"%{Referer}i\",\"%{User-Agent}i\""
Para carregar uma arquivo de log naquele formato dentro do MySQL, voc pode usar uma instruo
deste tipo:
Tutorial de Introduo Do MySQL
187
LOAD DATA INFILE '/local/access_log' INTO TABLE nome_tabela
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
A tabela chamada deve ser criada para ter colunas que correpondem a aquelas que a linha LogFor-
mat gravam no arquivo de log.
Tutorial de Introduo Do MySQL
188
Captulo 4. Administrao do Bancos
de Dados MySQL
4.1. Configurando o MySQL
4.1.1. Opes de Linha de Comando do mysqld
Na maioria dos casos voc deve gerenciar as opes do mysqld por meio dos arquivos de opes.
See Seco 4.1.2, Arquivo de Opes my.cnf.
mysqld e mysqld.server lem opes dos grupos mysqld e server. mysqld_safe l as
opes dos grupos mysqld, server, mysqld_safe e mysqld_safe. Um servidor MySQL
embutido normalmente l opes do grupos server, embedded e xxxxx_SERVER, onde
xxxxx o nome da aplicao.
mysqld aceita os seguintes opes de linha de comando. Aqui est uma lista das mais comuns. Pa-
ra uma lista completa execute mysqld --help. As opes usadas para replicao esto listadas
em uma seo separada, veja Seco 4.11.6, Opes de Inicializao da Replicao.
--ansi
Utilizar a sintaxe ANSI SQL no lugar da sintaxe MySQL See Seco 1.8.2, Executando o
MySQL no modo ANSI.
-b, --basedir=path
Encaminho para o diretrio de instalao. Todos os caminhos normalmente so resolvidos em
relao a este.
--big-tables
Permite grandes conjuntos de resultados salvando todos os conjuntos temporrios em um arqui-
vo. 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 Win-
dows 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 re-
comendada desde o MySQL 4.0 (MySQL 3.23 no est apto a fornecer um chroot 100% fecha-
do. 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 especifi-
car --core-file-size para mysqld_safe. See Seco 4.8.2, mysqld-safe, o wrap-
per 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 Utili-
zado para Dados e Ordenao.
--default-table-type=tipo
Configura o tipo de tabela padro. See Captulo 7, Tipos de Tabela do MySQL.
--delay-key-write[= OFF | ON | ALL]
Como o DELAYED KEYS do MyISAM deve ser usado. See Seco 5.5.2, Parmetros de Sinto-
nia do Servidor.
--delay-key-write-for-all-tables; No MySQL 4.0.3 voc deve usar
--delay-key-write=ALL.
No descarrega buffers das chaves entre escritas em nenhuma tabela MyISAM. See Seco 5.5.2,
Parmetros de Sintonia do Servidor.
--des-key-file=filename
Read the default keys used by DES_ENCRYPT() and DES_DECRYPT() from this file.
--enable-external-locking (era --enable-locking)
Habilita o bloqueio do sistema. Perceba que se usar esta opo em um sistema que no possui
um lockd() completamente funcional (como no Linux) voc pode fazer com que o mysqld entre
em deadlock.
--enable-named-pipe
Habilita suporte para named pipes (somente no NT/Win2000/XP).
-T, --exit-info
Esta uma mscara binria com diferntes parmetros que pode ser usada para depurar o servi-
dor 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 ope-
racional lidar com a sincronizao com o disco. See Seco A.4.1, O Que Fazer Se o MySQL
Continua Falhando.
-?, --help
Administrao do Bancos de Dados MySQL
190
Mostra uma pequena ajuda e sai.
--init-file=arquivo
L comandos SQL do arquivo especificado na inicializao.
-L, --language=...
Mensagens de erro do cliente na lngua especificada. Pode ser fornecido como um caminho
completo. See Seco 4.7.2, Mensagens de Erros em Outras Lnguas.
-l, --log[=arquivo]
Log de conexes e consultas ao arquivo. See Seco 4.10.2, O Log de Consultas.
--log-bin=[arquivo]
Registra todas as consultas que alteram dados em arquivo. Usado para backup e replicao. See
Seco 4.10.4, O Log Binrio.
--log-bin-index[=arquivo]
Arquivo de ndice para nomes de arquivos de log binario. See Seco 4.10.4, O Log Binrio.
--log-error[=arquivo]
Registra mensagens de erro e inicializao neste arquivo. See Seco 4.10.1, O Log de Erros.
--log-isam[=arquivo]
Log de todas alteraes ISAM/MyISAM no arquivo (usado somente quando estiver depurando
bancos ISAM/MyISAM).
--log-long-format
Registra algumas informaes extras nos aruivos de log (log de atualizaes, log binrio de atua-
lizaes 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 n-
dices 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 pro-
psito 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 atuali-
zaes e log de consultas lentas, independente de qual est ativado). Por exemplo, nome do usu-
rio 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
Administrao do Bancos de Dados MySQL
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 Sec-
o 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 pro-
blema no qual o sistema operacional faz com que o mysqld faa a troca em disco. Note que o
uso desta opo exige que voc execute o servidor como root, que normalmente no uma boa
idia por razes de segurana.
--myisam-recover [=opo[,opo...]]] onde opo qualquer com-
binao
de DEFAULT, BACKUP, FORCE ou QUICK. Voc tambm pode configurar isto explicitamente
para "" se voc deseja desabilitar esta opo. Se esta opo for usada, o mysqld ir conferir na
abertura se a tabela est marcada como quebrada ou se a tabela no foi fechada corretamente. (A
ltima opo funciona somente se voc estiver executando com --skip-locking). Se este
for o caso mysqld ir executar uma conferncia na tabela. Se a tabela estiver corrompida, o
mysqld ir tentar repar-la.
As seguintes opes afetam no funcionamento da reparao.
Opo Descrio
DEFAULT O mesmo que no fornecer uma opo para --myisam-recover.
BACKUP Se os dados da tabela foram alterados durante a recuperao, salve um backup
do arquivo de dados nome_tabela.MYD como no-
me_tabela_dia_hora.BAK.
FORCE Execute a recuperao mesmo se perdermos mais de uma linha do arquivo
.MYD.
QUICK No confira as linhas na tabela se no existir nenhum bloco apagado.
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 co-
mo 4.1 em certos aspectos, facilitando a atualizao da verso 4.0 para 4.1:
TIMESTAMP retornado com uma string com o formato 'YYYY-MM-DD HH:MM:SSS.
Administrao do Bancos de Dados MySQL
192
See Seco 6.2, Tipos de Campos.
--pid-file=caminho
Encaminha para o arquivo pid usado pelo mysqld_safe.
-P, --port=...
Nmero da porta para conexes TCP/IP.
-o, --old-protocol
Utilize o protocolo 3.20 para compatibilidade com alguns clientes muito antigos. See Sec-
o 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 des-
crio completa para todas as variveis na seo SHOW VARIABLES deste manual. See Sec-
o 4.6.8.4, SHOW VARIABLES. A seo de sintonia dos parmetros do servidor inclui infor-
maes 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 Sec-
o 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 automaticamen-
te para permanecer dentro de uma faixa dada e tambm ajusta o valor um pouco para corrigir pa-
ra 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 DATA-
BASES. See Seco 4.4.1, A Sintaxe de GRANT e REVOKE.
--safe-user-create
Administrao do Bancos de Dados MySQL
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 ta-
bela.
--skip-bdb
Disabilita o uso de tabelas BDB. Isto economizar memria e pode aumentar a velocidade de al-
gumas operaes.
--skip-concurrent-insert
Desliga a habilidade de selecionar e inserir ao mesmo tempo em tabelas MyISAM. (Isto s usa-
do 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 ta-
belas de permisso novamente executando mysqladmin flush-privileges ou mysq-
ladmin reload.)
--skip-host-cache
Nunca utiliza cache para nomes de mquina para resolues de nomes mais rpidos, mas pesqui-
sa o servidor DNS em todas conexes. See Seco 5.5.5, Como o MySQL Utiliza o DNS.
--skip-innodb
Disabilita o uso de tabelas Innodb. Isto ir economizar memria, espao em disco e aumentar a
velocidade de algumas operaes.
--skip-external-locking (era --skip-locking)
No utilizar bloqueio de sistema. Para usar isamchk ou myisamchk voc deve desligar o ser-
vidor. See Seco 1.2.3, Estabilidade do MySQL. Perceba que na Verso 3.23 do MySQL po-
de ser usado REPAIR e CHECK para reparar/conferir tabelas MyISAM.
--skip-name-resolve
Nomes de mquinas no so resolvidos. Todos os valores da coluna Host nas tabelas de per-
misses 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 pi-
pes 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
Administrao do Bancos de Dados MySQL
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 diret-
rio 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 DIREC-
TORY 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 me-
mria por erros para cada operao de alocao e liberao de memria. Esta consistncia mui-
to 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 conse-
guir um arquivo core. See Seco E.1, Depurando um Servidor MySQL.
--skip-thread-priority
Desabilita o uso de prioridade das threads para um tempo de resposta mais rpido.
--socket=path
No Unix, o arquivo socket para usar em conexes locais no lugar do padro /
tmp/mysql.sock. No Windows, o nome do pipe para usar em conexes locais que usam na-
med pipe (padro MySQL).
--sql-mode=value[,value[,value...]]
Os valores de opo pode ser qualquer combinao de: REAL_AS_FLOAT, PI-
PES_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 fi-
car vazio (--sql-mode="") se voc desejar limp-la.
NO_AUTO_VALUE_ON_ZERO afeta o tratamento de colunas AUTO_INCREMENT. Normal-
mente, 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 no-
va 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
Administrao do Bancos de Dados MySQL
195
NO_AUTO_VALUE_ON_ZERO.)
Diversos dos valores de opo so usados para compatibilidade com outros servidores. Se espe-
cificado, eles fazer o servidor omitir da sada de SHOW CREATE TABLE aquelas partes da ins-
truo que no so entendidas pelas verses anteriores do MySQL ou outros servidores de banco
de dados. Usar estes valores de opes resulta em instrues CREATE TABLE que so mais
portveis para usar com outros servidores:
Os valores NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_DIR_IN_CREATE, e
NO_KEY_OPTIONS causam a omisso da tabela de opes, ou opes pertencentes a defini-
o de colunas ou ndices.
Os valroes MYSQL323 e MYSQL40 so para compatibilidade com o MySQL 3.23 e MySQL
4.0.
O valor usado para compatibilidade com outros servidores so DB2, MAXDB, MSSQL, ORA-
CLE, e POSTGRESQL.
Estas opes tambm afetam a sada do mysqldump, porque este programa usa SHOW CREA-
TE 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 gru-
po 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 am-
bas das seguintes opes de linhas de comando:
--sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY
--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 usa-
rem 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 no-
vos com nomes diferentes. Com o comportamento antigo, o Linux parece ter ``perda'' de mem-
ria, j que ela alocada na cache de entrada do diretrio em vez da cache de disco.
--transaction-isolation={ READ-UNCOMMITTED | READ-COMMITTED |
REPEATABLE-READ | SERIALIZABLE }
Configura o nvel de isolao da transao padro. See Seco 6.7.6, Sintaxe SET TRANSAC-
TION.
-t, --tmpdir=path
Administrao do Bancos de Dados MySQL
196
Caminho do diretrio usado para criar os arquivos temporrios. Ele pode ser til se o seu diret-
rio 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 ca-
minhos devem ser separados por dois pontos (:) (ponto e vrgula (;) no Windows). Eles sero
usados de acordo com o mtodo round-robin.
-u, --user=[nome_usurio | id_usurio]
Executar o servidor mysqld como o usurio nome_usurio ou id_usrio (numrica).
(``User'' neste contexto se refere a conta de login do sistema, no um usurio MySQL listado na
tabela de permisses.)
Esta opo obrigatria quando o mysqld iniciado como usurio root. O servidor ir alte-
rar o ID do usurio durante sua inicializao, fazendo com que ele seja executado como este
usurio particular em vez de root. See Seco 4.3.2, Como Tornar o MySQL Seguro contra
Crackers.
A partir do MySQL 3.23.56 e 4.0.12: Para evitar um possvel furo na segurana onde um usurio
adiciona uma opo --user=root a algum arquivo my.cnf (fazendo o servidor executar co-
mo root, o mysqld usa apenas a primeira opo --user especificada e produz um aviso se
houver mltiplas opes --user.
As opes em /etc/my.cnf e datadir/my.cnf so processadas antes de uma opo de
linha de comando, assim recomendado que voc coloque uma opo --user em /
etc/my.cnf e especifique um outro valor diferente de root. A opo em /etc/my.cnf
ser encontrada antes de qualques outra opo --user, o que assegura que o servidor no exe-
cute como root, e que um aviso seja exibido se qualquer outra opo --user for encontrada.
-V, --version
Mostra a informao da verso e sai.
-W, --log-warnings
Imprime avisos como Aborted connection... no arquivo .err. recomendvel habili-
tar 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 Comuni-
cao / Comunicao Abortada.
Esta opo se chamava --warnings.
Pode se alterar a maioria dos valores de um servidor em execuo com o comnado SET. See Sec-
o 5.5.6, Sintaxe de SET.
4.1.2. Arquivo de Opes my.cnf
O MySQL pode, desde a verso 3.22, ler as opes padres de inicializao para o servidor e para
clientes dos arquivos de opes.
No Windows, o MySQL l opes padres dos seguintes arquivos:
Nome do Arquivo Propsito
Windows-directory\my.ini Opes globais
C:\my.cnf Opes globais
Windows-directory a localizao do seu diretrio Windows.
No Unix, o MySQL l opes padres dos seguintes arquivos:
Administrao do Bancos de Dados MySQL
197
Nome do arquivo Propsito
/etc/my.cnf Opes globais
DATADIR/my.cnf Opes especficas do servidor
defaults-extra-file O arquivo especificado com -
-defaults-extra-file=#
~/.my.cnf Opes especficas do usurio
DATADIR o diretrio de dados do MySQL (normalmente /usr/local/mysql/data para ins-
talaes binrias ou /usr/local/var para instalaes de cdigo fonte). Perceba que este o di-
retrio 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 co-
mando.)
Note que no Windows, voc deve especificar todos os caminhos no arquivo de opo com / no lu-
gar 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 Apndi-
ce 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 su-
porte! 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 co-
Administrao do Bancos de Dados MySQL
198
locar um argumento entre aspas duplas, se o argumento de uma opo conter um caracter de co-
mentrio.
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 ver-
so 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 te-
nha 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 vo-
c 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 chama-
dos 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 configura-
o 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 No l nenhum arquivo de opes.
Administrao do Bancos de Dados MySQL
199
--print-defaults Imprima o nome do programa e todas opes.
-
-de-
faults-fi-
le=caminho-para-arquivo-padr
o
Utilize somente o arquivo de configurao especfica-
do.
-
-de-
faults-ex-
tra-fi-
le=caminho-para-arquivo-padr
o
Leia este arquivo de configurao depois do arquivo
de configurao global mas antes do arquivo de confi-
gurao do usurio.
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 ar-
gumento 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 es-
pecificadas vrias vezes desta forma mas no l arquivos de opes, voc s precisa adicionar duas
linhas para lhe dar esta capacidade. Verifique o cdigo fonte de qualquer um dos clientes MySQL
padro para ver como fazer isto.
Nos scripts shell voc pode usar o comando my_print_defaults para analisar os arquivos de
opo. O seguinte exemplo mostar a sada que my_print_defaults pode produzir quando
quando pedido para mostrar as opes encontradas nos grupos [client] e [mysql]:
shell> my_print_defaults client mysql
--port=3306
--socket=/tmp/mysql.sock
--no-auto-rehash
4.2. Executando Mltiplos MySQL Servers na
Mesma Mquina
Em alguns casos voc pode precisar de executar mltiplos servidores mysqld executando na mes-
ma mquina. Voc pode desejar testar uma nova verso do MySQL enquanto a deixa a sua instala-
o da verso de produo existente sem perturbao. Ou voc pode desejar dar acesso a diferentes
usurios em diferentes servidores mysqld gerenciados por eles mesmos. (Por exemplo, voc pode
seu um provedor de servios de internet que quer fornecer instalaes independentes do MySQL pa-
ra clientes diferentes).
Para executar mltiplos servidores em uma nica mquina, cada servidor deve ter valores nicos pa-
ra diversos parmetros operacionais. Isto deve ser configurado na linha de comando ou em arquivos
de opes. Veja Seco 4.1.1, Opes de Linha de Comando do mysqld e Seco 4.1.2,
Arquivo de Opes my.cnf.
Pelo menos as seguintes opes devem ser diferente para cada servidor:
--port=port_num
--socket=path
--shared-memory-base-name (apenas Windows; novo no MySQL 4.1)
Administrao do Bancos de Dados MySQL
200
--pid-file=path (apenas Unix)
--port controla o nmero da porta para conexes TCP/IP. --socket controla o caminho do ar-
quivo de socket no Unix e o nome do named pipe no Windows. ( necessrio nomes de pipes distin-
tos 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 so-
bre 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.
Administrao do Bancos de Dados MySQL
201
Se voc tiver mltiplas instalaes do MySQL em diferentes locais, normalemente voc pode espe-
cificar 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 pa-
dro 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, supo-
nha 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 correspon-
dente 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 preci-
sa executar mltiplos servidores em uma base mais permanente, ser mais coonveniente usar os ar-
quivos de opes para especificar, para cada servidor, aquelas opes que devem ser nicas para ele.
See Seco 4.1.2, Arquivo de Opes my.cnf.
4.2.1. Executando Mltiplos Servidores no Windows
Voc pode executar mltiplos servidor no Windows iniciando-os manualmente a partir da linha de
comando, cada um com o parmetro operacional apropriado. Em sistemas baseados no Windows
NT, voc tambm tem a opo de instalar vrios servidores como servios Windows e execut-los
deste modo. Instrues gerais sobre a execuco de servidores MySQL a partir da linha de comando
ou como servios so dados em Seco 2.6.1, Notas Windows. Esta seo descreve como se certi-
ficar de que voc inicioou cada servidor com valores diferentes para aquelas opes de inicializao
que devem ser unicas por servidor, como o diretrio de dados. (Estas opes so descritas em Sec-
o 4.2, Executando Mltiplos MySQL Servers na Mesma Mquina.)
4.2.1.1. Iniciando Mltiplos Servidores na Linha de Comando
Para iniciar vrios servidores manualmente na linha de comando, voc pode especificar a opo
apropriada na linha de comando ou no arquivo de opes. mais conveniente colocar as opes em
um arquivo de opo. Para fazer isto, crie uma arquivo de opo para cada servidor e mostre ao ser-
vidor o nome do arquivo com a opo --defaults-file quando voc execut-lo.
Suponha que voc queira executar o mysqld na porta 3307 com um diretrio de dados de
C:\mydata1, e mysqld-max na porta 3308 com um diretrio de dados de C:\mydata2. Para
conseguir isto, crie dois arquivos de opes. Por exemplo, crie um arquivo chamado
C:\my-opts1.cnf que se parea com isto:
[mysqld]
datadir = C:/mydata1
port = 3307
Crie um segundo arquivo chamado C:\my-opts2.cnf que se parea com isto:
[mysqld]
datadir = C:/mydata2
port = 3308
Ento inicie cada servidor com seus prprios arquivos de opo:
shell> mysqld --defaults-file=C:\my-opts1.cnf
shell> mysqld-max --defaults-file=C:\my-opts2.cnf
(No NT, o servidor iniciar em segundo plano, assim voc precisar enviar estes dois comandos em
janelas de console separadas.)
Para desligar o servidor, voc deve conectar a porta apropriada:
Administrao do Bancos de Dados MySQL
202
shell> mysqladmin --port=3307 shutdown
shell> mysqladmin --port=3308 shutdown
Servidores configurados como descrito permitir que clientes se conectem por TCP/IP. Se voc tam-
bm quiser permitir conexes named pipe, use os servidores mysqld-nt ou mysqld-max-nt e
especifique as opo que habilitem o named pipe e especifique os seus nomes. (Cada servidor que
suporta conexes named pipes deve ter um nome nico). Por exemplo, o arquivo
C:\my-opts1.cnf pode ser escrito da seguinte maneira:
[mysqld]
datadir = C:/mydata1
port = 3307
enable-named-pipe
socket = mypipe1
Esto inicie o servidor desta forma:
shell> mysqld-nt --defaults-file=C:\my-opts1.cnf
C:\my-opts2.cnf seria modificado de forma parecida para uso com o segundo servidor.
4.2.1.2. Iniciando Mltiplos Servidores Como Servios
Em sistemas baseados no NT, um servidor MySQL pode ser executado como um servio Windows.
O procedimento para instalao, controle e remoo de um nico servio MySQL est descrito em
Seco 2.1.1.7, Iniciando o MySQL no Windows NT, 2000, ou XP.
A partir do MySQL 4.0.2, voc pode instalar vrios servidores como servios. Neste caso, voc deve
ter certeza de que cada servidor usa um nome de servio diferente junto com todos os outros par-
metros que devem ser nico por servidor.
Para as seguintes instrues, assuma que voc queira executar o servidor mysqld-nt a partir de
duas verses diferentes do MySQL que est instalado em C:\mysql-4.0.8 e
C:\mysql-4.0.17, respectivamente. (Este pode ser o caso se voc estiver executando a verso
4.0.8 como seu servidor de produo, mas queira testar o 4.0.17 antes de atualiz-lo.)
Os seguintes princpios so relevantes ao instalr um servio MySQL com a opo --install:
Se voc 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 gru-
po de opo [mysqld] e l as opes do grupo que tem o mesmo nome que o servio. O servi-
dor l as opes do arquivo de opo padro.
Se voc especificar uma opo --defaults-file depois do nome do servio, o servidor ig-
nora o arquivo de opes padro e l as opes apenas do grupo [mysqld] do arquivo chama-
do.
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 ins-
trues 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
Administrao do Bancos de Dados MySQL
203
mysqld-nt 4.0.8 usando o nome de servio [mysqld1] e o mysqld-nt 4.0.17 usando o
nome de servio mysqld2. Neste caso voc pode usar o grupo [mysqld1] para o 4.0.8 e o
grupo [mysqld2] para o MySQL 4.0.14. Por exemplo, voc pode configurar o C:\my.cnf
desta forma:
# opes para o servio mysqld1
[mysqld1]
basedir = C:/mysql-4.0.8
port = 3307
enable-named-pipe
socket = mypipe1
# opes para o servio mysql2
[mysqld2]
basedir = C:/mysql-4.0.17
port = 3308
enable-named-pipe
socket = mypipe2
Instale os servios como a seguir, usando o caminho completo para o servidor para assegurar
que o Windows registra o programa executvel correto para cada servio:
shell> C:\mysql-4.0.8\bin\mysqld-nt --install mysqld1
shell> C:\mysql-4.0.17\bin\mysqld-nt --install mysqld2
Para iniciar os servios, use o gerenciador de servios, ou use NET START com o nome de ser-
vio apropriado:
shell> NET START mysqld1
shell> NET START mysqld2
Para parar os servios, use o gerenciador de servios, ou use NET STOP com o mesmo nome de
servio.
shell> NET STOP mysqld1
shell> NET STOP mysqld2
Nota: Antes do MySQL 4.0.17, apenas um servidor instalado usando o nome de servio padro
(MySQL) ou instalado com um nome de servio de mysqld ir ler o grupo [mysqld] no ar-
quivo de opes padro. A partir da verso 4.0.17, todos os servidores lem o grupo [mysqld]
se eles lem o arquivo de opes padro, mesmo de esles esto instalados usando outro nome de
servio. Isto permite que voc use o grupo [mysqld] para opes que devam ser usadas por
todos os servios MySQL, e um grupo de opo com o nome de cada servio para o uso do ser-
vidor com aquele nome de servio.
Especifique as opes para cada servidor em arquivos separados e use --defaults-file
quando instalar os servios para dizer para cada servidor que arquivo usar. Neste caso, cada ar-
quivo deve listar as opes usando um grupo [mysqld].
Com esta abordagem, para especificar as opes para o mysqld-nt 4.0.8, crie um arquivo
C:\my-opts1.cnf que se parea com:
[mysqld]
basedir = C:/mysql-4.0.8
port = 3307
enable-named-pipe
socket = mypipe1
Para o mysqld-nt 4.0.17, crie um arquivo C:\my-opts2.cnf que se parea com:
[mysqld]
basedir = C:/mysql-4.0.17
Administrao do Bancos de Dados MySQL
204
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 ser-
vio, 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 pa-
dro.
4.2.2. Executando Mltiplos Servidores no Unix
O modo mais fcil de executar diversos servidores no Unix compil-los com diferentes portas
TCP/IP e arquivos socket, assim cada um est escutando em diferentes interfaces de rede. Tambm,
compilando em diferentes diretrios bases para instalao, que automaticamente resulta em diferen-
tes localizaes de diretrios de dados, arquivos log e arquivos PID para cada um dos seus servido-
res.
Considere que um servidor existente est configurado para a porta e arquivo socket padres. Para
configurar um novo servidor para ter parmetros operacionais diferentes, use um comando confi-
gure assim:
shell> ./configure --with-tcp-port=port_number \
--with-unix-socket-path=nome_arquivo \
--prefix=/usr/local/mysql-4.0.17
Aqui nmero_porta e nome_arquivo deve ser diferente que o nmero da porta e o caminho
do arquivo socket padres e o valor --prefix deve especificar um diretrio de instalao diferen-
te daquele usado pelo servidor existente.
Voc pode conferir o socket usado por qualquer servidor MySQL em execuo com este comando:
Se voc tem um servidor MySQL escutando em uma porta dada, voc pode usar o seguinte coman-
do para descobrir quaie parmetros operacionais ele est usando para diversas variveis importantes
configurveis, inclundo o diretrio base e o nome do socket:
shell> mysqladmin --host=host_name --port=port_number variables
Com a informao exibida por aquele comando, voc pode dizer quais valores de opo no usar ao
configurar um servidor adicional.
Note que se voc especificar ``localhost'' como o nome da mquina, mysqladmin ir por pa-
dro usar uma conexo sockets Unix em vez de TCP/IP. No MySQL 4.1 voc tambm pode especi-
ficar o protocolo a ser usado com a opo --protocol={TCP | SOCKET | PIPE | ME-
MORY}.
No necessrio compilar um novo servidor MySQL apenas para iniciar com uma arquivo socket
ou nmero de porta TCP/IP diferentes. Tambm possvel especificar estes valores em tempo de
Administrao do Bancos de Dados MySQL
205
execuo. Um modo de faz-lo usando as opes de linha de comando:
shell> /path/to/mysqld_safe --socket=file_name --port=port_number
Para usar outro diretrio de banco de dados para o segundo servidor, passe uma opo -
-datadir=caminho para o mysqld_safe.
Um outro modo de conseguir este efeito usar as variveis de ambiente para configurar o nome do
socket e o nmero da porta:
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> scripts/mysql_install_db
shell> 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 se-
gundo 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 bo-
ot deve executar o seguinte comando uma vez para cada servidor com um caminmho apropriado do
arquivo de opo para cada comando:
mysqld_safe --defaults-file=path-to-option-file
Cada arquivo de opo deve conter valores especficos para um dados servidor.
No Unix, o script mysqld_multi outro modo de de iniciar vrios servidores. See Seco 4.8.3,
mysqld_multi, programa para gerenciar mltiplos servidores MySQL.
4.2.3. Usando Programas Clientes em um Ambiente
Multi-Servidor
Quando voc quiser conectar com um programa cliente a um servidor MySQL que est escutando
diferentes interfaces de rede em vez daquelas compiladas em seu programa cliente, voc pode co-
nectar usando um dos seguintes mtodos:
Inicie o cliente com --host=nome_mquina --port=nmero_porta para conectar
com TCP/IP a uma mquina remota, ou com --host=localhost -
-socket=nome_arquivo para conectar a mquina local via um socket Unix ou um named
pipe do Windowes.
No MySQL 4.1, inicie o cliente com --protocol=tcp para conectar via TCP/IP, -
-protocol=socket para conectar via socket Unix ou --protocol=pipe para conectar
via named pipe, ou --protocol=memory para conectar via memria compartilhada. Para co-
nexes TCP/IP, voc tambm pode precisar especificar as opes --host e --port. Para ou-
tros 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 vari-
veis de ambiente no arquivo .login, assim eles sero aplicados sempre quer voc logar no sis-
Administrao do Bancos de Dados MySQL
206
tema. See Apndice F, Variveis de Ambientes do MySQL.
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.
Administrao do Bancos de Dados MySQL
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 tam-
bm afeta conexes existentes como indicado em Seco 4.4.3, Quando as Alteraes nos Pri-
vilgios 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 PASS-
WORD. A funo PASSWORD() desnecessria se voc especificar a senha usando a instruo
GRANT ... IDENTIFIED BY ou o comando mysqladmin password. See Sec-
o 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. En-
tretanto, 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 utili-
zar 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. Normal-
mente, voc deve ter um registro na tabela user que combine exatamente com o nome de m-
quina e o nome de usurio que forem fornecidos na mensagem de erro. Por exemplo, se voc ob-
ter 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 m-
quina de onde voc est tentando conectar, depois execute o comando mysqladmin flush-
privileges. Se voc no estiver executando o MySQL Verso 3.22 e voc no sabe o nme-
ro 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 m-
quina onde executado o servidor. Depois tente conectar a partir da mquina cliente, a informa-
o 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 proble-
ma.
Se voc obter uma mensagem de erro onde o nome da mquina no exibido ou, no lugar do no-
Administrao do Bancos de Dados MySQL
230
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.
Especifique nmeros IPs no lugar de nomes nas tabelas de privilgios do MySQL.
Inicie o mysqld com --skip-name-resolve.
Inicie o mysqld com --skip-host-cache.
Conecte localhost se voc estiver executando o servidor e o cliente na mesma mqui-
na.
Coloque os nomes das mquinas clientes em /etc/hosts.
Se mysql -u root test funciona mas mysql -h nome_servidor -u root
test resultar em Access denied, ento voc pode no ter o nome correto para a sua mqui-
na na tabela user. Um problema comum quando o valor de Host na entrada da tabela user
especifica um nome de mquina no qualificado, mas as rotinas de resoluo de nomes de seu
sistema retornam um nome qualificado completo do domnio (ou vice-versa). Por exemplo, se
voc tem uma entrada com o nome 'tcx' na tabela user, mas seu DNS diz ao MySQL que o
nome da mquina 'tcx.subnet.se', a entrada no ir funcionar. Tente adicionar um re-
gistro tabela user que contenha o nmero IP de sua mquina como o valor da coluna Host.
(Uma alternativa, seria adicionar um registro tabela user com o valor de Host contendo um
metacaracter, por exemplo, 'tcx.%'. Entretanto, o uso de nomes de mquinas terminando com
'%' inseguro e no recomendado!)
Se mysql -u nome_usurio test funciona mas mysql -u nome_usurio ou-
tro_bd no funconar, voc no possui uma entrada para outro_bd listado na tabela db.
Se mysql -u nome_usurio nome_bd funciona quando executado no prprio servidor,
mas mysql -u nome_mquina -u nome_usurio nome_bd no funciona quando
executado em outra mquina cliente, voc no possui o nome da mquina cliente listado na tabe-
la user ou na tabela db.
Se voc no estiver entendendo porque obtem Access denied, remova da tabela user todas
as entradas da coluna Host que contenham meta caracteres (entradas que contenham '$' ou '_').
Um erro muito comum inserir uma nova entrada com Host='%' e User='algum usu-
rio', 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 lo-
calhost! 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 apli-
cam-se tabela db.
Administrao do Bancos de Dados MySQL
231
Se voc obter o erro quando estiver utilizando comandos SQL SELECT ... INTO OUTFI-
LE ou LOAD DATA INFILE, a entrada na tabela user provavelmente no tem o privilgio fi-
le 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 es-
pecificou 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 flush-
privileges 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 configu-
rar 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 conec-
tar ao servidor com mysql -u nome_usurio nome_bd ou mysql -u no-
me_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 es-
pecificar 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 come-
ar a utilizar as tabelas de permisses novamente sem reinici-lo.
Se tudo mais falhar, inicie o servidor mysqld com uma opo de depurao (por exemplo, -
-debug=d,general,query). Isto ir imprimir informaes de mquinas e usurios sobre
tentativas de conexes, e tambm informaes sobre cada comando disparado. See Seco E.1.2,
Criando Arquivos Trace (Rastreamento).
Se voc tiver outros problemas com as tabelas de permisses do MySQL e sente que deve enviar
o problema para a lista de discusso, sempre fornea um descarga das tabelas de permisses do
seu MySQL. Voc pode descarregar as tabelas com o comando mysqldump mysql. Como
sempre, envie seus problemas utilizando o script mysqlbug. See Seco 1.7.1.3, Como relatar
erros ou problemas. Em alguns casos voc pode precisar reiniciar o mysqld com a opo -
-skip-grant-tables para executar o mysqldump.
4.4. Gerenciamento das Contas dos Usurios
no MySQL
4.4.1. A Sintaxe de GRANT e REVOKE
GRANT priv_type [(column_list)] [, tipo_priv [(column_list)] ...]
ON {tbl_name | * | *.* | db_name.*}
Administrao do Bancos de Dados MySQL
232
TO user_name [IDENTIFIED BY [PASSWORD] 'password']
[, user_name [IDENTIFIED BY [PASSWORD] 'password'] ...]
[REQUIRE
NONE |
[{SSL| X509}]
[CIPHER cipher [AND]]
[ISSUER issuer [AND]]
[SUBJECT subject]]
[WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # |
MAX_UPDATES_PER_HOUR # |
MAX_CONNECTIONS_PER_HOUR #]]
REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
ON {tbl_name | * | *.* | db_name.*}
FROM user_name [, user_name ...]
O comando GRANT implementado no MySQL verso 3.22.11 ou posterior. Para verses anteriores
do MySQL, a instruo GRANT no faz nada.
Os comandos GRANT e REVOKE permitem aos administradores do sistema criar usurios e conceder
e revogar direitos aos usurios do MySQL em quatro nveis de privilgios:
Nvel Global
Privilgios globais aplicam para todos os bancos de dados em um determinado servidor. Estes
privilgios so armazenados na tabela mysql.user. GRANT ALL ON *.* e REVOKE ALL
ON *.* concedero e revogaro apenas privilgios globais.
Nvel dos bancos de dados
Privilgios de bancos de dados aplicam-se a todas as tabelas em um determinado banco de da-
dos. Estes privilgios so armazenados nas tabelas mysql.db e mysql.host. GRANT ALL
ON db.* e REVOKE ALL ON db.* concedero e revogaro apenas privilgios de banco de
dados.
Nvel das tabelas
Privilgios de tabelas aplicam-se a todas as colunas em uma determinada tabela. Estes privilgi-
os so armazenados na tabela mysql.tables_priv. GRANT ALL ON db.table e RE-
VOKE ALL ON db.table concedero e revogaro apenas privilgios de tabelas.
Nvel das colunas
Privilgios de colunas aplicam-se a uma nica coluna em uma determinada tabela. Estes privil-
gios so armazenados na tabela mysql.columns_priv.
Para as instrues GRANT e REVOKE, tipo_priv pode ser especificado como um dos seguintes:
ALL [PRIVILEGES] Configura todos os privilgios simples exceto WITH GRANT OP-
TION
ALTER Permite o uso de ALTER TABLE
CREATE Permite o uso de CREATE TABLE
CREATE TEMPORARY
TABLES
Permite o uso de CREATE TEMPORARY TABLE
DELETE Permite o uso de DELETE
DROP Permite o uso de DROP TABLE.
EXECUTE Permite que o usurio execute stored procedures (MySQL 5.0)
FILE Permite o uso de SELECT ... INTO OUTFILE e LOAD DATA
INFILE.
INDEX Permite o uso de CREATE INDEX e DROP INDEX
Administrao do Bancos de Dados MySQL
233
INSERT Permite o uso de INSERT
LOCK TABLES Permite o uso de LOCK TABLES em tabelas nas quais se tem o pri-
vilgio SELECT.
PROCESS Permite o uso de SHOW FULL PROCESSLIST
REFERENCES Para o futuro
RELOAD Permite o uso de FLUSH
REPLICATION CLIENT Da o direto ao usurio de perguntar onde o slave/master est.
REPLICATION SLAVE Necessrio para a replicao dos slaves (para ler logs binrio do mas-
ter).
SELECT Permite o uso de SELECT
SHOW DATABASES SHOW DATABASES exibe todos os banco de dados.
SHUTDOWN Permite o uso de mysqladmin shutdown
SUPER Permite a conexo (uma vez) mesmo se max_connections tiverem si-
do alcanados e executa o comando CHANGE MASTER, KILL th-
read, mysqladmin debug, PURGE MASTER LOGS e SET
GLOBAL
UPDATE Permite o uso de UPDATE
USAGE Sinnimo para ``sem privilgios.''
GRANT OPTION Sinnimo para WITH 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 privil-
gio 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, IN-
SERT, 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 re-
vogar 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 privi-
lgios de bancos de dados utilizando a sintaxe ON nome_bd.*. Se voc especificar ON * e esti-
ver 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 ....
Administrao do Bancos de Dados MySQL
234
Para acomodar concesses de direitos para usurios de mquinas arbitrrias, o MySQL suporta a es-
pecificao 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 es-
peciais ou meta caracteres (como o '%'), voc pode colocar o usurio ou o nome de mquina entre as-
pas (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 in-
serindo entradas com User='' na tabela mysql.user ou criando um usurio com um nome va-
zio 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 ca-
da 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 privilgi-
os, portanto a vida normalmente no to complicada como mostrado acima. Os detalhes do proce-
dimento de verificao dos privilgios so apresentados em Seco 4.3, Detalhes Gerais de Segu-
rana 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 DELE-
TE. Em outras palavras, GRANT pode criar registros na tabela user, mas REVOKE no as remove-
r; 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 privil-
gios 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 ma-
ke_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,
Administrao do Bancos de Dados MySQL
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 quais-
quer privilgios que ele tenha em um nvel especfico de privilgio. Voc deve ter cuidado ao forne-
cer 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 possi-
bilita fornecer somente os privilgios que possuir.
Esteja ciente que quando conceder a um usurio o privilgio GRANT em um nvel particular de pri-
vilgios, qualquer privilgio que o usurio j possua (ou seja fornecido no futuro!) nesse nvel tam-
bm pode ser concedido por este usurio. Suponha que voc conceda a um usurio o privilgio IN-
SERT em um banco de dados. Se voc conceder o privilgio SELECT no banco de dados e especi-
ficar WITH GRANT OPTION, o usurio alm de poder repassar o privilgio SELECT poder tam-
bm 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 po-
de 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 dei-
xar o MySQL um pouco mais lento.
Quando o mysqld inicia, todos os privilgios so lidos na memria. Privilgios de bancos de da-
dos, tabelas e colunas so iniciados um vez, e privilgios ao nvel de usurio fazem efeito na prxi-
ma 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 somen-
te para um usurio.
O SQL-99 no possui privilgios no nvel global ou de bancos de dados, e no suporta todos os
tipos de privilgios que o MySQL suporta. O MySQL no suporta os privilgios TRIGGER,
EXECUTE ou UNDER do SQL-99.
Os privilgios do SQL-99 so estruturadados em uma maneira hierrquica. Se voc remover um
usurio, todos os privilgios do usurio so removidos. No MySQL os privilgios concedidos
no so removidos automaticamente, mas voc deve remov-los se necessrio.
Se no MySQL voc possuir o privilgio INSERT em somente parte das colunas em uma tabela,
Administrao do Bancos de Dados MySQL
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 IN-
SERT 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.
4.4.2. Nomes de Usurios e Senhas do MySQL
Existem vrias diferenas entre a forma que nomes de usurios e senhas so usados pelo MySQL e a
forma que so usados pelo Unix ou Windows:
Nomes de usurios, como usado pelo MySQL para propsitos de autenticao, no tem nenhu-
ma relao com os nomes de usurios do Unix (nomes de login) ou nomes de usurios Win-
dows. A maioria dos clientes MySQL, por padro, tentam se conectar utilizando o nome de usu-
rio atual do Unix como o nome de usurio no MySQL, mas isto existe somente por convenin-
cia. 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 qual-
quer 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 en-
tre 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 Sec-
o 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 se-
guro 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 Sec-
o 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 es-
pecificar 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
Administrao do Bancos de Dados MySQL
237
Perceba que no ltimo exemplo a senha no 'nome_do_banco'.
Se voc deseja usar a opo -p para fornecer uma senha voc deve fazer assim:
mysql -u monty -pguess database_name
Em alguns sistemas, a chamada da biblioteca que utilizada pelo MySQL para solicitar por uma se-
nha corta automaticamente a senha para 8 caracteres. Internamente o MySQL no limita o tamanho
limite da senha.
4.4.3. Quando as Alteraes nos Privilgios tem Efeito
Quando o mysqld inicia, todas o contedo das tabelas de permisses so lidos em memria e tem
efeito neste momento.
As modificaes das tabelas de permisses que voc realiza utilizando GRANT, REVOKE ou SET
PASSWORD so imediatamente reconhecidas pelo servidor.
Se voc alterar as tabelas de permisses manualmente (utilizando INSERT, UPDATE, etc), voc de-
ve executar a instruo FLUSH PRIVILEGES ou executar mysqladmin flush-pri-
vileges ou mysqladmin reload para dizer ao servidor para recarregar as tabelas de permis-
ses. De outra forma suas alteraes no tero efeito at que o servidor seja reiniciado. Se voc alte-
rar as tabelas de permisses manualmente mas se esquecer de recarregar os privilgios, suas altera-
o vo parecer no ter feito nenhuma diferena!
Quando o servidor reconhecer que as tabelas de permisses foram alteradas, conexes existentes so
afetadas da seguinte forma:
Alteraes nos privilgios de tabelas e colunas fazem efeito com a prxima requisio do clien-
te.
Alteraes nos privilgios de bancos de dados fazem efeito no prximo comando USE no-
me_bd.
Alteraes nos privilgios globais e alteraes de senhas fazem efeito na prxima vez que o cli-
ente conectar.
4.4.4. Configurando os Privilgios Iniciais do MySQL
Depois de instalar o MySQL, voc configura os privilgios iniciais dos acessos executando
scripts/mysql_install_db. See Seco 2.3.1, Viso geral da instalao rpida. O script
mysql_install_db inicia o servidor mysqld, depois inicializa as tabelas de permisses com a
seguinte configurao dos privilgios:
O usurio root do MySQL criado como um superusurio que pode fazer qualquer coisa. Co-
nexes 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 signifi-
ca 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 mysqlad-
min ou mysqladmin processlist.
Administrao do Bancos de Dados MySQL
238
NOTA: Os privilgios padres so diferentes no Windows. See Seco 2.1.1.8, Executando o
MySQL no Windows.
Como sua instao inicialmente parcialmente aberta, uma das primeiras coisas que voc deve fazer
especificar uma senha para o usurio root do MySQL. Voc pode fazer isto como a seguir
(perceba que a senha foi especificada utilizando a funo PASSWORD()):
shell> mysql -u root mysql
mysql> SET PASSWORD FOR root@localhost=PASSWORD('nova_senha');
Substitua 'nova_senha' pela senha que voc deseja usar.
Se voc souber o que esta fazendo, voc tambm pode manipular diretamente a tabela privilgios:
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('nova_senha')
-> WHERE user='root';
mysql> FLUSH PRIVILEGES;
Outra forma de configurar a senha utilizando o comando mysqladmin:
shell> mysqladmin -u root password nova_senha
Somente usurios com acesso de escrita/atualizao ao banco de dados mysql podem alterar a se-
nha de outros usurios. Todos os usurios comuns (no os annimos) podem alterar somente a pr-
pria senha com um dos comandos acima ou com SET PASS-
WORD=PASSWORD('nova_senha').
Perceba que se voc atualizar a senha na tabela user diretamente utilizando UPDATE, voc deve
dizer ao servidor para reler as tabelas de permisses (com FLUSH PRIVILEGES), de outra forma
a alterao no seria notificada.
Uma vez que a senha de root foi configurada, voc deve informar a senha quando se conectar ao
servidor MySQL como root.
Voc pode desejar deixar a senha de root em branco para que voc no precise especific-la quan-
do realizar configuraes adicionais ou testes. Entretanto, tenha certeza de configur-la antes de uti-
lizar sua instalao para qualquer ambiente de produo.
Veja o script scripts/mysql_install_db para ver como so configurados os privilgios pa-
dres. Voc pode usar isto como uma base para ver como adicionar outros usurios.
Se voc deseja que os privilgios iniciais sejam diferentes do descrito acima, possvel modificar o
script mysql_install_db antes de execut-lo.
Para recriar as tabelas de permisses completamente, remova todos os arquivos .frm .MYI e
.MYD no diretrio contendo o banco de dados mysql. (Este o diretrio chamado mysql sob o di-
retrio do banco de dados, que listado quando voc executa mysqld --help.) Depois execute o
script mysql_install_db, possivelmente depois de edit-lo para criar os privilgios desejveis.
NOTA: Para verses do MySQL mais antigas que a verso 3.22.10, voc no deve apagar os arqui-
vos .frm. Se voc fizer isso acidentalmente, voc deve volt-los a partir de sua distribuio
MySQL antes de executar mysql_install_db.
4.4.5. Adicionando Novos Usurios ao MySQL
Existem duas maneiras de adicionar usurios: utilizando instrues GRANT ou manipulando as tabe-
las de permisses do MySQL diretamente. O mtodo preferido utilizar instrues GRANT, porque
elas so mais concisas e menos propensas a erros. See Seco 4.4.1, A Sintaxe de GRANT e REVO-
KE.
Administrao do Bancos de Dados MySQL
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 loca-
lhost, 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 ta-
bela 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 mysqlad-
min reload, mysqladmin refresh e mysqladmin flush-*, bem como o mysq-
ladmin 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 concedi-
dos nenhum privilgio---o tipo de privilgio USAGE permite a criao de um usurio sem privi-
lgios. 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 ins-
trues 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)
Administrao do Bancos de Dados MySQL
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 Pass-
word 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 coi-
sa que o GRANT USAGE faz.
O seguinte exemplo adiciona um usurio custom que pode acessar o banco de dados bankac-
cout 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 --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON bankaccount.*
-> TO custom@localhost
-> IDENTIFIED BY 'obscure';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON expenses.*
-> TO custom@'whitehouse.gov'
-> IDENTIFIED BY 'obscure';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON customer.*
-> TO custom@'server.domain'
-> IDENTIFIED BY 'obscure';
Para configurar os privilgios do usurio modificiando as tabelas de permisses diretamente, utilize
estes comandos (perceba o FLUSH PRIVILEGES no final):
shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('localhost','custom',PASSWORD('obscure'));
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('whitehouse.gov','custom',PASSWORD('obscure'));
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('server.domain','custom',PASSWORD('obscure'));
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
-> Create_priv,Drop_priv)
-> VALUES
-> ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
-> Create_priv,Drop_priv)
-> VALUES
-> ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
-> Create_priv,Drop_priv)
-> VALUES('server.domain','customer','custom','Y','Y','Y','Y','Y','Y');
Como no exemplo anterior que usaram as instrues INSERT, voc pode precisar de usar um nme-
Administrao do Bancos de Dados MySQL
241
ro diferentes de valores 'Y', dependendo de sua verso do MySQL.
As primeiras trs instrues INSERT adicionam entradas na tabela user que permite ao usurio
custom conectar a partir de vrias mquinas com a senha determinada, mas no concede permis-
ses ao mesmo (todos os privilgios so configurados com o valor padro de 'N'). As prximas
trs instrues INSERT adicionam entradas na tabela db que concedem privilgios custom para
os bancos de dados bankaccount, expenses e customer, mas s quando acessados partir
das mquinas apropriadas. Normalmente, depois de modificar as tabelas de permisses diretamente,
voc deve dizer ao servidor para recarreg-las (com FLUSH PRIVILEGES) para que as alteraes
nos privilgios tenham efeito.
Se voc deseja fornecer a um usurio especfico acesso de qualquer mquina em um determinado
domnio (por exemplo, meudomnio.com), voc pode utilizar uma instruo GRANT como a se-
guir:
mysql> GRANT ...
-> ON *.*
-> TO myusername@'%.mydomain.com'
-> IDENTIFIED BY 'mypassword';
Para realizar a mesma coisa modificando diretamente as tabelas de permisses, faa isto:
mysql> INSERT INTO user VALUES ('%.meudominio, 'meunomedeusuario'
PASSWORD('minhasenha'),...);
mysql> FLUSH PRIVILEGES;
4.4.6. Deletando Usurios do MySQL
DROP USER nome_usuario
Este comando foi adicionado ao MySQL 4.1.1.
Ele apaga um usurio que no possua nenhum privilgio.
Para deletar um usurio do MySQL voc usar o seguinte procedimento, realizando os passos na or-
dem mostrada.
1. 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. Delete o usurio com DROP USER.
Se voc estiver usando uma verso mais antiga do MySQL voc deve primeiro revogar os privilgi-
os e ento deletar o usurio com:
DELETE FROM mysql.user WHERE user='username' and host='hostname';
FLUSH PRIVILEGES;
4.4.7. Limitando os Recursos dos Usurios
A partir do MySQL 4.0.2 pode se limitar certos recursos por usurios.
At ento, o nico mtodo disponvel de limitao de uso do servidor MySQL era canfigurar a vari-
vel de inicializao max_user_connections para um valor diferente de zero. Mas este mto-
do estritamente global e no permite o gerenciamento de usurios individuais, o que pode ser de
Administrao do Bancos de Dados MySQL
242
interresse particular do Provedor de Servios Internet.
Consequentemente, o gerenciamento de trs recursos introduzido no nvel de usurio individual:
Nmero de todas as consultas por hora: Todos os comandos que podiam ser executados por um
usurio.
Nmero de todas as atualizaes por hora: Qualquer comando que altera qualquer tabela ou ban-
co 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 (*.*) glo-
bal, 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 co-
nexo 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) envi-
ando uma instruo GRANT com qualquer das clusulas acima, inclundo uma instruo GRANT
com os valores atuais.
Os valores atuais para todos os usurios para todos os usurios sero descarregados se os privilgios
forem recarregados (no servidor ou usando mysqladmin reload) ou se o comando FLUSH
USER_RESOURCES executado.
O resurso est habilitado assim que e concedido a um nico usurio qualquer das clusulas GRANT
de limitao.
Como um prerequisito para a habilitao deste recurso, a tabela user no banco de dados mysql
deve conter as colunas adicionais, como definido no script de criao de tabelas
mysql_install_db e mysql_install_db.sh no subdiretrio scripts.
4.4.8. Configurando Senhas
Na maioria dos casos voc deve utilizar GRANT para configurar seus usurios e senhas, portanto, as
informaes exibidas a seguir so aplicadas somentes para usurios avanados. See Seco 4.4.1,
A Sintaxe de GRANT e REVOKE.
Os exemplos nas sees precedentes ilustram um princpio importante: quando voc armazena uma
senha no-vazia utilizando INSERT ou UPDATE voc deve utilizar a funo PASSWORD() para
criptograf-la. Isto porque a tabela user armazena senhas na forma criptografada, e no como
texto puro. Se voc esquecer deste fato, provvel que voc possa tentar configurar senhas desta
forma:
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
VALUES('%','jeffrey','biscuit');
mysql> FLUSH PRIVILEGES;
Administrao do Bancos de Dados MySQL
243
O resultado que o valor 'biscuit' armazenado como a senha na tabela user. Quando o usu-
rio 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 crip-
tografada 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.
4.4.9. Mantendo Sua Senha Segura
No aconselhvel especificar uma senha de uma forma que a exponha e possa ser descoberta por
outros usurios. Os mtodos que voc pode usar para especificar sua senha quando executar progra-
mas clientes so listados abaixo, juntamente com as determinaes de riscos de cada mtodo:
Nunca fornea a um usurio normal acesso tabela mysql.user. O conhecimento de uma se-
nha 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 si-
milares em outras aplicaes).
Uso da opo -psua_senha ou --password=sua_senha na linha de comando. Isto
conveniente mas inseguro, porque sua senha se torna visvel para programas de informao do
sistema (como no ps) que pode ser chamado por outros usurios para exibir linhas de comando.
(clientes MySQL normalmente gravam zeros em cima do argumento da linha de comando du-
rante sua sequncia de inicializao, mas ainda existe um breve intervalo no qual o valor est vi-
svel.)
Uso das opes -p ou --pasword (sem especificar o valor sua_senha). Neste caso, o pro-
grama cliente solicita a senha do terminal:
shell> mysql -u user_name -p
Enter password: ********
Administrao do Bancos de Dados MySQL
244
Os caracteres '*' representam sua senha.
mais seguro digitar sua senha desta forma do que especific-la na linha de comando porque ela
no fica visvel a outros usurios. Entretanto este mtodo de digitar uma senha vlido somente
para programas que voc executa de forma interativa. Se voc deseja chamar um cliente de um
script que no execute interativamente, no existir oportunidade de digitar a senha do terminal.
Em alguns sistemas, voc pode descobrir que a primeira linha do seu script lida e interpretada
(incorretamente) como sua senha!
Armazenar a sua senha em um arquivo de configurao. Por exemplo, voc pode listar sua senha
na seo [client] do arquivo .my.cnf no seu diretrio home:
[client]
password=sua_senha
Se voc armazenar sua senha em um arquivo .my.cnf, o arquivo no pode ser lido por seu
grupo ou pelos outros usurios. Tenha certeza que o modo de acesso do arquivo 400 ou 600
See Seco 4.1.2, Arquivo de Opes my.cnf.
Voc pode armazenar sua senha na varivel de ambiente MYSQL_PWD, mas este mtodo deve
ser considerado extremamente inseguro e no deve ser usado. Algumas verses de ps incluem
uma opo para exibir o ambiente de processos em execuo; sua senha estaria em texto puro
para a leitura para todos os usurios. Mesmo em sistemas sem esta verso do ps, seria impru-
dncia assumir que no existe outro mtodo para observar o ambiente de processos. See Apndi-
ce F, Variveis de Ambientes do MySQL.
Em resumo, os mtodos mais seguros seriam que o programa cliente solicitasse a senha ou especifi-
car a senha em um arquivo .my.cnf corretamente protegido.
4.4.10. Usando Conexes Seguras
4.4.10.1. Conceitos Basicos
A partir da verso 4.0.0, o MySQL tem suporte a conexes cri[ptografadas com SSL. Para entender
como o MySQL usa SSL, necessrio explicar alguns conceits bsicos de SSL e X509. A pessoal
que j esto familiarizada com eles podem saltar esta parte.
Por padro o MySQL no usa conexes criptografadas entre o cliente e o servidor. Isto significa que
qualquer um pode observar todo o trfico e ver os dados enviados e recebidos. Podiase at mesmo
alterar os dados enquanto eles estavam em transito entre o cliente e o servidor. Algumas vezes voc
precisao mover informaes sobre redes pblicas de um modo seguro; em tais casos, usar uma cone-
xo sem criptografia inaceitvel.
SSL um protocolo que utiliza diferentes algortimos de criptografia para assegurar que os dados
recebidos por uma rede pblica so confiveis. Ele tem um mecanismo para detectar qualquer alte-
rao, perda ou reenvio de dados. SSL tambm incorpora algoritmos para reconhecer e fornecer
identidades de verificao usando o padro X509.
Criptografia o modo de tornar qualquer tipo de dado ilegvel. De fato, as prticas de hoje precisam
de muitos elementos de segurana adicionais para algoritmos de criptografia. Eles devem resistir a
muitos tipos de atques conhecidos como apenas alterando a ordem da mensagem criptografada ou
emviando o dado duas vezes.
X509 um padro que torna possvel identificar algum na Internet. Ele mais comumente usado
em aplicaes e-commerce. Em termos bsicos, deve haver algumas empresas (chamadas
``Autoridades de Certificao'') que atribuem certificados eletrnicos para qualquer um que precise
deles. Os certificados se baseiam em algortmos de criptografia assimtricos que possuem duas cha-
Administrao do Bancos de Dados MySQL
245
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 cha-
ves pblicas do proprietrio. Qualquer dados criptografado com esta chave pblica pode ser descrip-
tografada 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 fa-
a um trabalho adicional e a criptografia de dados uma operao intensiva da CPU que exige tem-
po e pode atrasar o MySQL nas tarefas principais. Por padro o MySQL ajustado para ser o mais
rpido possvel.
Se voc precisa de mais informaes sobre SSL, X509 ou criptografia, voc deve usar se mecanis-
mo 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 OpenSSL. Testamos o MySQL com OpenSSL 0.9.6.
http://www.openssl.org/.
2. Configure o MySQL com --with-vio --with-openssl.
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 tabe-
las 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. Voc pode verificar se um servidor mysqld em execuo suporta OpenSSL examinando se
SHOW VARIABLES LIKE 'have_openssl' retorna YES.
4.4.10.3. Configurando Certificados SSL para o MySQL
Aqui est um exemplo para configurar certificados SSL para o MySQL:
DIR=`pwd`/openssl
PRIV=$DIR/private
mkdir $DIR $PRIV $DIR/newcerts
cp /usr/share/ssl/openssl.cnf $DIR
replace ./demoCA $DIR -- $DIR/openssl.cnf
# Crie os aarquivos necessrio: $database, $serial e o diretrio
$new_certs_dir (opcional)
touch $DIR/index.txt
echo "01" > $DIR/serial
#
# Gerao do Certificate Authority(CA)
#
openssl req -new -x509 -keyout $PRIV/cakey.pem -out $DIR/cacert.pem \
-config $DIR/openssl.cnf
# Sada exemplo:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ................++++++
# .........++++++
# writing new private key to '/home/monty/openssl/private/cakey.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be incorporated
# into your certificate request.
# What you are about to enter is what is called a Distinguished Name or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
Administrao do Bancos de Dados MySQL
246
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL admin
# Email Address []:
#
# Create server request and key
#
openssl req -new -keyout $DIR/server-key.pem -out \
$DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf
# Sada exemplo:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ..++++++
# ..........++++++
# writing new private key to '/home/monty/openssl/server-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be incorporated
# into your certificate request.
# What you are about to enter is what is called a Distinguished Name or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL server
# Email Address []:
#
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:
#
# Remove the passphrase from the key (optional)
#
openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem
#
# Assina o certificado do servidor
#
openssl ca -policy policy_anything -out $DIR/server-cert.pem \
-config $DIR/openssl.cnf -infiles $DIR/server-req.pem
# Sada exemplo:
# Using configuration from /home/monty/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName :PRINTABLE:'FI'
# organizationName :PRINTABLE:'MySQL AB'
# commonName :PRINTABLE:'MySQL admin'
# Certificate is to be certified until Sep 13 14:22:46 2003 GMT (365 days)
# Sign the certificate? [y/n]:y
#
#
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated
#
# Create client request and key
Administrao do Bancos de Dados MySQL
247
#
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 " " '
Administrao do Bancos de Dados MySQL
248
' > $DIR/my.cnf
#
# To test MySQL
mysqld --defaults-file=$DIR/my.cnf &
mysql --defaults-file=$DIR/my.cnf
Voc tambm pode testar sua configurao modificando o arquivo my.cnf acima para fazer refe-
rncia aos certificados de demonstrao no diretrio mysql-dist-fonte/SSL.
4.4.10.4. Opes SSL do GRANT
O MySQL pode verificar atributos do certificado X509 em adio ao esquema normal de usurio/se-
nha. Todas as opes comuns ainda so exigidas (usurio, senha, mscara do endereo IP, noome ta-
bela/banco de dados).
Existem diferentes possibilidades para limitarmos as conexes:
Sem nenhuma opo SSL ou X509, todos os tipos de conexes criptografadas/ descriptografadas
so permitidas se o usurio e senha so vlidos.
A opo REQUIRE SSL limita o servidor para permitir apenas conexes criptografadas SSL.
Note que esta opo pode ser omitida se no houver nenhum registro ACL que permita conexes
no SSL.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY 'goodsecret' REQUIRE SSL;
REQUIRE X509 significa que o cliente deve ter um certificado vlido mas no nos procupa-
mos 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 de-
ve apresentar um certificado X509 vlido emitido pelo CA 'emissor'. Usar o certificado
X509 sempre implica em criptografia, assim a opo SSL desnecessria.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE ISSUER 'C=FI, ST=Some-State, L=Helsinki,
'> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com';
REQUIRE SUBJECT 'assunto' exige que o cliente tenha um certificado X509 com o as-
sunto 'assunto'. Se o cliente apresenta um certificado que valido mas tem um 'assun-
to' diferente, a conexo disabilitada.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE SUBJECT 'C=EE, ST=Some-State, L=Tallinn,
'> O=MySQL demo client certificate,
'> CN=Tonu Samuel/Email=tonu@mysql.com';
REQUIRE CIPHER 'mtodo' necessrio para assegurar que uma criptografia forte ser
usada. O SSL pode ser fraco se algoritmos antigos com chaves de criptografias curtas so usa-
dos. Usando esta opo, podemos pedir por algum mtodo de criptografia exato para permitir a
conexo.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
Administrao do Bancos de Dados MySQL
249
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
As opes SUBJECT, ISSUER e CIPHER podem ser combinadas na clusula REQUIRE desta
forma:
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE SUBJECT 'C=EE, ST=Some-State, L=Tallinn,
'> O=MySQL demo client certificate,
'> CN=Tonu Samuel/Email=tonu@mysql.com'
-> AND ISSUER 'C=FI, ST=Some-State, L=Helsinki,
'> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com'
-> AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
A partir do MySQL 4.0 a palavra chave AND opcional entre opes REQUIRE.
A ordem das opes no importa, mas nenhuma opo pode ser especificada duas vezes.
4.4.10.5. Opes SSL de Linha de Comando
A seguinte tabela lista opes que so usadas para especificar o uso de SSL, arquivos de certificado
e arquivos de chaves. Estas opes esto disponveis a partir do MySQL 4.0. Elas podem ser dadas
na linha de comando ou no arquivo de opo.
--ssl
Para o servidor, especifica que o servidor permite conexes SSL. Para um programa cliente, per-
mite 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 servi-
dor 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 especifican-
do 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 for-
mato que o comando openssl ciphers.
Example: --ssl-cipher=ALL:-AES:-EXP
Administrao do Bancos de Dados MySQL
250
--ssl-key=file_name
O nome do arquivo de chave SSL a ser usado para estabelecer uma conexo segura.
4.5. Preveno de Disastres e Recuperao
4.5.1. Backups dos Bancos de Dados
Como as tabelas do MySQL so armazenadas como arquivos, mais fcil realizar um backup. Para
obter um backup consistente, faa um LOCK TABLES nas tabelas relevantes seguido por FLUSH
TABLES para as tabelas. See Seco 6.7.5, Sintaxe LOCK TABLES e UNLOCK TABLES. See
Seco 4.6.4, Sintaxe de FLUSH. Voc s precisa de um bloqueio de leitura; isto possibilita outras
threads a continuarem a pesquisar nas tabelas enquanto voc copia os arquivos no diretrio do banco
de dados. O FLUSH TABLE necessrio para garantir que todas as pginas ativas de ndices sero
escritas em disco antes de iniciar o backup.
A partir das verses 3.23.56 e 4.0.12 BACKUP TABLE no permitir que voc sobrescreva arquivos
exixtentes j que isso colocaria em risco a segurana.
Se voc desejar realizar um backup ao nvel da linguagem SQL de um tabela, voc pode utilizar
SELECT INTO OUTFILE ou BACKUP TABLE. See Seco 6.4.1, Sintaxe SELECT .See Sec-
o 4.5.2, Sintaxe de BACKUP TABLE.
Outra maneira de efetuar um backup de um banco de dados utilizar o programa mysqldump ou o
script mysqlhotcopy. See Seco 4.9.7, mysqldump, Descarregando a Estrutura de Tabe-
las e Dados. See Seco 4.9.8, mysqlhotcopy, Copiando Bancos de Dados e Tabelas do
MySQL.
1. Fazer um backup completo do seu banco de dados:
shell> mysqldump --tab=/path/to/some/dir --opt db_name
ou
shell> mysqlhotcopy db_name /path/to/some/dir
Voc tambm pode simplesmente copiar os arquivos das tabelas (*.frm, *.MYD) e os arqui-
vos *.MYI) quando o servidor no estiver atualizando nada. O script mysqlhotcopy utiliza
este mtodo. (Mas nopte que estes mtodos no funcionaro se seu banco de dados contm ta-
belas InnoDB. InnoDB no armazena o contedo das tabelas em diretrios de banco de da-
dos, e o mysqlhotcopy funciona apenas para tabelas MyISAM e ISAM.)
2.
Interrompa o mysqld caso ele esteja em execuo, depois inicie-o com a opo -
-log-bin[=nome_arquivo]. See Seco 4.10.4, O Log Binrio. Os arquivos de log bi-
nrio 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 tmp-
dirse 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 fa-
lhar, tente o seguinte procedimento: (Isto s ir funcionar se voc iniciou o MySQL com -
Administrao do Bancos de Dados MySQL
251
-log-update, veja Seco 4.10.4, O Log Binrio,):
1. Restaure o backup original feito com o mysqldump ou backup binrio.
2. Execute o seguinte comando para re-executar as atualizaes armazenadas no log binrio:
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
Em seu caso voc pode querer re-executar apenas alguns log binrios, a partir de certas posis
(normalmente voc quer re-executar todos os log binrios a partir da data de restaurao do
backup, co exceo de algumas consultas erradas). Veja Seco 4.9.5, mysqlbinlog, Exe-
cutando as Consultas a Partir de um Log Binrio fpara mais informaes sobre o utilitrio
mysqlbinlog e como us-lo.
Se voc estiver utilizando o log atualizado, voc pode executar o contedo do log de atualiza-
o desta forma:
shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
O comando ls usado para obter todos os arquivos de log na ordem correta.
Voc pode tambm fazer backups seletivos com SELECT * INTO OUTFILE 'no-
me_arquivo' FROM nome_tabela e restaurar com LOAD DATA INFILE 'no-
me_arquivo' REPLACE.... Para evitar registros duplicados, voc precisar de um chave
PRIMARY KEY ou uma UNIQUE na tabela. A palavra chave REPLACE substitui os antigos regis-
tros com os novos quando um novo registro duplica um antigo registro em uma chave de valores
nicos.
Se voc tiver problemas de performance realizando backups no seu sistema, voc pode resolver isto
configurando uma replicao e fazendo os backups na mquina slave no lugar da master. See Sec-
o 4.11.1, Introduo.
Se voc estiver utilizando um sistema de arquivos Veritas, voc pode fazer:
1. Executar em um cliente (perl ?) FLUSH TABLES WITH READ LOCK
2. Bifurcar uma shell ou executar em outro cliente mount vfxs snapshot.
3. Executar no primeiro cliente UNLOCK TABLES
4. Copiar arquivos do snapshot
5. Desmontar snapshot
4.5.2. Sintaxe de BACKUP TABLE
BACKUP TABLE nome_tabela[,nome_tabela...] TO '/caminho/para/diretrio/backup'
Faz uma cpia de todos os arquivos de tabela para o diretrio de backup que o mnimo necessrio
para restaur-lo. Atualmente s funciona para tabelas MyISAM. Para tabela MyISAM, copia os ar-
quivos .frm (definies) e .MYD (dados). O arquivo de ndice pode ser reconstrudo a partir destes
dois.
Antes de utilizar este comando, por favor veja See Seco 4.5.1, Backups dos Bancos de Dados.
Durante o backup, o bloqueio de leitura (read lock) ser usado para cada tabela, uma de cada vez,
medida que o backup realizado. Se voc deseja fazer backup de diversas tabelas como um
snapshot, voc deve primeiro usar LOCK TABLES obtendo um bloqueio de leitura para cada tabela
Administrao do Bancos de Dados MySQL
252
no grupo.
O comando retorna uma tabela com as seguintes colunas:
Coluna Valor
Table Nome da Tabela
Op Sempre backup
Msg_type Um dos seguintes: status, error, info ou warning.
Msg_text A mensagem
Note que o comando BACKUP TABLE est disponvel somente no MySQL verso 3.23.25 e poste-
rior.
4.5.3. Sintaxe de RESTORE TABLE
RESTORE TABLE nome_tabela[,nome_tabela...] FROM '/caminho/para/diretrio/backup'
Restaura a tabela ou tabelas utilizando o backup feito com BACKUP TABLE. Tabelas existentes no
sero reescritas - se voc tentar restaurar sobre uma tabela existente, obter um erro. A restaurao
demora mais tempo do que o backup pois necessrio reconstruir o ndice. Quanto mais chaves ti-
ver, mais demorado ser. Como no comando BACKUP TABLE, atualmente s funciona com tabelas
MyISAM.
O comando retorna uma tabela com as seguintes colunas:
Coluna Valor
Table Nome da Tabela
Op Sempre restore
Msg_type Um dos seguintes: status, error, info ou warning
Msg_text A mensagem
4.5.4. Sintaxe de CHECK TABLE
CHECK TABLE nome_tabela[,nome_tabela...] [opo [opo...]]
opo = QUICK | FAST | MEDIUM | EXTENDED | CHANGED
CHECK TABLE funciona somente em tabelas MyISAM. Em tabelas MyISAM a mesma coisa que
executar myisamchk --medium-check nome_tabela na tabela.
Se voc no especificar nenhuma opo, MEDIUM usado.
Verifica se existem erros na(s) tabela(s). Para as tabelas MyISAM as estatsticas das chaves so atua-
lizadas. O comando retorna uma tabela com as seguintes colunas:
Coluna Valor
Table Nome da Tabela.
Op Sempre check
Msg_type Um dos seguintes: status, error, info, or warning
Msg_text A mensagem
Note que a instruo pode produzir vrias linhas de informaes para cada tabela conferida. A lti-
ma linha ir ser do tipo Msg_type status e normalmente deve estar OK. Se voc no obteve OK
Administrao do Bancos de Dados MySQL
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 No busca os registros verificando ligaes incorretas.
FAST S confere tabelas que no foram fechadas corretamente.
CHANGED S verifica as tabelas que foram alteradas desde a ltima conferncia ou que no fo-
ram 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 as-
segura 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 r-
pida 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 mar-
cada 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 TA-
BLE 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 mai-
oria 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 utiliza-
da 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 conti-
nuar obtendo erros de uma tabela quando o MySQL tenta atualizar um registro ou encontrar um re-
gistro pela chave (isto seria muito difcil ocorrer caso uma conferncia normal tenha executado com
sucesso!).
Alguns problemas relatados por CHECK TABLE, no podem ser corrigidas automaticamente:
Found row where the auto_increment column has the value 0.
Isto significa que voc possui um registro na tabela onde o campo ndice que utiliza o recurso
Administrao do Bancos de Dados MySQL
254
auto_increment contem o valor 0. ( possvel criar um registro onde a coluna de auto in-
cremento 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 al-
gum outro valor diferente de 0.
4.5.5. Sintaxe do REPAIR TABLE
REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name[,tbl_name...] [QUICK] [EXTENDED] [USE_FRM]
REPAIR TABLE funciona somente em tabelas MyISAM e a mesma coisa que executar myi-
samchk -r nome_tabela na tabela.
Normalmente voc nunca deve executar este comando, mas se um disastre ocorrer voc vai precisar
recuperar seus dados de uma tabela MyISAM utilizando REPAIR TABLE. Se as suas tabelas esti-
verem muito corrompidas, voc deve encontrar a razo, para eleiminar a necessidade de se usar RE-
PAIR TABLE! See Seco A.4.1, O Que Fazer Se o MySQL Continua Falhando. See Sec-
o 7.1.3, Problemas com Tabelas MyISAM.
REPAIR TABLE repara uma tabela possivelmente corrompida. O comando retorna uma tabela com
as seguintes colunas:
Coluna Valor
Table Nome da Tabela
Op Sempre repair
Msg_type Um dos seguintes: status, error, info ou warning
Msg_text A mensagem
Note que a instruo pode produzir vrias linhas de informaes para cada tabela recuperada. A ulti-
ma linha ser de Msg_type status e normalmente deve exibir OK. Se o retorno no for OK, vo-
c pode tentar reparar a tabela com myisamchk -o, j que REPAIR TABLE ainda no imple-
menta 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 vo-
c tiver grandes chaves do tipo char() que compactam muito bem.
No MySQL 4.0.2, existe um modo USE_FRM para REPAIR. Use-o se o arquivo .MYI estiver fal-
tando ou o seu cabealho estiver corrompido. Neste modo o MySQL recriar a tabela, usando a in-
formao 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 informa-
o 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.
Administrao do Bancos de Dados MySQL
255
4.5.6. Utilizando myisamchk para Manuteno de Ta-
belas e Recuperao em Caso de Falhas
A partir do MySQL verso 3.23.13 voc pode mandar verificar as tabelas MyISAM com o comando
CHECK TABLE. See Seco 4.5.4, Sintaxe de CHECK TABLE. Pode-se reparar tabelas com o
comando REPAIR TABLE. See Seco 4.5.5, Sintaxe do REPAIR TABLE.
Para verificar/reparar tabelas MyISAM (.MYI e .MYD) voc deve utilizar o utilitrio myisamchk.
Para consistir/reparar tabelas ISAM (.ISM e .ISD) voc deve usar o utilitrio isamchk. See Ca-
ptulo 7, Tipos de Tabela do MySQL.
No texto a seguir iremos comentar sobre o myisamchk, mas tudo tambm se aplica ao antigo
isamchk.
Voc pode utilizar o utilitrio myisamchk para obter informaes sobre suas tabelas de bancos de
dados, verfic-las, repar-las ou otimiz-las. As seguintes sees descrevem como executar myi-
samchk (incluindo uma descrio de suas opes), como montar um calendrio de manuteno, e
como utilizar o myisamchk para executar suas vrias funes.
Voc pode, na maioria dos casos, utilizar o comando OPTIMIZE TABLES para otimizar e reparar
tabelas, mas no to rpido e confivel (no caso real de erros fatais) como o mysisamchk. Por
outro lado, OPTIMIZE TABLE mais fcil de usar e voc no tem que se preocupar com a recarre-
ga das tabelas. See Seco 4.6.1, Sintaxe de OPTIMIZE TABLE.
Embora os reparos realizados pelo myisamchk sejam bastante seguros, porm sempre uma boa
idia fazer um backup dos dados ANTES de realizar um reparo (ou qualquer coisa que far grandes
alteraes em alguma tabela)
4.5.6.1. Sintaxe do myisamchk
myisamchk chamado desta forma:
shell> myisamchk [opes] nome_tabela
As opes especificam o que voc deseja que o myisamchk faa. Elas so descritas abaixo.
(Voc tambm pode obter a lista das opes com myisamchk --help.) Sem opes, o myi-
samchk simplesmente checa sua tabela. Para obter maiores informaes ou dizer ao myisamchk
para tomar aes corretivas, especifique as opes descritas abaixo e nas sees seguintes.
nome_tabela o nome da tabela do banco de dados que voc deseja verificar/reparar. Se voc
executar o myisamchk em algum lugar diferente do diretrio do banco de dados, voc deve espe-
cificar o caminho para o arquivo, porque myisamchk no faz idia de onde seu banco de dados se
encontra. Na verdade, myisamchk no se importa se os arquivos esto localizados em um diretrio
de banco de dado; voc pode copiar os arquivos que correspondem a uma tabela de banco de dados
em outra localizao e realizar neste outro lugar as operaes corretivas.
Voc pode nomear vrias tabelas na linha de comando do myisamchk se voc desejar. Voc tam-
bm pode especificar um nome como um arquivo de ndice (com o sufixo .MYI), que lhe permite
especificar todas tabelas em um diretrio utilizando o padro *.MYI. Por exemplo, se voc est em
um diretrio de banco de dados, voc pode checar todas as tabelas no diretrio desta forma:
shell> myisamchk *.MYI
Se voc no estiver no diretrio do banco de dados, voc pode verificar todas as tabelas existentes
especificando o caminho para o diretrio:
shell> myisamchk /caminho/para/banco_de_dados/*.MYI
Voc pode verificar todas as tabelas em todos os bancos de dados especificando um meta caracter
com o caminho para o diretrio de banco de dados do MySQL:
Administrao do Bancos de Dados MySQL
256
shell> myisamchk /caminho/para/diretrio_dados/*/*.MYI
A maneira recomendada para conferir todas as tabelas rapidamente :
myisamchk --silent --fast /caminho/para/diretrio_dados/*/*.MYI
isamchk --silent /caminho/para/diretrio_dados/*/*.ISM
Se voc quiser conferir todas as tabelas e reparar todas que estiverem corrompidas, pode utilizar li-
nha a seguir:
myisamchk --silent --force --fast --update-state -O key_buffer=64M \
-O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M \
/caminho/para/diretrio_dados/*/*.MYI
isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M /caminho/para/diretrio_dados/*/*.ISM
A linha acima assume que voc tem mais de 64 MB de memria livre.
Perceba que se voc obter um erro do tipo:
myisamchk: warning: 1 clients is using or hasn't closed the table properly
Isto significa que voc est tentando verificar uma tabela que est sendo atualizada por outro progra-
ma (como o servidor mysqld) que ainda no fechou o arquivo ou que finalizou sem fechar o arqui-
vo corretamente.
Se o mysqld est em execuo, voc deve forar o sincronimo e fechamento de todas tabelas com
FLUSH TABLES e assegurar que ningum mais esteja utilizando as tabelas quando for executar o
myisamchk. No MySQL verso 3.23 a forma mais simples de evitar este problema utilizar
CHECK TABLE no lugar de myisamchk para verificar as tabelas.
4.5.6.2. Opes Gerais do myisamchk
myisamchk suporta as seguintes opes.
-# ou --debug=debug_options
Sada do log de depurao. A string debug_options geralmente
'd:t:o,nomearquivo'.
-? 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
Administrao do Bancos de Dados MySQL
257
decode_bits 9
sort_buffer_size utilizado quando as chaves so reparadas pela ordenao das chaves,
que o caso normal quando voc utiliza --recover.
key_buffer_size utilizando quando voc estiver conferindo a tabela com -
-extended-check ou quando as chaves so reparadas inserindo-as registro a registro na ta-
bela (como com inserts normais). O reparo atravs de buffer de chaves (key buffer) utilizado
nos seguintes casos:
Se voc utilizar --safe-recover.
Se os arquivos temporrios necessrios para ordenar as chaves forem maior que o dobro do
tamanho de quando se criasse o arquivo de chaves diretamente. Isto o caso quando se tem
chaves CHAR, VARCHAR ou TEXT tao grandes quanto necessrio pela ordenao para arma-
zenar todas as chaves durante o processo. Se voc tiver muito espao temporrio e puder for-
ar 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.
4.5.6.3. Opes de Verificao do myisamchk
-c ou --check
Confere por erros na tabela. Esta a operao padro se voc no estiver utilizando opes que a
anulam.
-e ou --extend-check
Verifica a tabela de forma completa (que bastante lento se voc tiver vrios ndices). Esta op-
o 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 tabe-
Administrao do Bancos de Dados MySQL
258
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, entre-
tando, 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 uti-
lizado para obter o benefcio integral da opo --check-only-changed, mas voc no de-
ve utilizar esta opo se o servidor mysqld esta usando a tabela e o mysqld esta sendo execu-
tado com --skip-external-locking.
-T ou --read-only
No marca as tabelas como verificadas. Isto til se voc utiliza o myisamchk para verificar
uma tabela que esteja em uso por alguma outra aplicao que no utiliza bloqueios (como no
mysqld --skip-external-locking).
4.5.6.4. Opes de Reparos do myisamchk
As seguintes opes so usadas se voc iniciar o myisamchk com -r ou -o:
-B or --backup
Faz um backup dos arquivos .MYD como filename-time.BAK
--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
Administrao do Bancos de Dados MySQL
259
Sobrescreve antigos arquivos temporrios (nome_tabela,TMD) em vez de abortar.
-k # ou --keys-used=#
Se voc estiver utilizando ISAM, diz ao manipulador de tabelas do ISAM para atualizar somente
os primeiros # ndices. Se voc estiver utilizando MyISAM, informa quais chaves usar, onde ca-
da bit seleciona uma chave (a primeira chave possui o bit 0). Isto pode ser utilizado para inser-
es 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 sim-
blico 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 extrema-
mente indesejvel com tabelas ISAM/MyISAM). Se voc deseja recuperar uma tabela, esta pri-
meira opo a ser tentada. Somente se o myisamchk relatar que a tabela no pode ser recupera-
da 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 ta-
manho 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 recupe-
rao tambm utiliza muito menos espao em disco que -r. Normalmente sempre se deve ten-
tar, 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 tempo-
rrios 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 confi-
gurado 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.
Administrao do Bancos de Dados MySQL
260
-u ou --unpack
Descompacta arquivo empacotado com o myisampack.
4.5.6.5. Outras Opes do myisamchk
Outras aes que o myisamchk pode fazer, alem de reparar e verificar tabelas:
-a or --analyze
Analiza a distribuio das chaves. Isto aumenta o desempenho de join habilitando o otimizador
de joins para melhor escolher em qual ordem ele deve unir as tabelas e quais chaves ele deve
usar: myisamchk --describe --verbose table_name' ou usar SHOW KEYS no
MySQL.
-d or --description
Exibe alguma informao sobre tabela.
-A or --set-auto-increment[=value]
Fora que AUTO_INCREMENT com um valor maior ou igual a este. Se nenhum valor dado,
ento define o prximo valor AUTO_INCREMENT com o maior valor usado para a chave auto-
matica + 1.
-S or --sort-index
Ordene o bloco da rvore ndice do mais alto para o mais baixo. Isto otimizar as buscas e torna-
r 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 lo-
calizados e pode aumentar a velocidade das operaes SELECT e ORDER BY neste ndice.
(Pode ser bem lento na primeira ordenao!) Para encontrar um nmero de ndices da tabela, use
SHOW INDEX, que exibe os ndices de um tabela na mesma ordem que o myisamchk os v.
ndices so nmeros que se iniciam com 1.
4.5.6.6. Uso de Memria do myisamchk
Alocao de memria importante quando voc executa o myisamchk. myisamchk no utiliza
mais memria do que voc especifica com a opo -O. Se voc ir utilizar o myisamchk em gran-
des arquivos, voc deve decidir primeiro quanta memria deseja usar. O valor padro utilizar so-
mente 3MB para correes. Utilizando valores maiores, o myisamchk pode operar mais rapida-
mente. Por exemplo, se voc tiver mais que 32M de memria RAM, voc pode utilizar opes tais
como esta (em adio s vrias outras que podem ser especificadas):
shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...
Utilizando -O sort=16M provavelmente suficiente para a maioria dos casos.
Certiffique-se que o myisamchk utiliza arquivos temporrios em TMPDIR. Se TMPDIR aponta pa-
ra um sistema de arquivos em memria, voc pode facilmente obter erros de memria. Se isto acon-
tecer, configure TMPDIR para apontar para algum diretrio com mais espao e reinicie o myi-
samchk.
Quando reparando, o myisamchk tambm precisar de bastante espao em disco:
Administrao do Bancos de Dados MySQL
261
Dobra-se o tamanho do arquivo de registros (o original e uma cpia). Este espao no necess-
rio 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 origi-
nal!
Espao para o novo arquivo de ndice que substitui o antigo. O arquivo de ndices antigo trun-
cando no incio, portanto, normalmente este espao ignorado. Este espao necessrio no mes-
mo disco que o arquivo de ndice original!
Quando utilizando --recover ou --sort-recover (mas no quando usando -
-safe-recover, ser necessrio espao para um buffer de ordenao de: (maior_chave
+ tamanho_do_ponteiro_de_registro)*nmero_de_registros * 2. Voc
pode conferir o tamanho das chaves e o tamanho_do_ponteiro_de_registro com myisamchk -
dv tabela. Este espao alocado no disco temporrio (especificado por TMPDIR ou -
-tmpdir=#).
Se voc tiver um problema com espao em disco durante o reparo, pode-se tentar usar -
-safe-recover em vez de --recover.
4.5.6.7. Uso do myisamchk para Recuperao em Caso de Falhas
Se voc executa o mysqld com a opo --skip-external-locking (que o padro em al-
guns sistemas, como o Linux), voc no pode utilizar com segurana o myisamchk para conferir
uma tabela se o mysqld estiver utilizando a mesma tabela. Se voc pode ter certeza que ningum
est acessando as tabelas atravs do mysqld enquanto voc executa o myisamchk, voc s tem
que executar o mysqladmin flush-tables antes de iniciar a verificao das tabelas. Se voc
no tem certeza, ento voc deve desligar o mysqld enquanto verifica as tabelas. Se voc executa o
myisamchk enquanto o mysqld estiver atualizando as tabelas, voc pode obter um altera que a
tabela est corrompida mesmo se no estiver.
Se voc no estiver utilizando --skip-external-locking, pode usar o myisamchk para
conferir as tabelas a qualquer hora. Enquanto voc faz isto, todos os clientes que tentarem atualizar a
tabela iro esperar at que o myisamchk esteja pronto, antes de continuar.
Se voc utilizar o myisamchk para reparar ou otimizar tabelas, voc DEVE sempre assegurar que
o servidor mysqld no esteja utilizando a tabela (Isto tambm aplica se voc utiliza -
-skip-external-locking). Se voc no desligar o mysql, voc deve, pelo menos, fazer um
mysqladmin flush-tables antes de executar o myisamchk. Suas tabelas podem estar cor-
rompidos se o servidor e o myisamchk acessarem a tabela simultaneamente.
Este captulo descreve como checar e lidar com dados corrompidos nos bancos de dados MySQL.
Se suas tabelas corromperem com frequncia deve ser encontrada a razo para isto! See Sec-
o A.4.1, O Que Fazer Se o MySQL Continua Falhando.
A seo de tabelas MyISAM contm motivos do porque uma tabela pode estar corrompida. See Sec-
o 7.1.3, Problemas com Tabelas MyISAM.
Quando se realizar recuperao devido a falhas, importante entender que cada tabela no-
me_tabela em um banco de dados corresponde a tres arquivos no diretrio do banco de dados:
Arquivo Propsito
nome_tabela.frm Arquivo com definies da tabela (form)
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
Administrao do Bancos de Dados MySQL
262
estgio de reparos removendo o antigo arquivo .MYD e renomeando o novo arquivo com nome ori-
ginal. 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 ar-
quivo de dados. Isto seguro, pois o myisamchk detecta automaticamente se o arquivo .MYD est
corrompido e aborda o reparo neste caso. Voc pode tambm fornecer duas opes --quick para
o myisamchk. Neste caso, o myisamchk no aborta em alguns erros (como chaves duplicadas)
mas tenta resolv-los modificando o arquivo .MYD. Normalmente o uso de duas opes --quick
til somente se voc tiver muito pouco espao em disco para realizer um reparo normal. Neste caso
voc deve pelo menos fazer um backup antes de executar o myisamchk.
4.5.6.8. Como Verificar Erros em Tabelas
Para conferir uma tabela MyISAM, utilize os seguintes comandos:
myisamchk nome_tabela
Encontra 99.99% de todos os erros. O que ele no pode encontrar corrompimento que envolva
SOMENTE o arquivo de dados (que no comum). Se voc desejar conferir uma tabela, voc
deve executar normalmente o myisamchk sem opes ou com as opes -s ou --silent.
myisamchk -m nome_tabela
Encontra 99.999% de todos os erros. Ele verifica primeiramente erros em todas as entradas do
ndice e ento le todos os registros. Ele calcula um checksum para todas as chaves nos registros
e verifica se o checksum o mesmo que o checksum das chaves na rvore de ndices.
myisamchk -e nome_tabela
Realiza a verificao completa de todos os dados (-e significa ``conferncia extendida''). Ele faz
uma conferncia lendo todas as chaves de cada registro para verificar se eles realmente apontam
para o registro correto. Isto pode demorar MUITO tempo em uma tabela grande com vrias cha-
ves. 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 con-
tinuar a percorrer a tabela at um mximo de 20 erros. Em utilizao normal, um simples myi-
samchk (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 informa-
es estatsticas tambm.
4.5.6.9. Como Reparar Tabelas
Na seo seguinte ns s falaremos do uso do myiasmchk em tabelas MyISAM (extenses .MYI e
.MYD). Se voc estiver usando tabelas ISAM (extenses .ISM e .ISD), voc deve usar a ferramen-
ta isamchk.
A partir do MySQL verso 3.23.14, voc pode reparar tabelas MyISAM com o comando REPAIR
TABLE. See Seco 4.5.5, Sintaxe do REPAIR TABLE.
Os sintomas de uma tabela corrompida incluem pesquisas que abortam inesperadamente e erros co-
mo estes:
nome_tabela.frm is locked against change
Can't find file nome_tabela.MYI (Errcode: ###)
Unexpected end of file
Record file is crashed
Administrao do Bancos de Dados MySQL
263
Got error ### from table handler
Para obter mais informaes sobre o erro voc pode executar perror ###. Aqui esto os er-
ros mais comuns que indicam um problema com a tabela:
shell> perror 126 127 132 134 135 136 141 144 145
126 = Index file is crashed / Wrong file format
127 = Record-file is crashed
132 = Old database file
134 = Record was already deleted (or record file crashed)
135 = No more room in record file
136 = No more room in index file
141 = Duplicate unique key or constraint on write or update
144 = Table is crashed and last repair failed
145 = Table was marked as crashed and should be repaired
Note que o erro 135 (no mais no arquivo de registro), no um erro que pode ser corrigido por
um simples reparo. Neste caso voc deve fazer:
ALTER TABLE tabela MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;
Voc tambm pode usar esta tcnica para o erro 136 (no mais no arquivo de ndice).
Em outros casos, voc deve reparar suas tabelas. myisamchk pode normalmente detectar a maioria
dos problemas que ocorrem.
O processo de reparo involve at quatro estgios, descritos abaixo. Antes de comear, voc deve
mudar para o diretrio do banco de dados e conferir as permisses dos arquivos de tabelas. Tenha
certeza que eles possam ser lidos pelo usurio do Unix com o qual mysqld executado (e para vo-
c, porque voc precisa acessar os arquivos que est conferindo). Se no estiverem, voc precisa al-
terar 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 coman-
dos 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 Fa-
lhas.
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. Utili-
ze 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 myi-
samchk quebrar, v para o estgio 3.
Administrao do Bancos de Dados MySQL
264
Estgio 2: Reparo simples e seguro
NOTA: Se voc deseja que os reparos sejam mais rpidos, devem ser usadas as opes: -O
sorf_buffer=# -O key_buffer=# (onde # seria 1/4 da memria disponvel) para todos co-
mandos isamchk/myisamchk.
Primeiro, tente usar myisamchk -r -q nome_tabela (-r -q significa ``modo de recupera-
o rpida''). Ele tentar reparar o arquivo de ndice sem mexer no arquivo de dados. Se o arquivo
de dados estiver normal e os links apagados apontam nas localizaes corretas dentro do arquivo de
dados, isto deve funcionar e a tabela ser corrigida. Inicie o reparo da prxima tabela. Outra maneira
seria utilizar os seguintes procedimentos:
1. Faa um backup do arquivo de dados antes de continuar.
2. Utilize myisamchk -r nome_tabela (-r significa modo de ``recuperao''). Isto remo-
ver 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 mo-
do 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 cri-
ar um novo arquivo de ndice. Faa como a seguir:
1. Mova o arquivo de dados para algum lugar seguro.
2. Use o arquivo de descrio de tabelas para criar novos arquivos (vazios) de dados e ndices:
shell> mysql nome_bd
mysql> SET AUTOCOMMIT=1;
mysql> TRUNCATE TABLE nome_tabela;
mysql> quit
Se sua verso do MySQL no possuir TRUNCATE TABLE, utilize DELETE FROM no-
me_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 proce-
dimento automaticamente.
Estgio 4: Reparo muito difcil
Voc deve atingir este estgio somente se o arquivo de descrio tambm falhar. Isto nunca deve
acontecer, porque o arquivo de descrio no alterado depois da tabela ser criada:
1. Restaure o arquivo de descrio de um backup e volte ao estgio 3. Voc pode tambm restau-
rar o arquivo de ndice e voltar ao estgio 2. No ltimo caso, voc deve iniciar com myi-
samchk -r.
Administrao do Bancos de Dados MySQL
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 for-
nece 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.
4.5.6.10. Otimizao de Tabelas
Para agrupar registros fragmentados e eliminar perda de espao resultante de remoes ou atualiza-
es de registros, execute myisamchk no modo de recuperao:
shell> myisamchk -r nome_tabela
Voc pode otimizar uma tabela da mesma forma utilizando a instruo SQL OPTIMIZE TABLE.
OPTIMIZE TABLE faz o reparo de tabelas, analisa chaves e tambm ordena a rvore de ndices
para fazer pesquisas por chave mais rpidas. Tambm no existem possibilidade de interao no
desejvel entre o utilitrio e o servidor, porque o servidor faz todo o trabalho quando voc utiliza
OPTIMIZE TABLE. See Seco 4.6.1, Sintaxe de OPTIMIZE TABLE.
myisamchk tambm tem um nmero de outras opo que podem ser usadas para melhorar a per-
formance de uma tabela:
-S, --sort-index
-R index_num, --sort-records=index_num
-a, --analyze
Para uma descrio completa da opo. See Seco 4.5.6.1, Sintaxe do myisamchk.
4.5.7. Configurando um Regime de Manuteno das
Tabelas
A partir do MySQL Verso 3.23.13, voc pode conferir tabelas MyISAM com o comando CHECK
TABLE. See Seco 4.5.4, Sintaxe de CHECK TABLE. Voc pode reparar tabelas com o comando
REPAIR TABLE. See Seco 4.5.5, Sintaxe do REPAIR TABLE.
uma boa idia verificar as tabelas regularmente em vez de esperar que ocorram problemas. Para
propsitos de manuteno voc pode utilizar o myisamchk -s para verificar as tabelas. A opo
-s (abreviao de --silent) faz com que o myisamchk execute em modo silencioso, exibindo
mensagens somente quando ocorrem erros.
tambm uma boa idia verificar as tabelas quando o servidor inicia. Por exemplo, sempre que a
mquina reinicia no meio de uma atualizao, voc normalmente precisar conferir todas as tabelas
que podem ter sido afetadas. (Isto uma``tabela com falhas esperadas''.) Voc pode adicionar um
teste ao mysqld_safe que executa myisamchk para conferir todas tabelas que foram modifica-
das durante as ltimas 24 horas se existir um arquivo .pid (process ID) antigo depois do ltimo re-
boot. (O arquivo .pid criado pelo mysqld quando ele inicia e removido quando ele termina nor-
malmente. A presena de um arquivo .pid durante a inicializao do sistema indica que o mysqld
terminou de forma anormal.)
Um teste ainda melhor seria verificar qualquer tabela cuja a data da ltima modificao mais re-
cente que a do arquivo .pid.
Voc tambm deve verificar suas tabelas regularmente durante a operao normal do sistema. Na
MySQL AB, ns executamos uma tarefa agendada cron para conferir todas nossas tabelas impor-
tantes uma vez por semana utilizando uma linha com esta no arquivo crontab:
Administrao do Bancos de Dados MySQL
266
35 0 * * 0 /diretrio/do/myisamchk --fast --silent /diretrio/de/dados/*/*.MYI
Isto exibe informaes sobre tabelas com falhas para que possamos examin-las e repar-las quando
necessrio.
Como ns no estamos tendo tabelas com falhas inesperadas (tabelas corrompidas por razes dife-
rentes de problemas de hardware) por vrios anos (isto realmente verdade), uma vez por semana
mais que suficiente para ns.
Ns recomendamos que para iniciar, voc execute myisamchk -s a cada noite em todas as tabe-
las que foram atualizadas durantes as ltimas 24 horas, at que voc confie no MySQL como ns
confiamos.
Normalmente voc no precisar de tanta manuteno em suas tabelas MySQL. Se voc estiver alte-
rando tabelas com registros de tamanho dinmico (tabelas com colunas VARCHAR, BLOB ou TEXT)
ou tem tabelas com vrios registros apagados voc pode desejar de tempos em tempos (uma vez ao
ms?) desfragmentar/recuperar espao das tabelas.
Voc pode fazer isto utilizando OPTIMIZE TABLE nas tabelas em questo ou se voc puder desli-
gar o servidor mysqld por um tempo faa:
isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM
myisamchk -r --silent --sort-index -O sort_buffer_size=16M */*.MYI
4.5.8. Obtendo Informaes sobre as Tabelas
Para obter uma descrio de uma tabela ou estatsticas sobre ela, utilize os comandos mostrados
abaixo, ns explicaremos algumas das informaes em mais detalhes posteriormente:
myisamchk -d nome_tabela Executa o myisamchk no ``modo descritivo'' para produzir uma
descrio de sua tabela. Se voc iniciar o servidor MySQL utilizando a opo -
-skip-locking, myisamchk pode relatar um erro para uma tabela que est sendo atualiza-
da enquanto executado. Entretanto, como o myisamchk no altera a tabela no modo de des-
crio, no existem riscos de destruio de dados.
myisamchk -d -v nome_tabela Para produzir mais informaes sobre o que myisamchk est fa-
zendo, adicione -v para solicitar a execuo em modo verbose.
myisamchk -eis nome_tabela Exibe somente as informaes mais importantes de uma tabela.
Ele lento porque necessrio ler a tabela inteira.
myisamchk -eiv nome_tabela Isto se parece com -eis, mas lhe diz o que est sendo feito.
Exemplo da sada de myisamchk -d
MyISAM file: company.MYI
Record format: Fixed length
Data records: 1403698 Deleted blocks: 0
Recordlength: 226
table description:
Key Start Len Index Type
1 2 8 unique double
2 15 10 multip. text packed stripped
3 219 8 multip. double
4 63 10 multip. text packed stripped
5 167 2 multip. unsigned short
6 177 4 multip. unsigned long
7 155 4 multip. text
8 138 4 multip. unsigned long
9 177 4 multip. unsigned long
193 1 text
Administrao do Bancos de Dados MySQL
267
Exemplo da sada de myisamchk -d -v :
MyISAM file: company
Record format: Fixed length
File-version: 1
Creation time: 1999-10-30 12:12:51
Recover time: 1999-10-31 19:13:01
Status: checked
Data records: 1403698 Deleted blocks: 0
Datafile parts: 1403698 Deleted data: 0
Datafilepointer (bytes): 3 Keyfile pointer (bytes): 3
Max datafile length: 3791650815 Max keyfile length: 4294967294
Recordlength: 226
table description:
Key Start Len Index Type Rec/key Root Blocksize
1 2 8 unique double 1 15845376 1024
2 15 10 multip. text packed stripped 2 25062400 1024
3 219 8 multip. double 73 40907776 1024
4 63 10 multip. text packed stripped 5 48097280 1024
5 167 2 multip. unsigned short 4840 55200768 1024
6 177 4 multip. unsigned long 1346 65145856 1024
7 155 4 multip. text 4995 75090944 1024
8 138 4 multip. unsigned long 87 85036032 1024
9 177 4 multip. unsigned long 178 96481280 1024
193 1 text
Exemplo da sada de myisamchk -eis:
Checking MyISAM file: company
Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4
Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4
Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4
Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3
Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4
Total: Keyblocks used: 98% Packed: 17%
Records: 1403698 M.recordlength: 226
Packed: 0%
Recordspace used: 100% Empty space: 0%
Blocks/Record: 1.00
Record blocks: 1403698 Delete blocks: 0
Recorddata: 317235748 Deleted data: 0
Lost space: 0 Linkdata: 0
User time 1626.51, System time 232.36
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 639, Involuntary context switches 28966
Exemplo da sada de myisamchk -eiv:
Checking MyISAM file: company
Data records: 1403698 Deleted blocks: 0
- check file-size
- check delete-chain
block_size 1024:
index 1:
index 2:
index 3:
index 4:
index 5:
index 6:
Administrao do Bancos de Dados MySQL
268
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: 0%
Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00
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 anteri-
ores:
-rw-rw-r-- 1 monty tcx 317235748 Jan 12 17:30 company.MYD
-rw-rw-r-- 1 davida tcx 96482304 Jan 12 18:35 company.MYM
Explicaes para os tipos de informaes que o myisamchk produz so fornecidas abaixo. O
``keyfile'' o arquivo de ndices. ``Registro'' e ``linha'' so sinnimos:
ISAM file Nome do arquivo (ndice) ISAM.
Isam-version Verso do formato ISAM. Atualmente sempre 2.
Creation time Quando o arquivo de dados foi criado.
Recover time Quando foi a ltima vez que o arquivo de ndices/dados foi reconstrudo.
Data records Quantos registros existem na tabela.
Deleted blocks Quantos blocos apagados continuam alocando espao. Voc pode otimizar sua
tabela para minimizar este espao. See Seco 4.5.6.10, Otimizao de Tabelas.
Datafile: Parts Para formato de registros dinmicos, isto indica quantos blocos de dados existem.
Para uma tabela otimizada sem registros fragmentados, isto o mesmo que Data records.
Deleted data Quantos bytes de dados deletados no recuperados existem. Voc pode otimizar
sua tabela para minimizar este espao. See Seco 4.5.6.10, Otimizao de Tabelas.
Administrao do Bancos de Dados MySQL
269
Data file pointer O tamanho do ponteiro do arquivo de dados, em bytes. Ele normalmente possui
2, 3, 4 ou 5 bytes. A maioria das tabelas trabalham com 2 bytes, mas isto ainda no pode ser
controlado pelo MySQL ainda. Para tabelas fixas, isto um endereo de registro. Para tabelas
dinmicas, isto um endereo de byte.
Keyfile pointer O tamanho de um ponteiro de arquivo de ndices, em bytes. Ele normalmente
possui 1, 2 ou 3 bytes. A maioria das tabelas trabalham com 2 bytes, mas isto calculado auto-
maticamente pelo MySQL. Ele sempre um endereo de bloco.
Max datafile length Qual tamanho o arquivo de dados (arquivos .MYD) pode atingir, em bytes.
Max keyfile length Qual tamanho o arquivo de ndices (.MYI pode atingir, em bytes.
Recordlength Quanto espao cada registro ocupa, em bytes.
Record format O formato utilizado para armazenar as linhas da tabelas. Os exemplos anteriores
abaixo utilizam Fixed length (tamanho fixo). Outros valores possveis so
Compressed(compactado) e Packed(empacotado).
table description Uma lista de todas as chaves na tabela. Para cada chave, alguma informao de
baixo nvel apresentada:
Key
O Nmero desta chave.
Start
Onde, no registro, esta parte do ndice inicia.
Len
Qual o tamanho desta parte do ndice. Para nmeros empacotados, isto deve sempre ser o ta-
manho total da coluna. Para strings, deve ser mais curto que o tamanho total da coluna inde-
xada, 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 nes-
te 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.
Administrao do Bancos de Dados MySQL
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 ca-
racteres e uma reduo de 60% no espao obtida.
Max levels Qual a profundidade da rvore-B para esta chave. Grandes tabelas com chaves lon-
gas resultam em valores altos.
Records Quantos registros existem na tabela.
M.recordlength A mdia de tamanho do registro. Para tabelas com registros de tamanho fixo, is-
to o tamanho exato do registro.
Packed O MySQL corta espaos do final de strings. O valor Packed indica o percentual de
economia alcanado fazendo isto.
Recordspace used Qual percentual do arquivo de dados usado.
Empty space Qual percetual do arquivo de dados no usado.
Blocks/Record Nmero mdio de blocos por registro (isto , de quantos links um registro frag-
mentado 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 myi-
samchk. See Seco 4.5.6.10, Otimizao de Tabelas.
Recordblocks Quantos blocos (links) so utilizados. Para formatos fixos, este o mesmo que o
nmero de registros.
Deleteblocks Quantos blocos (links) foram excludos.
Recorddata Quantos bytes no arquivo de dados so usados.
Deleted data Quantos bytes no arquivo de dados foram apagados (sem uso).
Lost space Se um registro atualizado para um tamanho menor, algum espao perdido. Isto a
soma de todas estas perdas, em bytes.
Linkdata Quando o formato de tabela dinmica utilizado, fragmentos de registros so ligados
com ponteiros (4 a 7 bytes cada). Linkdata a soma do montante de armazenamento utilizado
por todos estes ponteiros.
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 Compacta-
das de Somente Leitura do MySQL, para um exemplo desta informao e uma descrio do que ela
significa.
4.6. Adiministrao do Banco de Dados e Re-
ferncia de Linguagem
4.6.1. Sintaxe de OPTIMIZE TABLE
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name[,tbl_name]...
OPTIMIZE TABLE deve ser usado se voc apagou uma grande parte de uma tabela ou se voc fez
vrias alteraes uma tabela com registros de tamanho varivel (tabelas que tenham campos do ti-
Administrao do Bancos de Dados MySQL
271
po VARCHAR, BLOB ou TEXT). Registros apagados so mantidos em uma lista de ligaes e opera-
es 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 is-
to 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, OP-
TIMIZE TABLE atualmente mapeado para ANALIZE TABLE. See Seco 4.6.2, Sintaxe de
ANALYZE TABLE.
Voc pode ter a otimizao de tabelas trabalhando em outros tipos de tabelas iniciando o mysqld
com --skip-new ou --safe-mode, mas neste caso, OPTIMIZE TABLE mapeado apenas
para ALTER TABLE.
OPTIMIZE TABLE funciona da seguinte forma:
Se a tabela tem registros excludos ou dividos, repara a tabela.
Se as pginas de ndice no esto ordenas, ordene-as.
Se as estatsticas no esto atualizadas (e o reparo no pode ser feito ordenando o ndice), atuali-
ze-as.
Perceba que a tabela estar bloqueada durante o tempo em que OPTIMIZE TABLE estiver execu-
tando.
Antes do MySQL 4.1.1, o OPTIMIZE comnado no gravava no log binrio. Desde o MySQL 4.1.1
eles so escritos no log binrio a menos que a palavra chave opcional NO_WRITE_TO_BINLOG
(ou se alias LOCAL) seja usada.
4.6.2. Sintaxe de ANALYZE TABLE
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name[,tbl_name...]
Analisa e armazena a distribuio de chaves para a tabela. Durante a anlise a tabela bloqueada
com uma trava de leitura. Isto funciona em tabelas MyISAM e BDB.
Isto seria equivalente a executar myisamchk -a na tabela.
O MySQL utiliza a distribuio de chaves armazenadas para decidir em que ordem tabelas devem
ser unidas quando algum faz um join em alguma coisa diferente de uma constante.
O comando retorna uma tabela com as seguintes colunas:
Coluna Valor
Table Nome da Tabela
Op Sempre analyze
Msg_type Um dos seguintes: status, error, info ou warning
Msg_text A mensagem
Voc pode verificar a distribuio de chaves armazenadas com o comando SHOW INDEX. See Sec-
o 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.
Administrao do Bancos de Dados MySQL
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.
4.6.3. Sintaxe de CHECKSUM TABLE
CHECKSUM TABLE tbl_name[,tbl_name ...] [ QUICK | EXTENDED ]
Reports a table checksum. If QUICK is specified, live table checksum is reported, or NULL if the ta-
ble does not support live checksum. This is very fast. In EXTENDED mode the whole table is read
row by row and the checksum is calculated. This can be very slow for large tables. By default - with
neither QUICK nor EXTENDED - MySQL returns live checksum if the table support it and scans the
table otherwise.
Este comando est implementado no MySQL 4.1.1.
4.6.4. Sintaxe de FLUSH
FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [,flush_option] ...
Voc deve utilizar o comando FLUSH se desejar limpar algum dos caches internos que o MySQL
usa. Para executar FLUSH, voc deve ter o privilgio RELOAD.
opes podem ser qualquer uma das seguintes:
Option Description
HOSTS Esvazia as tabelas de cache de nomes de mquinas. Voc deve descarre-
gar 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 futu-
ras requisies desta mquina. A descarga na tabela de nomes de mqui-
nas 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 ar-
quivo de logs de atualizaes ou um arquivo de log binrio sem uma ex-
tenso, 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 atualiza-
es. See Seco 4.10.3, O Log de Atualizaes. Isto a mesma coisa
que enviar o sinal SIGHUP para o servidor mysqld.
PRIVILEGES Recarrega os privilgios das tabelas de permisses no banco de dados
mysql.
QUERY CACHE Defragmenta a cache de consulta par utilizar melhor a sua memria. Este
comando no remove qualquer consulta da cache, ao contrrio de RESET
QUERY CACHE.
TABLES Fecha todas as tabelas abertas e fora o fechamento de todas as tabelas em
uso
[TABLE | TABLES]
nome_tabela
[,nome_tabela...
]
Descarga somente das tabelas fornecidas.
Administrao do Bancos de Dados MySQL
273
TABLES WITH READ
LOCK
Fecha todas tabelas abertas e bloqueia todas tabelas para todos os bancos
de dados com leitura at que algum execute UNLOCK TABLES. Isto
uma maneira muito conveniente para fazer backups se voc possui um sis-
tema 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 bloquea-
dos 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 pro-
blemas se replicados para um slave.
Voc pode tambm acessar cada um dos comandos vistos acima com o utilitrio mysqladmin, uti-
lizando os comandos flush-hosts, flush-logs, reload ou flush-tables.
Tambm de uma olhada no comando RESET usado com a replicao. See Seco 4.6.5, Sintaxe de
RESET.
4.6.5. Sintaxe de RESET
RESET reset_option [,reset_option] ...
O comando RESET usado para limpar coisas. Ele tambm atua como uma verso mais forte do co-
mando FLUSH. See Seco 4.6.4, Sintaxe de FLUSH.
Para executar RESET, voc deve ter o privilgio RELOAD.
Opo Descrio
MASTER Deleta todos os logs binrios listados no arquivo ndice, esvaziando o ar-
quivo 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 mas-
ter. Anteriormente chamado FLUSH SLAVE. See Seco 4.11.8,
Instrues SQL para Controle do Servidor Slave.
QUERY CACHE Remove todos os resulatdos de consultas da cache de consultas.
4.6.6. Sintaxe de PURGE MASTER LOGS
PURGE {MASTER|BINARY} LOGS TO nome_binlog
PURGE {MASTER|BINARY} LOGS BEFORE data
Este comando usado para deletar todos os logs binrios estritamente anteriores ao binlog ou data
especificada. See Seco 4.11.7, Instrues SQL para Controle do Servidor Master.
PURGE BINARY LOGS est disponvel como um sinnimo para PURGE MASTER LOGS a partir
do MySQL 4.1.1.
4.6.7. Sintaxe de KILL
Administrao do Bancos de Dados MySQL
274
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 th-
read_id.
Se voc tiver o privilgio PROCESS, voc pode ver todas as threads. Se voc tiver o privilgio SU-
PER, 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 pa-
ra examinar e matar threads.
Nota: Atualmente voc no pode utilizar KILL com a biblioteca do servidor MySQL embutido, por-
que o servidor embutido apenas roda dentro das threads da aplicao, ela no cria threads de cone-
xes 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 re-
gistros. 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 habili-
tado, a instruo abortada. Note que se voc no estiver utilizando transaes, as alteraes
no iro ser desfeitas!
GET_LOCK() ir aborar com NULL.
Uma thread INSERT DELAYED ir rapidamente descarregar todos registros que estiverem em
memria e morrer.
Se a thread estiver no manipulador de bloqueio de tabelas (status: Locked), o bloqueio de tabe-
la ser abortado rapidamente.
Se a thread estiver esperando por espao livre em disco numa chamada write, a escrita abor-
tada com uma mensagem de espao em disco insuficiente.
4.6.8. Sintaxe de SHOW
SHOW DATABASES [LIKE wild]
ou SHOW [OPEN] TABLES [FROM nome_bd] [LIKE wild]
ou SHOW [FULL] COLUMNS FROM nome_tbl [FROM nome_bd] [LIKE wild]
ou SHOW INDEX FROM nome_tbl [FROM nome_bd]
ou SHOW TABLE STATUS [FROM nome_bd] [LIKE wild]
ou SHOW STATUS [LIKE wild]
ou SHOW VARIABLES [LIKE wild]
ou SHOW [BDB] LOGS
ou SHOW [FULL] PROCESSLIST
ou SHOW GRANTS FOR user
ou SHOW CREATE TABLE nome_tbl
ou SHOW MASTER STATUS
ou SHOW MASTER LOGS
ou SHOW SLAVE STATUS
Administrao do Bancos de Dados MySQL
275
ou SHOW WARNINGS [LIMIT row_count]
ou SHOW ERRORS [LIMIT row_count]
ou SHOW TABLE TYPES
SHOW fornece informaes sobre bancos de dados, tabelas, colunas ou informaes do estado do
servidor. Se a parte LIKE wild usada, a string wild pode ser uma string que usa os meta carac-
teres '%' e '_' do SQL.
4.6.8.1. Recuperando Informaes sobre Bancos de Dados, Tabe-
las, Colunas e ndices
Voc pode usar nome_bd.nome_tabela como uma alternativa para a sintaxe nome_tabela
FROM nome_bd. Estas duas declaraes so equivalentes:
mysql> SHOW INDEX FROM minhatabela FROM meudb;
mysql> SHOW INDEX FROM meubd.minhatabela;
SHOW DATABASES lista os bancos de dados no servidor MySQL. Voc tambm pode obter esta
lista utilizando o comando mysqlshow. Na verso 4.0.2 voc ver apenas aqeules banco de dados
para os quais voc tem algum tipo de privilgio, se voc no tiver o privilgio global SHOW DATA-
BASES.
SHOW TABLES lista as tabelas em um banco de dados especfico. Esta lista tambm pode ser obtida
utilizando o comando mysqlshow nome_db.
NOTA: Se um usurio no possui nenhum privilgio para uma tabela, a tabela no ser mostrada na
sada de SHOW TABLES ou mysqlshow nome_db
SHOW OPEN TABLES lista as tabelas que esto abertas no cache de tabelas. See Seco 5.4.7,
Como o MySQL Abre e Fecha as Tabelas. O campo Comment diz quantas vezes a tabela est em
cached e in_use.
SHOW COLUMNS lista as colunas em uma determinada tabela. Se voc especificar a opo FULL,
tambm ir obter os privilgios que voc possui para cada coluna. Se os tipos de colunas forem dife-
rentes do que voc esperava baseando na declarao CREATE TABLE, perceba que o MySQL algu-
mas vezes altera os tipos das colunas. See Seco 6.5.3.1, Alterao de Especificaes de
Colunas. A partir do MySQL 4.1, a palavra chave FULL tambm faz com que qualquer comentrio
por coluna seja mostrado.
A instruo DESCRIBE fornece informao similar SHOW COLUMNS. See Seco 6.6.2, Sintaxe
DESCRIBE (Obtem Informaes Sobre Colunas).
SHOW FIELDS um sinnimo para SHOW COLUMNS e SHOW KEYS um sinnimo para SHOW
INDEX. Voc tambm pode listar as colunas ou ndices de uma tabela com mysqlshow no-
me_db nome_tabela ou mysqlshow -k nome_bd nome_tabela.
SHOW INDEX retorna a informao de ndice em um formato que lembra bem a chamada SQLS-
tatistics do ODBC. As seguintes colunas so retornadas:
Coluna Significado
Table Nome da tabela.
Non_unique 0 se o ndice no puder conter duplicidades, 1 se puder
Key_name Nome do ndice.
Seq_in_index Nmero da sequncia da coluna no ndice, partir de 1.
Column_name Nome da coluna.
Collation Como a coluna ordenada no ndice. No MySQL, pode ter valores 'A'
(Ascendente) ou NULL (Not sorted).
Cardinality Nmero de valores nicos no ndice. Isto atualizado executando isamchk
Administrao do Bancos de Dados MySQL
276
-a.
Sub_part Nmero de caracteres indexados se a coluna s a indexada parcialmente.
NULL se a chave inteira for indexada.
Null Contm 'YES' se a coluna puder conter NULL.
Index_type Mtodo de ndice utilizado.
Comment Vrios comentrios. No momento, ele diz no MySQL < 4.0.2 se o ndice
FULLTEXT ou no.
Perceba que como o Cardinality contado baseado nas estatsticas armazenadas como inteiros,
ele pode no ser exato para tabelas pequenas.
As colunas Null e Index_type foram adicionadas no MySQL 4.0.2.
4.6.8.2. SHOW TABLE STATUS
SHOW TABLE STATUS [FROM nome_bd] [LIKE wild]
SHOW TABLE STATUS (introduzido na verso 3.23) funciona como o SHOW STATUS, mas for-
nece muitas informaes sobre cada tabela. Voc tambm pode obter esta lista utilizando o comando
mysqlshow --status nome_bd. As seguintes colunas so retornadas:
Coluna Significado
Name Nome da tabela.
Type Tipo da tabela. See Captulo 7, Tipos de Tabela do MySQL.
Row_format O formato de armazenamento do registro (Fixed (Fixo), Dynamic(dinmico),
ou Compressed (Compactado)).
Rows Nmero de registros.
Avg_row_length Tamanho mdio do registro.
Data_length Tamanho do arquivo de dados.
Max_data_lengt
h
Tamanho mximo do arquivo de dados. Para formatos de registro fixo, este
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 Tamanho do arquivo de ndice.
Data_free Nmero de bytes alocados mas no utilizados.
Auto_increment Prximo valor do auto incremento.
Create_time Quando a tabela foi criada.
Update_time A ltima vez que arquivo de dados foi atualizado.
Collation Conjunto de caracter e collation da tabela. (novo no 4.1.1)
Checksum Valor do checksum (se existir). (novo no 4.1.1)
Check_time A ltima vez que a tabela foi verificada.
Create_options Opes extras usadas com CREATE TABLE.
Comment O Comentrio utilizado quando a tabela criada (ou alguma informao do
porqu do MySQL no poder acessar a informao da tabela).
Tabelas InnoDB iro relatar o espao livre no tablespace no comentrio da tabela.
4.6.8.3. SHOW STATUS
SHOW STATUS fornece informaes de status do servidor (como mysqladmin extended-sta-
Administrao do Bancos de Dados MySQL
277
tus). A sada parecida com o que est exibido abaixo, apesar dos nmeros e formatos provavel-
mente 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 Nmero de conexes abortadas porque o cliente morreu sem fechar a
conexo corretamente. See Seco A.2.10, Erros de Comunicao /
Comunicao Abortada.
Administrao do Bancos de Dados MySQL
278
Aborted_connects Nmero de tentativas que falharam ao tentar a conexo ao servidor
MySQL. See Seco A.2.10, Erros de Comunicao / Comunicao
Abortada.
Bytes_received Nmero de bytes recebidos por todos os clientes.
Bytes_sent Nmero de bytes enviados para todos os clientes..
Com_xxxx Nmero de vezes que os comandos xxx foram executados.
Connections Nmero de tentativas de conexo ao servidor MySQL.
Crea-
ted_tmp_disk_tables
Nmero de tabelas temporrias implicitas em disco criadas durante a
execuo de instrues.
Created_tmp_tables Nmero de tabelas temporrias implicitas na memria criadas duran-
te execues de instrues.
Created_tmp_files Quantos arquivos temporrios o mysqld criou.
Dela-
yed_insert_threads
Nmero de threads para tratamento de insertdelayed que esto em
uso.
Delayed_writes Nmero de registros escritos com INSERT DELAYED.
Delayed_errors Nmero de registros escritos com INSERT DELAYED onde algum
erro ocorreu (provavelmente duplicate key).
Flush_commands Nmero de comandos FLUSH executados.
Handler_delete Nmero de vezes que um registro foi apagado da tabela.
Handler_read_first Nmero de vezes que a primeira entrada foi lida de um ndice. Se es-
te 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 Nmero de requisies para ler um registro baseado em uma chave.
Se este valor for alto, uma boa indicao que suas pesquisas e tabe-
las esto indexadas corretamente.
Handler_read_next Nmero de requisies para ler o prximo registro na ordem da cha-
ve. Este valor ser aumentado se voc consultar uma coluna de ndi-
ce com uma faixa restrita. Ele tambm aumentar se forem feitas
busca nos ndices.
Handler_read_prev Nmro de requisies ao registros anterior na ordem da chave. Ele
principalmente usado para otimizar ORDER BY ... DESC.
Handler_read_rnd Nmero de requisies para ler um registro baseado em uma posio
fixa. O valor ser alto se voc estiver executando vrias pesquisas
que exigem ordenao do resultado.
Hand-
ler_read_rnd_next
Nmero de requises para ler o prximo registro no arquivo de da-
dos. Ser alto se voc estiver fazendo vrias buscas na tabela. Geral-
mente sugere que suas tabelas no esto corretamente indexadas ou
que suas pesquisas no foram escritas para tirar vantagem dos ndices
existentes.
Handler_rollback Nmeros de comandos ROLLBACK internos.
Handler_update Nmero de requisies para atualizar um registro em uma tabela.
Handler_write Nmero de requisies para inserir um registro em uma tabela.
Key_blocks_used O nmero de blocos utilizados no cache das chaves.
Key_read_requests O nmero de requisies para ler um bloco de chaves do cache.
Key_reads O nmero de leituras fsicas de blocos de chaves do disco.
Key_write_requests O nmero de requisies para gravar um bloco de chaves no cache.
Key_writes O nmero de escritas fsicas de um bloco de chaves para o disco.
Max_used_connection
s
O nmero mximo de conexes simultneas que foram usadas.
Not_flushed_key_blo Blocos de chaves no cache de chaves que foi alterado mas ainda no
Administrao do Bancos de Dados MySQL
279
cks foi descarregado para o disco.
Not_flushed_delayed
_rows
Nmero de registros esperando para serem escritos em filas INSERT
DELAY.
Open_tables Nmero de tabelas abertas.
Open_files Nmero de arquivos abertos.
Open_streams Nmero de fluxos abertos (usado principalmente para logs).
Opened_tables Nmero de tabelas que foram abertas.
Rpl_status Status de replicao segura. (Ainda no est em uso).
Select_full_join Nmero de joins sem chaves (Se for 0, voc deve conferir com cui-
dado o ndice de suas tabelas).
Se-
lect_full_range_joi
n
Nmero de joins onde foram usadas pesquisas segmentadas na tabela
de referencia.
Select_range Nmero de joins onde foram usadas faixas da primeira tabela.
(Normalmente no crtica mesmo se o valor estiver alto.)
Select_scan Nmero de joins onde fizemos uma busca completa na primeira tabe-
la.
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 Nmero de consultas enviadas para o servidor.
Sla-
ve_open_temp_tables
Nmero de tabelas temporrias atualmente abertas pela thread slave.
Slave_running ON se este slave est conectado a um master.
Slow_launch_threads Nmero de threads que levaram mais tempo do que
slow_lauch_time para serem criadas.
Slow_queries Nmero de consultas que levaram mais tempo que
long_query_time segundos. See Seco 4.10.5, O Log para
Consultas Lentas.
Sort_merge_passes Nmero de ifuses feitas pelo algortmo de ordenao. Se este valor
for alto voc deve considerar o aumento de sort_buffer.
Sort_range Nmero de ordenaes que foram feitas com limites.
Sort_rows Nmero de registros ordenados.
Sort_scan Nmero de ordenaes que foram feitas lendo a tabela.
ssl_xxx Variveis usadas por SSL; Ainda no implementado.
Ta-
ble_locks_immediate
Nmero de vezes que um travamento de tabela foi obtido de maneira
automtica.
Table_locks_waited Nmero de vezes que um bloqueio de tabela no pde ser obtido
imediatamente e foi preciso esperar. Se o valor for alto, e voc tiver
problemas de performance, suas consultas devem ser otimizadas e
depois dividir sua tabela ou tabelas ou usar replicao. Disponvel
partir da verso 3.23.33
Threads_cached Nmero de threads no cache de threads.
Threads_connected Nmero de conexes atuais abertas.
Threads_created Nmero de threads criadas para lidar com conexes.
Threads_running Nmero de threads que no esto dormindo.
Uptime Quantos segundos o servidor est funcionando.
Alguns comentrios sobre a tabela acima:
Administrao do Bancos de Dados MySQL
280
Se Opened_tables for grande, provavelmente sua varivel table_cache est muito pe-
quena.
Se key_reads for grande, provavelmente sua varivel key_buffer_size provavelmente
est muito pequena. O ndice de acertos do cache pode ser calculaldo com
key_reads/key_read_requests.
Se Handler_read_rnd for grande, provavelmente voc possui vrias consultas que exigem
do MySQL fazer busca em tabelas inteiras ou voc tem joins que no utilizam chaves correta-
mente.
Se Threads_created for grande voc pode desejar aumentar a varivel thre-
ad_cache_size. A taxa de acerto da cache pode ser calculada com
Threads_created/Connections.
Se Created_tmp_disk_tables for grande, voc pode querer aumentar a varivel
tmp_table_size par obter tabelas temporrias em memrias em vez de tabelas em disco.
4.6.8.4. SHOW VARIABLES
SHOW [GLOBAL | SESSION] VARIABLES [LIKE wild]
SHOW VARIABLES exibe os valores de algumas variveis de sistema do MySQL.
As opes GLOBAL e SESSION so novas no MySQL 4.0.3. Com GLOBAL voc obter as vari-
veis que sero utilizadas para novas conexes ao MySQL. Com SESSION voc obter os valores
que esto em efeito para a conexo atual. Se voc no estiver usando nenhuma opo, SESSION se-
r usada.
Se os valores padres no lhe servirem, voc pode configurar a maioria destas variveis usando as
opes de linha de comando na inicializao do mysqld. See Seco 4.1.1, Opes de Linha de
Comando do mysqld. Voc pode alterar a maioria das variveis com o comando SET. See Sec-
o 5.5.6, Sintaxe de SET.
A sada de SHOW VARIABLES se parece com o exibido abaixo, embora o formato e os nmeros
possam divergir. Voc tambm pode conseguir esta informao usando o comando mysqladmin
variables.
+---------------------------------+------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------|
| back_log | 50 |
| basedir | /usr/local/mysql |
| bdb_cache_size | 8388572 |
| bdb_log_buffer_size | 32768 |
| bdb_home | /usr/local/mysql |
| bdb_max_lock | 10000 |
| bdb_logdir | |
| bdb_shared_data | OFF |
| bdb_tmpdir | /tmp/ |
| bdb_version | Sleepycat Software: ... |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
| character_set | latin1 |
| character_sets | latin1 big5 czech euc_kr |
| concurrent_insert | ON |
| connect_timeout | 5 |
| convert_character_set | |
| datadir | /usr/local/mysql/data/ |
| delay_key_write | ON |
| delayed_insert_limit | 100 |
| delayed_insert_timeout | 300 |
| delayed_queue_size | 1000 |
Administrao do Bancos de Dados MySQL
281
| flush | OFF |
| flush_time | 0 |
| ft_boolean_syntax | + -><()~*:""&| |
| ft_min_word_len | 4 |
| ft_max_word_len | 84 |
| ft_query_expansion_limit | 20 |
| ft_stopword_file | (built-in) |
| have_bdb | YES |
| have_innodb | YES |
| have_isam | YES |
| have_raid | NO |
| have_symlink | DISABLED |
| have_openssl | YES |
| have_query_cache | YES |
| init_file | |
| innodb_additional_mem_pool_size | 1048576 |
| innodb_buffer_pool_size | 8388608 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
| innodb_file_io_threads | 4 |
| innodb_force_recovery | 0 |
| innodb_thread_concurrency | 8 |
| innodb_flush_log_at_trx_commit | 1 |
| innodb_fast_shutdown | ON |
| innodb_flush_method | |
| innodb_lock_wait_timeout | 50 |
| innodb_log_arch_dir | |
| innodb_log_archive | OFF |
| innodb_log_buffer_size | 1048576 |
| innodb_log_file_size | 5242880 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_mirrored_log_groups | 1 |
| interactive_timeout | 28800 |
| join_buffer_size | 131072 |
| key_buffer_size | 16773120 |
| language | /usr/local/mysql/share/... |
| large_files_support | ON |
| local_infile | ON |
| locked_in_memory | OFF |
| log | OFF |
| log_update | OFF |
| log_bin | OFF |
| log_slave_updates | OFF |
| log_slow_queries | OFF |
| log_warnings | OFF |
| long_query_time | 10 |
| low_priority_updates | OFF |
| lower_case_table_names | OFF |
| max_allowed_packet | 1047552 |
| max_binlog_cache_size | 4294967295 |
| max_binlog_size | 1073741824 |
| max_connections | 100 |
| max_connect_errors | 10 |
| max_delayed_threads | 20 |
| max_heap_table_size | 16777216 |
| max_join_size | 4294967295 |
| max_relay_log_size | 0 |
| max_sort_length | 1024 |
| max_user_connections | 0 |
| max_tmp_tables | 32 |
| max_write_lock_count | 4294967295 |
| myisam_max_extra_sort_file_size | 268435456 |
| myisam_repair_threads | 1 |
| myisam_max_sort_file_size | 2147483647 |
| myisam_recover_options | force |
| myisam_sort_buffer_size | 8388608 |
| net_buffer_length | 16384 |
| net_read_timeout | 30 |
Administrao do Bancos de Dados MySQL
282
| 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 es-
pao 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 po-
dem ser empilhadas durante este breve tempo antes do MySQL parar de responder a novas re-
quisies. Voc is precisa aument-lo se espera um nmero alto de conexes em um curto per-
odo 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 mai-
or do que o limite de seu sistema operacional sero ineficazes.
basedir O valor da opo --basedir.
bdb_cache_size O buffer que alocado para o cache de ndice e registros de tabelas BDB.
Se voc no utiliza tabelas BDB, deve iniciar o mysqld com a opo --skip-bdb para evitar
desperdcio de memria para este cache.
bdb_log_buffer_size O buffer que alocado para o cache de ndice e registros de tabelas
BDB. Se voc no utiliza tabelas BDB, deve configur-la com 0 ou iniciar o mysqld com a op-
Administrao do Bancos de Dados MySQL
283
o --skip-bdb para evitar desperdcio de memria para este cache.
bdb_home O valor para a opo --bdb-home.
bdb_max_lock O nmero mximo de bloqueios (1000 por padro) que podem ser feitas em
uma tabela BDB. Voc deve ser aument-la se obter erros do tipo: bdb: Lock table is
out of available locks ou Got error 12 from ... quando so necessrias lon-
gas transaes ou quando o mysqld precisar examinar vrios registros para calcular a pesquisa.
bdb_logdir O valor da opo --bdb-logdir.
bdb_shared_data Est ligada (ON) se voc estiver utilizando --bdb-shared-data.
bdb_tmpdir O valor da opo --bdb-tmpdir.
binlog_cache_size. O tamanho do cache para armazenar instrues SQL para o log bin-
rio durante uma transao. Se voc geralmente utiliza transaes grandes, multi-instrues, voc
pode aumentar este valor para obter mais performance. See Seco 6.7.1, Sintaxe de START
TRANSACTION, COMMIT e ROLLBACK.
bulk_insert_buffer_size (era myisam_bulk_insert_tree_size) MyISAM usa
uma cache especial em rvore para fazer inseres em bloco (isto , INSERT ... SELECT,
INSERT ... VALUES (...), (...), ..., e LOAD DATA INFILE) mais rpidos.
Esta varivel limita o tamanho da rvore cache em bytes por thread. Defin-la com 0 desabilitar
esta otimizao Nota: esta cache s usada quando adicionado dados a uma tabela no vazia.
O valor padro 8 MB.
character_set O conjunto de caracteres padro.
character_sets Os conjuntos de caracteres suportados.
concurrent_inserts Se ON (ligado, por padro), o MySQL permitir o uso de INSERT
em tabelas MyISAM ao mesmo tempo em que so executadas consultas SELECT. Voc pode
desligar esta opo iniciando mysqld com --safe ou --skip-new.
connect_timeout O nmero de segundos que o servidor mysqld espera para um pacote de
conexo antes de responder com Bad handshake.
datadir O valor da opo --datadir.
delay_key_write
Option for MyISAM tables. Can have one of the following values:
OFF All CREATE TABLE ... DELAYED_KEY_WRITE so igno-
rados.
ON (padro) MySQL seguir a opo DELAY_KEY_WRITE para
CREATE TABLE.
ALL Todas as novas tabelas abertas so tratadas como se fossem cria-
das 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 ta-
bela fechada. Isto ir aumentar bem a velocidade de escrita em chaves, mas voc deve adicio-
nar 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 agen-
te que cuida de INSERT DELAYED ira conferir se exitem instrues SELECT pendentes. Se
sim, ele permite a execuo destas antes de continuar.
Administrao do Bancos de Dados MySQL
284
delayed_insert_timeout Quanto tempo uma thread INSERT DELAYED deve esperar
por instrues INSERT antes de terminar.
delayed_queue_size Qual tamanho deve ser alocado para a fila (em linhas) para lidar com
INSERT DELAYED. Se a fila encher, algum cliente que executar INSERT DELAYED ir espe-
rar at existir espao na fila novamente.
flush habilitado (ON) se voc iniciar o MySQL com a opo --flush.
flush_time Se esta varivel for configurada com um valor diferente de zero, ento a cada
flush_time segundos todas tabelas sero fechadas (para economizar recursos e sincronizar
dados com o disco). Recomendamos esta opo somente em sistemas com Win95, Win98 ou ou-
tros sistemas com poucos recursos.
ft_boolean_syntax Lista de operadores suportados por MATCH ... AGAINST(...
IN BOOLEAN MODE). See Seco 6.8, Pesquisa Full-text no MySQL.
ft_min_word_len O tamanho mnimo da palavra a ser includa em um ndice FULLTEXT.
Nota: ndices FULLTEXT devem ser reconstrudos depois de alterar esta varivel. (Esta op-
o nova para o MySQL 4.0.)
ft_max_word_len O tamanho mximo da palavra a ser includa em um ndice FULLTEXT.
Nota: ndices FULLTEXT devem ser reconstrudos depois de alterar esta varivel. (Esta op-
o nova para o MySQL 4.0.)
ft_query_expansion_limit Nnero de correspondncias a usar para consulta de expan-
so (em MATCH ... AGAINST (... WITH QUERY EXPANSION). (Esta opo nova
no MySQL 4.1.1)
ft_max_word_len_for_sort O tamanho mximo da palavra a ser includa em um ndice
FULLTEXT a ser usado no mtodo rpido de recriao do ndice em REPAIR, CREATE IN-
DEX, ou ALTER TABLE. Palavras mais longas so inseridas de modo lento. A regra do dedo
a seguinte: com ft_max_word_len_for_sort aumentando, MySQL criar arquivos tem-
porrios maiores (tornando o processo lente, devido a E/S de disco), e colocar poucas chaves
em um bloco ordenado (diminuindo a eficincia novamente). Quando
ft_max_word_len_for_sort muito pequeno, MySQL ir inserir vrias palavras no n-
dice de modo lento, mas pequenas palavras sero inseridas muito rapidamente.
ft_stopword_file O arquivo do qual se l a lista de palavras de parada para pesquisa full-
text. Todas as palavras do arquivo sero usadas; comentrios no so seguidos. Por padro, a lis-
ta 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. No-
ta: ndices FULLTEXT devem ser reconstrudos depois de alterar esta varivel. (Esta opo
nova para o MySQL 4.0.)
have_innodb YES if mysqld suporta tabelas InnoDB. DISABLED se --skip-innodb
usado.
have_bdb YES se o mysqld suportar tabelas Berkeley DB. DISABLED se a opo -
-skip-bdb for usada.
have_raid YES se o mysqld suportar a opo RAID.
have_openssl YES se o mysqld suportar SSL (criptografia) no protocolo cliente/ servidor.
init_file O nome do arquivo especificado com a opo --init-file quando voc inici-
ar o servidor. Este um arquivo das instrues SQL que voc deseja que o servidor execute
quando iniciado.
interactive_timeout O nmero de segundos que o servidor espera por atividade em uma
conexo antes de fech-la. Um cliente interativo definido como um cliente que utiliza a opo
CLIENT_INTERACTIVE para mysql_real_connect(). Veja tambm wait_timeout.
Administrao do Bancos de Dados MySQL
285
join_buffer_size O tamanho do buffer que utilizado para full joins (joins que no utili-
zam ndices). O buffer alocado uma vez para cada full join entre duas tabelas. Aumente este
valor para obter um full join mais rpido quando a adio de ndices no for possvel.
(Normalmente a melhor forma de obter joins rpidas adicionar ndices.)
key_buffer_size Blocos de ndices so buferizados e compartilhados por todas as threads.
key_buffer_size o tamanho do buffer utilizado para indexar blocos.
Aumente-o para lidar melhor com os ndices (para todas as leituras e escritas mltiplas) para o
mximo possvel 64M em uma mquina com 256M que executa, principalmente, o MySQL
bastante comum. Entretanto, se voc deixar este valor muito grande (mais que 50% da sua me-
mria total?) seu sistema pode iniciar a paginar e se tornar MUITO lento. Lembre-se que como o
MySQL no utiliza cache de leitura de dados, ser necessrio deixar algum espao para o cache
do sistema de arquivos para o Sistema Operacional.
Voc pode verificar a performance do buffer de chaves executando SHOW STATUS e examinar
as variveis Key_read_requests, Key_reads, Key_write_requests e
Key_writes. A razo de Key_reads/Key_read_request deve normalmente ser < 0.01.
O Key_write/Key_write_requests normalmnte prximo de 1 se voc estiver utili-
zando na maioria updates/deletes mas deve ser bem menor se voc tender a fazer atualizaes
que afetam vrias outras ao mesmo tempo ou se voc estiver utilizando DELAY_KEY_WRITE.
See Seco 4.6.8, Sintaxe de SHOW.
Para obter ainda mais velocidade quando estiver gravando vrios registros ao mesmo tempo, uti-
lize LOCK TABLES. See Seco 6.7.5, Sintaxe LOCK TABLES e UNLOCK TABLES.
language A linguagem utilizada para mensagens de erro.
large_file_support Se o mysqld foi compilado com opes para suporte a grandes ar-
quivos.
locked_in_memory Se o mysqld foi travado na memria com --memlock
log Se o log de todas as consultas est habilitado.
log_update Se o log de atualizaes est habilitado.
log_bin Se o log binrios est habilitado.
log_slave_updates Se as atualizaes do slave devem ser logadas.
long_query_time Se uma consulta demorar mais que isto (em segundos), o contador
Slow_queries ser incrementado. Se voc estiver utilizando --log-slow-queries, a
consulta ser logada ao arquivo de consultas lentas. See Seco 4.10.5, O Log para Consultas
Lentas. Este valor medido em tempo real, no em tempo de CPU, assim uma consulta que po-
de 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 armaze-
nados em letras minsculas no disco e nomes de tabelas sero caso-insensitivo. Na verso .0.2,
esta opo tambm se aplica aos nomes de banco de dados. Na verso 4.1.1 esta opo tambm
se aplcia a alias de tabelas. See Seco 6.1.3, Caso Sensitivo nos Nomes.
max_allowed_packet O valor mximo de um pacote. O buffer de mensagens iniciado por
net_buffer_length bytes, mas pode crescer at max_allowed_packet bytes quando
for necessrio. Este valor por padro pequeno, para obter pacotes maiores (possivelmente erra-
dos). Voc deve incrementar este valor se voc estiver usando colunas BLOB grandes. Ele deve
to grande quanto o maior BLOB que voc deseja utilizar. O protocol atual limita o
max_allowed_packet 16M no MySQL 3.23 e 1G no MySQL 4.0.
max_binlog_cache_size Se uma transao multi-instrues necessitar de mais que este
montante de memria, ser obtido o erro "Multi-statement transaction required more than
'max_binlog_cache_size' bytes of storage" ("Transao multi-instrues necessita mais que
Administrao do Bancos de Dados MySQL
286
'max_binlog_cache_size' bytes de armazenamento").
max_binlog_size Disponvel a partir da 3.23.33. Se uma escrita ao log binrio (replicao)
exceder o valor fornecido, rotacione os logs. Voc no pode configur-lo para menos de 4096
bytes (1024 na verso do MySQL anteriores a 4.0.14), ou mais que 1 GB. O valor padro 1
GB. Nota se voc estiver usando transaes: uma transao escrita em um bloco no arquivo de
log binrio, j que ele nunca separado entre diversos logs binrios. Desta forma, se voc tiver
grandes transaes, voc pode ter logs binrios maioores que max_binlog_size. Se
max_relay_log_size (disponvel a partir do MySQL 4.0.14) 0, ento
max_binlog_size se aplicar bem aos relay logs.
max_connections O Nmero de clientes simultneos permitidos. Aumentar este valor au-
menta o nmero de descritores de arquivos que o mysqld necessita. Veja abaixo os comentri-
os sobre os limites de descritores de arquivos. See Seco A.2.6, Erro: Too many connec-
tions.
max_connect_errors Se houver mais que este nmero de conexes interrompidas a partir
de uma mquina est mquina ter as prximas conexes bloqueadas. Voc pode desbloquar
uma mquina com o comadno FLUSH HOSTS.
max_delayed_threads No inicie mais do que este nmero de threads para lidar com ins-
trues 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 thre-
ad max_delayed.
max_heap_table_size Esta varivel define o tamanho mximo que uma tabela HEAP cria-
da 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 pos-
suem 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 dife-
rentes restries de tamanho no relay logs e logs binrios. No entanto, configurar a varivel com
0 far o MySQL usar max_binlog_size tanto para o log binrio quanto para o relay logs.
Voc tem que configurar max_relay_log_size com 0 ou mais de 4096, e menos que 1 GB.
O padro 0.
max_seeks_for_key Limite do nmero mximo de buscas ao procurar linhas com base em
uma chave. O otimizador MySQL assumir que quando pesquisar por linhas correspondentes em
uma tabela atravs da varredura da chave, no faremos mais que este nmero de busca de chave
independente da cardinalidade da chave. Configurando este parmetro com um valor baixo (100
?) voc pode forar o MySQL a preferir chaves em vez de varrer a tabela.
max_sort_length O nmero de bytes utilizados para ordenar valores BLOB ou TEXT
(somente os primeiros max_sort_lenght bytes de cada valor so usados; o resto ignora-
do).
max_user_connections O valor mximo de conexes ativas para um nico usurio (0 =
sem limite).
max_tmp_tables (Esta opo ainda no faz nada.) Nmero mximo de tabelas temporrias
que um cliente pode manter abertas ao mesmo tempo.
max_write_lock_count Depois desta quantidade de bloqueios de escrita, permite que al-
guns bloqueios de leitura sejam executados.
Administrao do Bancos de Dados MySQL
287
myisam_recover_options O valor da opo --myisam-recover.
myisam_sort_buffer_size O buffer que alocado ao ordenar o ndice quando estiver fa-
zendo um REPAIR ou estiver criando ndices com CREATE INDEX ou ALTER TABLE.
myisam_max_extra_sort_file_size. Se a criao do arquivo temporrio para criao
rpida de ndices fosse este valor maior que quando for usado o cache de chaves, de preferncia
ao mtodo de cache de chaves. Isto usado principalmente para forar que longas chaves de ca-
racteres em tabelas grandes usem o mtodo de cache de chaves mais lenta para criar o ndice.
NOTE que este parmetro fornecido em megabytes!
myisam_repair_threads. Se este valor maior que um, durante o processo reparo
por ordenao os ndices de tabels MyISAM sero criados em paralelo - cada ndice em sua
prpria thread. Nota reparos com multi-threads est ainda sob cdigo de qualidade alpha.
myisam_max_sort_file_size O tamanho mximo do arquivo temporrio que permiti-
do 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 que-
ries. Isto no deve ser alterado normalmente, mas se voc tem muito pouca memria, pode con-
figur-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 auto-
maticamente, 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 m-
ximo de espera definido pelo write_timeout. Veja tambm slave_read_timeout.
net_retry_count Se uma leitura na porta de comunicaes for interrompida, tente nova-
mente net_retry_count vezes antes de parar. Este valor deve ser bem alto no FreeBSD j
que interrupes internas so enviadas para todas as threads.
net_write_timeout Nmero de segundos para esperar pela escrita de um bloco em uma
conexo antes de abortar a escrita.
open_files_limit Nmero de arquivos que o sistema permite que o mysqld abra. Este o
valor real dado para o sistema e pode ser diferente do valor que voc passa ao mysqld como pa-
rmetro de inicializao. Ele 0 em sistemas onde o MySQL no pode alterar o nmero de ar-
quivos abertos.
pid_file O valor da opo --pid-file.
port O valor da opcao --port.
protocol_version A verso do protocolo usada pelo servidor MySQL.
range_alloc_block_size Tamanho dos blocos que so alocados ao se fazer uma otimi-
zao da faixa.
read_buffer_size (era record_buffer) Cada thread que faz uma leitura sequencial
aloca um buffer deste tamanho para cada tabela lida. Se voc fizer vrias leituras sequenciais,
voc pode desejar aumentar este valor.
read_rnd_buffer_ae (era record_rnd_buffer) Ao ler registros na ordem depois de
uma ordenao, os registros so lidos atravs deste buffer para evitar pesquisas em disco. Pode
melhorar bastante o ORDER BY se configurado com um valor alto. Como esta uma varivel
especfica da thread, no se pode defin-la globalmente, mas apenas alter-la ao executar alguma
consulta especfica grande.
query_alloc_block_size Tamanho dos blocos de alocao de memria que so alocados
Administrao do Bancos de Dados MySQL
288
para objetos criados durante a anlise e execuo da consulta. Se voc tiver problemas com frag-
mentao de memria ele pode ajudar a aumentar isto um pouco.
query_cache_limit No armazena resultados que so maiores que esta varivel. (Padro
1M).
query_cache_size A memria alocada para armazenar resultados de consultas antigas. Se
0, a cache de consulta desabilitada (padrot).
query_cache_type Pode ser configurado com (somente numrico)
Va-
lor
Alias Comentrio
0 OFF No armazena ou recupera resultados
1 ON Armazena todos os resultados exceto consultas SELECT
SQL_NO_CACHE ....
2 DE-
MAND
Armazena apenas consultas SELECT SQL_CACHE ....
query_prealloc_size Buffer persistente para anlise e execuo da consulta. No libe-
rado 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 pri-
vilgios. Isto pode melhorar a segurana se voc se preocupa com o fato das pessoas estarem ap-
tas a ver quais bancos de dados outros usurios possuem. Veja tambm
skip_show_databases.
server_id O valor da opo --server-id.
skip_locking Est desligado (OFF) se o mysqld usar bloqueio externo.
skip_networking Est ligado (ON) se somente permitimos conexes locais (socket).
skip_show_databases Isto previne usurios de fazerem SHOW DATABASES se eles no
possuirem o privilgio PROCESS_PRIV. Isto pode aumentar a segurana se voc se preocupa
com o fato das pessoas poderem ver quais bancos de dados outros usurios possuem. Veja tam-
bm safe_show_databases.
slave_net_timeout Nmero de segundos para esperar por mais dados de uma conexo de
master/slave antes de abortar a leitura.
slow_launch_time Se a criao de threads demorar mais que este valor (em segundos), o
contador Slow_launch_threads ser incrementado.
socket O socket Unix utilizado pelo servidor.
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 aumen-
ta o nmero de descritores de arquivos que o mysql necessita. O MySQL precisa de dois des-
critores 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 gran-
de 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.
Administrao do Bancos de Dados MySQL
289
table_type O tipo padro de tabelas.
thread_cache_size Quantas threads devem ser mantidas em cache para reutilizao.
Quando um cliente desconecta, as threads dos clientes so colocadas no cache se no existir
mais de thread_cache_size threads que antes. Todas novas threads sero obtidas primeira-
mente do cache, e s quando o cache estiver vazio uma nova thread criada. Esta varivel pode
ser aumentada para melhorar a performance se voc tiver vrias conexes novas. (Normalmente
isto no d uma melhora de performance notvel se voc possuir uma boa implementao de th-
reads.) Examinando as diferenas entre Connections e Threads_create (see Sec-
o 4.6.8.3, SHOW STATUS para maiores detalhes) pode ser visto o quo eficente o cache
de threads atual.
thread_concurrency No Solaris, mysqld ir chamar thr_setconcurrency() com
este valor. thdr_setconcurrency() permite que a aplicao fornea ao sistema de threads
uma dica com o nmero desejado de threads que devem ser executados ao mesmo tempo.
thread_stack O tamanho da pilha para cada thread. Vrios dos limites detectados pelo teste
crash-me so dependentes deste valor. O padro grande o suficiente para operaes nor-
mais. See Seco 5.1.4, O Pacote de Benchmark do MySQL.
timezone O fuzo horrio para este servidor.
tmp_table_size Se uma tabela temporria em memria exceder este tamanho, o MySQL ir
a convert-la automaticamente para uma tabela MyISAM em disco. Aumente o valor de
tmp_table_size se voc fizer vrias consultas GROUP BY avanadas e voc tiver muita
memria.
tmpdir O diretrio utilizado para arquivos temporrios e tabelas temporrias. A partir do
MySQL 4.1, ele pode ser definido com uma lista de caminhos separados por dois pontos (:)
(ponto e vrgula (; no Windows). Eles sero usados de modo robin-round. Este recurso pode ser
usado para dividir a craga entre diversos discos fsicos.
transaction_alloc_block_size Tamanho dos blocos de alocao de memria que so
alocados para consultas de armazenamento que so parte de uma transao que est para ser ar-
mazenada no log binrio ao se fazer um commit.
transaction_prealloc_block_size Buffer persistente para transacti-
on_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 mal-
loc.
version O nmero da verso do servidor.
wait_timeout O nmero de segundos que o servidor espera pela atividade em uma conexo
antes de fech-la. Veja tambm interactive_timeout.
Na inicializao da thread, SESSION.WAIT_TIMEOUT inicializado por GLO-
BAL.WAIT_TIMEOUT ou GLOBAL.INTERACTIVE_TIMEOUT dependendo do tipo do clien-
te (como definido pela opo de conexo CLIENT_INTERACTIVE). Veja tambm interac-
tive_timeout.
A seo do manual que descreve o ajuste do MySQL contm algumas informaes de como sintoni-
zar as variveis acima. See Seco 5.5.2, Parmetros de Sintonia do Servidor.
4.6.8.5. SHOW [BDB] LOGS
SHOW LOGS exibe estatsticas sobre os arquivos log existentes. Atualmente ele s exibe informa-
es sobre arquivos de log Berkeley DB, assim um alias para ele (disponvel a partir do MySQL
4.1.1) SHOW BDB LOGS.
File exibe o caminho completo para o arquivo de log
Administrao do Bancos de Dados MySQL
290
Type exibe o tipo do arquivo log (BDB para arquivos de log Berkeley DB).
Status exibe o status do arquivo log (FREE se o arquivo pode ser removido, ou IN USE se o
arquivo necessrio para o subsistema de transaes)
4.6.8.6. SHOW PROCESSLIST
SHOW [FULL] PROCESSLIST exibe quais threads esto em execuo. Esta informao tambm
pode ser obtida com o comando mysqladmin processlist. Se voc possuir o privilgio SU-
PER, poder ver todas as threads. Seno s possvel ver as prprias threads. See Seco 4.6.7,
Sintaxe de KILL. Se voc no utiliza a opo FULL, ento somente os primeiros 100 caracteres
de cada query serio exibidos.
A partir da verso 4.0.12, o MySQL informa o nome de maquina para conexes TCP/IP no formato
nome_maquina:client_port para tornar mais fcil de se encontrar qual cliente est fazendo
o que.
Este comando muito til caso voc obtenha a mensagem de erro 'too many connections' e deseja
saber o que est ocorrendo. O MySQL reserva uma conexo extra por cliente com o privilgio SU-
PER para garantir que voc sempre consiga logar e conferir o sistema (assumindo que este privilgio
no foi concedido para todos os usurios).
Alguns estados normalmente vistos em mysqladmin processlist
Checking table A thread est realizando verificao [automtica] da tabela.
Closing tables Signiifica que a thread est descarregando os dados alterados na tabela pa-
ra o disco e fechando as tabelas usadas. Isto deve ser uma operao rpida. Se no, voc deve
verificar se o seu disco no est cheio ou que o disco no est com sobrecarga.
Connect Out Slave est conectando ao master.
Copying to tmp table on disk O resultado temporrio foi maior que
tmp_table_size e a thread agora est alterando a tabela temporria na memria para o disco
para economizar memria.
Creating tmp table A thread est criando uma tabela temporria para guardar uma parte
do resultado para a consulta.
deleting from main table Ao executar a primeira parte de um delete multi-tabela e es-
tamos deletando apenas da primeira tabela.
deleting from reference tables Ao executar a segunda parte de um delete multi-
tabela 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 al-
guns 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.
Administrao do Bancos de Dados MySQL
291
Opening tables Isto simplesmente significa que a thread est tentando abrir uma tabela. Es-
te 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 co-
mando 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 estru-
tura 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 n-
dices.
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 to-
dos os registros coincidentes antes de atualiz-los. Isto deve ser feito se o UPDATE est alteran-
do 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 desabi-
litar o lock de sistema com a opo --skip-external-locking.
Upgrading lock O manipulador de INSERT DELAYED est tentando obter um lock para
inserir registros na tabela.
Updating A thread est procurando por registros para atualiz-los.
User Lock A thread est esperando um GET_LOCK().
Waiting for tables A thread recebeu uma notificao que a estrutura de uma tabela foi
alterada e ela precisa reabrir a tabela para receber a nova estrutura. Para poder reabrir a tabela
ela deve esperar at que todas a outras threads tenham fechado a tabela em questo.
A notificao acontece se outra thread usou FLUSH TABLES ou um dos seguintes comando na
tabela em questo: FLUSH TABLES nome_tabela, ALTER TABLE, RENAME TABLE,
REPAIR TABLE, ANALYZE TABLE ou OPTIMIZE TABLE.
waiting for handler insert O manipulador do INSERT DELAYED processou todas
as inseres e est esperado por outras.
A maioria dos estados so operaes muito rpidas. Se a thread permanecer em qualquer destes esta-
dos 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 pa-
ra encontrar erros no mysqld.
4.6.8.7. SHOW GRANTS
SHOW GRANTS FOR usurio lista os comandos concedidos que devem ser usados para dupli-
car os direitos de um usurio.
mysql> SHOW GRANTS FOR root@localhost;
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
Administrao do Bancos de Dados MySQL
292
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 Diver-
sas.
4.6.8.8. SHOW CREATE TABLE
Exibe uma instruo CREATE TABLE que ir criar a seguinte tabela:
mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE t (
id INT(11) default NULL auto_increment,
s char(60) default NULL,
PRIMARY KEY (id)
) TYPE=MyISAM
SHOW CREATE TABLE cita os nomes de colunas e tabelas de acordo com o valor da opo
SQL_QUOTE_SHOW_CREATE. Seco 5.5.6, Sintaxe de SET.
4.6.8.9. SHOW WARNINGS | ERRORS
SHOW WARNINGS [LIMIT row_count]
SHOW ERRORS [LIMIT row_count]
Este comando implementado no MySQL 4.1.0.
Ele mostra os erros,a visos e notas recebidos para o ltimo comando. Os erros/avisos so reiniciados
para cada comando que utiliza uma tabela.
O servidor MySQL envia de volta o nmero total de avisos e erros que voc recebe para o ltimo
comando; Isto pode ser retornado chamando mysql_warning_count().
At as mensagens max_error_count so armazenadas (variveis global e especficas da thread).
Voc pode recuperar o nmero de erros de @error_count e avisos de @warning_count.
SHOW WARNINGS mostra todos os erros, avisos e notas que voc recebeu para o ltimo comando
enquanto SHOW ERRORS lhe mostra apenas o erro.
mysql> DROP TABLE IF EXISTS no_such_table;
mysql> SHOW WARNINGS;
+-------+------+-------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------+
| Note | 1051 | Unknown table 'no_such_table' |
+-------+------+-------------------------------+
Note que no MySQL 4.1.0 apenas adicionamos a estrutura para avisos e poucos comandos MySQL
ainda geraram avisos. A verso 4.1.1 suporta todos os tipos de avisos para LOAD DATA INFILE e
instrues DML tais como os comandos INSERT, UPDATE e ALTER.
Por exemplo, aqui est um caso simple que produz avisos de converso para instrues de insero.
mysql> create table t1(a tinyint NOT NULL, b char(4));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t1 values(10,'mysql'),(NULL,'test'),(300,'open source');
Query OK, 3 rows affected, 4 warnings (0.15 sec)
Records: 3 Duplicates: 0 Warnings: 4
mysql> show warnings;
Administrao do Bancos de Dados MySQL
293
+---------+------+---------------------------------------------------------------+
| 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>
4.6.8.10. SHOW TABLE TYPES
SHOW TABLE TYPES
Este comando implementado no MySQL 4.1.0.
SHOW TABLE TYPES lhe mostra a informao de status sobre o tipo de tabela. Isto particula-
mente til para verificar se um tipo de tabela suportado; ou para ver qual o tipo de tabela padro.
mysql> SHOW TABLE TYPES;
+--------+---------+-----------------------------------------------------------+
| Type | Support | Comment |
+--------+---------+-----------------------------------------------------------+
| MyISAM | DEFAULT | Default type from 3.23 with great performance |
| HEAP | YES | Hash based, stored in memory, useful for temporary tables |
| MERGE | YES | Collection of identical MyISAM tables |
| ISAM | YES | Obsolete table type; Is replaced by MyISAM |
| InnoDB | YES | Supports transactions, row-level locking and foreign keys |
| BDB | NO | Supports transactions and page-level locking |
+--------+---------+-----------------------------------------------------------+
6 rows in set (0.00 sec)
A opo 'Support' DEFAULT indica se um tipo de tabela particular suportado, e qual o tipo pa-
Administrao do Bancos de Dados MySQL
294
dro. Se o servidor iniciado com --default-table-type=InnoDB, ento o campo 'Support'
do InnoDB ter o valor DEFAULT.
4.6.8.11. SHOW PRIVILEGES
SHOW PRIVILEGES
Este comando implementado no MySQL 4.1.0.
SHOW PRIVILEGES mostra a lista de privilgios de sistema o servidor MySQL suporta.
mysql> show privileges;
+------------+--------------------------+-------------------------------------------------------+
| Privilege | Context | Comment |
+------------+--------------------------+-------------------------------------------------------+
| Select | Tables | To retrieve rows from table |
| Insert | Tables | To insert data into tables |
| Update | Tables | To update existing rows |
| Delete | Tables | To delete existing rows |
| Index | Tables | To create or drop indexes |
| Alter | Tables | To alter the table |
| Create | Databases,Tables,Indexes | To create new databases and tables |
| Drop | Databases,Tables | To drop databases and tables |
| Grant | Databases,Tables | To give to other users those privileges you possess |
| References | Databases,Tables | To have references on tables |
| Reload | Server Admin | To reload or refresh tables, logs and privileges |
| Shutdown | Server Admin | To shutdown the server |
| Process | Server Admin | To view the plain text of currently executing queries |
| File | File access on server | To read and write files on the server |
+------------+--------------------------+-------------------------------------------------------+
14 rows in set (0.00 sec)
4.7. Localizao do MySQL e Utilizao Inter-
nacional
4.7.1. O Conjunto de Caracteres Utilizado para Dados
e Ordenao
Por padro, o MySQL utiliza o conjunto de caracteres ISO-8859-1 (Latin1) com ordenao de acor-
do com o sueco/finlands. Este tambm o conjunto de caracteres aplicvel nos EUA e oeste da Eu-
ropa.
Todos os binrios padres do MySQL so compilados com -
-with-extra-charsets=complex. Isto adicionar cdigo a todos os programas padres para
estarem aptos a lidar com o conjuntos de caracteres latin1 e todos os multi-byte no binrio. Ou-
tros conjuntos de caracteres sero carregados de um arquivo de definies de conjuntos de caracte-
res quando necessrios.
O conjunto de caracteres determina quais so os caracteres permitidos em nomes e qual a forma de
ordenao por clusulas ORDER BY e GROUP BY da instruo SELECT.
Voc pode alterar o conjunto de caracteres com a opo --default-character-set na inici-
alizao do servidor. Os conjuntos de caracteres disponveis dependem dos parmetros -
-with-charset=charset e --with-extra-charset= list-of-charset | com-
plex | all | none e os arquivos de configuraes de conjuntos de caracteres listados em
SHAREDIR/charsets/ Index. See Seco 2.3.3, Opes tpicas do configure .
Se o conjunto de caracteres for alterado durante a execuo do MySQL (que tambm pode alterar a
ordenao), deve-se executar o 0myisamchk -r -q --set-character-set=charset
em todas as tabelas. De outra forma seus ndices podem no ser ordenados corretamente.
Administrao do Bancos de Dados MySQL
295
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 ca-
racteres 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 usu-
rio 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 armazena-
dos.
Pode-se forar o cliente a usar conjuntos de caracteres especficos especificando:
[client]
default-character-set=nome-conjunto-caracteres
mas normalmente isto nunca ser necessrio.
4.7.1.1. German character set
Para se fazer ordenao em Alemo, voc deve iniciar o mysqld com -
-default-character-set=latin1_de. Isto lhe dar as seguintes caracteristicas.
Ao ordenar e comparar strings, o seguinte mapeamento feito na string antes de fazer a compara-
o:
-> 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 le-
tras so convertidas para maisculas. Acentos so removidos para todas as letras exceto: , , , ,
e .
4.7.2. Mensagens de Erros em Outras Lnguas
mysqld pode exibir mensagens de erros nas seguintes lnguas: Tcheco, Dinamarqus, Holands,
Ingls (padro), Estonian, Francs, Alemo, Grego, Hngaro, Italiano, Japons, Koreano, Norue-
gus, Noruegus-ny, Polons, Portugus, Romeno, Russo, Eslovaco, Espanhol e Sueco.
Para iniciar o mysqld com uma lngua particular, use uma das opes: --language=lngua
ou -L lngua . Por exemplo:
shell> mysqld --language=swedish
ou:
Administrao do Bancos de Dados MySQL
296
shell> mysqld --language=/usr/local/share/swedish
Perceba que todos as lnguas so especificados em minsculas.
Os arquivos de linguagens esto localizados (por padro) em mysql_base_dir/share/LAN-
GUAGE/.
Para atualizar o arquivo com mensagens de erros, deve-se editar o arquivo errmsg.txt e executar
o seguinte comando para gerar o arquivo errmsg.sys:
shell> comp_err errmsg.txt errmsg.sys
Se voc atualizar o MySQL para uma verso mais nova, lembre-se de repetir as alteraes no novo
arquivo errmsg.txt.
4.7.3. Adicionando um Novo Conjunto de Caracteres
Para adicionar outro conjunto de caracteres ao MySQL, utilize o seguinte procedimento.
Decida se o conjunto simples ou complexo. Se o conjunto de caracteres no necessitar do uso de
rotinas especiais de classificao de strings para ordenao e tambm no necessitar de suporte ca-
racteres multi-byte, ser simples. Se ele necessitar de alguns destes recursos, ser complexo.
Por exemplo, latin1 e danish so conjuntos simples de caracteres enquanto big5 ou czech
so conjuntos de caracteres complexos.
Na seguinte seo, assumimos que voc nomeou seu conjunto de caracteres como MYSET.
Para um conjunto de caracteres simples use o seguinte:
1. Adicione MYSET para o final do arquivo sql/share/charsets/Index Associe um n-
mero nico ao mesmo.
2. Crie o arquivo sql/share/charsets/MYSET.conf. (O arquivo sql/sha-
re/charsets/latin1.conf pode ser utilizado como base para isto).
A sintaxe para o arquivo muito simples:
Comentrios iniciam com um caractere '#' e continuam at o fim da linha.
Palavras so separadas por quantidades arbitrrias de espaos em brancos.
Ao definir o conjunto de caracteres, cada palavra deve ser um nmero no formato hexadeci-
mal
O vetor ctype obtm as primeiras 257 palavras. Os vetores to_lower, to_upper e
sort_order obtm, cada um, as 256 palavras seguintes.
See Seco 4.7.4, Os Vetores de Definies de Caracteres.
3. Adicione o nome do conjunto de caracteres s listas CHARSETS_AVAILABLE e COMPI-
LED_CHARSETS no configure.in.
4. Reconfigure, recompile e teste.
Para um conjunto de caracteres complexo faa o seguinte:
1. Crie o arquivo strings/ctype-MYSET.c na distribuio fonte do MYSQL.
Administrao do Bancos de Dados MySQL
297
2. Adicione MYSET ao final do arquivo sql/share/charsets/Index. Associe um nmero
nico a ele.
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 con-
junto de caracteres complexo.
4. Prximo ao topo do arquivo, coloque um comentrio especial como este:
/*
* This comment is parsed by configure to create ctype.c,
* so don't change it unless you know what you are doing.
*
* .configure. number_MYSET=MYNUMBER
* .configure. strxfrm_multiply_MYSET=N
* .configure. mbmaxlen_MYSET=N
*/
O programa configure utiliza este comentrio para incluir o conjunto de caracteres na bibli-
oteca MySQL automaticamente.
As linhas strxfrm_multiply e mbmaxlen sero explicadas nas prximas sees. S as inclua se
voc precisar de funes de ordenao de strings ou das funes de conjuntos de caracteres
multi-byte, respectivamente.
5. Voc deve ento criar algumas das seguintes funes:
my_strncoll_MYSET()
my_strcoll_MYSET()
my_strxfrm_MYSET()
my_like_range_MYSET()
See Seco 4.7.5, Suporte Ordenao de Strings.
6. Adicione o nome do conjunto de caracteres s listas CHARSETS_AVAILABLE e COMPI-
LED_CHARSETS no configure.in.
7. Reconfigure, recompile e teste.
O arquivo sql/share/charsets/README fornece algumas instrues a mais.
Se voc desejar ter o seu conjunto de caracteres includo na distribuio MySQL, envie um email
com um patch para a lista de email ``internals'' do MySQL. See Seco 1.7.1.1, As Listas de Dis-
cusso do MySQL.
4.7.4. Os Vetores de Definies de Caracteres
to_lower[] e to_upper[] so vetores simples que definemm os caracteres minsculos e ma-
sculos correspondentes a cada membro do conjunto de caracteres. Por exemplo:
to_lower['A'] deve conter 'a'
to_upper['a'] deve conter 'A'
sort_order[] um mapa indicando como os caracteres devem ser ordenados para propsitos de
comparao e ordenao. Para vrios conjuntos de caracteres, isto o mesmo que to_upper[]
(que significa ordenar em caso insensitivo). O MySQL ordenar caracteres baseado no valor de
Administrao do Bancos de Dados MySQL
298
sort_order[caractere]. Para regras mais complicadas de ordenao, veja a discusso sobre
ordenao de string abaixo. See Seco 4.7.5, Suporte Ordenao de Strings.
ctype[] um vetor com valores binrios, com um elemento para cada caracter. (Note que
to_lower[], to_upper[] e sort_order[] so indexados pelo valor do caracter, mas o
ctype[] indexado pelo valor do caracter + 1. Este um antigo legado para tratamento de EOF.)
Pode-se encontrar as seguintes mscaras binrias de definies em m_ctype.h:
#define _U 01 /* Masculo */
#define _L 02 /* Minsculo */
#define _N 04 /* Numeral (digito) */
#define _S 010 /* Caractere de espao */
#define _P 020 /* Pontuao */
#define _C 040 /* Caractere de controle */
#define _B 0100 /* Branco */
#define _X 0200 /* Digito heXadecimal */
A entrada ctype[] para cada caracter deve ser a unio dos valores da mscara binria que descre-
vem o caracter. Por exemplo, 'A' um caracter maisculo (_U) bem como um dgito hexadecimal
(_X), portanto ctype['A'+1] deve conter o valor:
_U + _X = 01 + 0200 = 0201
4.7.5. Suporte Ordenao de Strings
Se as regras de ordenao para a sua linguagem forem muito complexas para serem tratadas com
uma simples tabela sort_order[], ser necessrio o uso das funes de ordenao de strings.
No momento, a melhor documentao sobre isto so os conjuntos de caracteres que j esto imple-
mentados. Confira os conjuntos de caracteres big5, czech, gbk, sjis e tis160 para exemplos.
Voc deve especificar o valor strxfrm_multiply_MYSET=N no comentrio especial no topo
do arquivo. N deve ser configurado para a razo mxima que as strings podem crescer durante
my_strxfrm_MYSET (ele deve ser um inteiro positivo).
4.7.6. Suporte Caracteres Multi-byte
Se voc deseja adicionar suporte para novos conjuntos de caracteres que incluem caracteres multi-by-
te, voc precisa usar as funes para caracteres multi-byte.
No momento, a melhor documentao sobre isto so os conjuntos de caracteres que j esto imple-
mentados. Confira os conjuntos de caracteres euc_kr, gb2312, gbk, sjis e ujis para exem-
plos. Eles so implementados no arquivo ctype-'conj_caracter'.c no diretrio strings
Voc deve especificar o valor mbmaxlen_MYSET=N no comentrio especial no topo do arquivo. N
deve ser configurado como o tamanho em bytes do maior caracter no conjunto.
4.7.7. Problemas com Conjuntos de Caracteres
Se voc tentar usar um conjunto de caractere que no foi compilado dentro do se binrio, voc pode
encontrar aluguns problemas:
Seu programa tem um caminho errado para onde o conjunto de caracter est armazenado
(Padro /usr/local/mysql/share/mysql/charsets). Isto pode ser corrigido usando
a opo --character-sets-dir para o programa em questo.
O conjunto sde caracteres multi-byte e no pode ser carregado dinamicamente. Neste caso vo-
c tem que recompilar o programa com o suporte para o conjunto de caracteres.
Administrao do Bancos de Dados MySQL
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.
Seu arquivo Index no contm o nome do conjunto de caracteres.
ERROR 1105: File '/usr/local/share/mysql/charsets/?.conf' not found
(Errcode: 2)
Neste caso voc deve obter um novo arquivo Index ou adicionar o nome do conjunto de carac-
ters que falta manualmente.
Para tabelas MyISAM, voc pode vericifcar o nome e nmero do conjunto de caracteres para uma ta-
bela com myisamchk -dvv nome_tabela.
4.8. Utilitrios e Scripts do Lado do Servidor
MySQL
4.8.1. Viso Geral dos Scripts e Utilitrios do Lado
Servidor
Todos os programas MySQL possuem vrias opes diferentes, entretanto, todo programa MySQL
fornece uma opo --help que pode ser usada para obter uma descrio completa das diferentes
opes do programa. Por exemplo, experimente mysql --help.
Voc pode sobrepor ignorar as opes padres para todos os programas clientes com um arquivo de
opes. Seco 4.1.2, Arquivo de Opes my.cnf.
A lista abaixo descreve brevemente os programas MySQL.
myisamchk
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 necess-
rio 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 normalmen-
Administrao do Bancos de Dados MySQL
300
te executado somente na primeira vez quando o MySQL instalado em um sistema.
4.8.2. mysqld-safe, o wrapper do mysqld
mysqld_safe a maneira recomendada para iniciar um daemon mysqld no Unix.
mysqld_safe adiciona alguns recursos de segurana tais como reiniciar o servidor quando um er-
ro ocorrer e log de informaes de tempo de execuo a um arquivo log.
Note: Antes do MySQL 4.0, mysqld_safe chamado safe_mysqld. Para preservar a compa-
tibilidade com verses anteriores, a distribuio binria do MySQL para algumas vezes incluir sa-
fe_mysqld como um link simblico para mysqld_safe.
Se voc no utilizar --mysqld=# ou --mysql-version=# o mysqld_safe ir utilizar um
executvel chamado mysqld-max se ele existir. Se no, mysqld_safe ir iniciar o mysqld. Is-
to torna muito fcil utilizar o mysql-max no lugar do mysqld; basta copiar mysqld-max no
mesmo diretrio do mysqld e ele ser utillizado.
Normalmente o script mysqld_safe nunca deve ser editado, em vez disto, coloque as opes para
o mysqld_safe na seo [mysqld_safe] no arquivo my.cnf. O mysqld_safe ir ler to-
das as opes das sees [mysqld], [server] e [mysqld_safe] dos arquivos de opes.
(Para compatibilidade com verses anteriores, ele tambm l as sees [safe_mysqld].) See
Seco 4.1.2, Arquivo de Opes my.cnf.
Note que todas as opes na linha de comando para o mysqld_safe so passadas para o
mysqld. Se voc deseja usar algumas opes no mysqld_safe que o mysqld no suporte, voc
deve especific-las no arquivo de opes.
A maioria das opes para mysqld_safe so as mesmas que as do mysqld. See Seco 4.1.1,
Opes de Linha de Comando do mysqld.
mysqld_safe suporta as seguintes opes:
--basedir=caminho , --core-file-size=#
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 vo-
c 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 no MySQL 4.0.14) , --no-defaults , -
-open-files-limit=#
Nmero de arquivos que o mysqld poder abrir. Passado para ulimit -n. Perceba que ser
Administrao do Bancos de Dados MySQL
301
necessrio iniciar mysqld_safe como root para isto funcionar corretamente!
--pid-file=caminho , --port=# , --socket=caminho , --timezone=#
Configura a varivel de fuso horrio (TZ) para o valor deste parmetro.
--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:
O servidor e o banco de dados pode ser encontrado relativo ao diretrio de onde o
mysqld_safe foi chamado. mysqld_safe procura dentro de seu diretrio de trabalho pelos
diretrios bin e data (para distribuies binrias) ou pelos diretrios libexec e var (para
distribuies baseadas em cdigo fonte). Esta condio deve ser satisfeita se voc executar o
mysqld_safe a partir do seu diretrio da instalao do MySQL (por exemplo, /
usr/local/mysql para uma distribuio binria).
Se o servidor e os bancos de dados no forem encontrados relativos ao diretrio de trabalho,
mysqld_safe tenta localiz-lo utilizando caminhos absolutos. Localizaes tpicas so /
usr/local/libexec e /usr/local/var. As localizaes atuais foram determinadas
quando a distribuio foi construda da qual vem o mysqld_safe. Eles dever estar corretas se
o MySQL foi instalado na localizao padro.
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.
4.8.3. mysqld_multi, programa para gerenciar mlti-
plos servidores MySQL
mysqld_multi gerencia vrios processos mysqld executando em diferentes sockets UNIX e
portas TCP/IP.
O programa ir pesquisar pelos grupos chamados [mysqld#] no my.cnf (ou no arquivo forneci-
do no parmetro --config-file=...), onde # pode ser qualquer nmero positivo a partir de
1. Este nmero referenciado a seguir como nmero do grupo de opes ou GNR. Nmeros de gru-
pos distinguem grupos de opes para um outro e so usados como argumentos para
mysqld_multi para especificar quais servidores voc deseja iniciar, parar ou obter status. Opes
listadas nestes grupos devem ser a mesma que voc usaria para iniciar o mysqld. (see Seco 2.4.3,
Inicializando e parando o MySQL automaticamente.). No entanto, para o mysqld_multi, este-
ja certo que cada grupo inclui opes de valores tais como a porta, socket, etc., para ser usado para
cada processo mysqld individual.
Uso: mysqld_multi [OPES] {start|stop|report} [GNR,GNR,GNR...]
ou mysqld_multi [OPES] {start|stop|report} [GNR-GNR,GNR,GNR-GNR,...]
O GNR acima significa o nmero do grupo. Voc pode iniciar, parar ou relacionar qualquer GNR ou
Administrao do Bancos de Dados MySQL
302
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. Qual-
quer 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 procu-
rado 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 ar-
quivo 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 localiza-
do 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.
Algumas notas sobre mysqld_multi:
Administrao do Bancos de Dados MySQL
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=...)
pid-file muito importante, se voc estiver utilizando mysqld_safe para iniciar o
mysqld (ex. --mysqld=mysqld_safe) Todos os mysqld devem ter seus prprios pid-file.
A vantagem de utilizar o mysqld_safe no lugar de executar diretamente o mysqld que
mysqld_safe guarda todos os processos e ir reinici-los, se um processo do mysqld falhar
devido a um sinal kill -9, ou similar. (Como um falha de segmentao, que nunca pode acontecer
com o MySQL.) Por favor note que pode ser necessrio executar o script mysqld_safe de um
lugar especfico. Isto significa que voc pode ter que alterar o diretrio atual para um diretrio
especfico antes de iniciar o mysqld_multi. Se voc tiver problemas ao iniciar, por favor veja
o script mysqld_safe. Verifique especialmente as linhas:
--------------------------------------------------------------------------
MY_PWD=`pwd` Check if we are starting this relative (for the binary
release) if test -d /data/mysql -a -f ./share/mysql/english/errmsg.sys
-a -x ./bin/mysqld
--------------------------------------------------------------------------
See Seco 4.8.2, mysqld-safe, o wrapper do mysqld. O teste acima deve ser bem suce-
dido, ou voc pode encontrar problemas.
Esteja certo do perigoso de iniciar mltiplos mysqlds no mesmo diretrio de dados. Utilize di-
retrios 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 ar-
quivo de configurao.
Quando voc desejar referenciar a um grupo especfico utilizando GNR com este programa, bas-
ta 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 usu-
rio 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 dire-
trio 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.
See Seco 4.2, Executando Mltiplos MySQL Servers na Mesma Mquina.
Este um exemplo do arquivo de configurao para o funcionamento do mysqld_multi.
Administrao do Bancos de Dados MySQL
304
# Este arquivo provavelmente deve estar em seu diretrio home (~/.my.cnf) ou /etc/my.cnf
# 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.
4.8.4. myisampack, O Gerador de Tabelas Compacta-
das de Somente Leitura do MySQL
myisampack usado para compactar tabelas MyISAM, e pack_isam usado para compactar
tabelas ISAM. Como as tabelas ISAM esto ultrapassadas, ns iremos discutir aqui somente sobre o
myisampack, mas tudo dito sobre myisampack tambm pode ser verdadeiro para o
pack_isam.
myisampack trabalha compactando cada coluna na tabela separadamente. A informao necess-
ria para descompactar colunas lida em memria quando a tabela aberta. Isto resulta em uma per-
formance muito melhor quando estiver acessando registros individuais, porque voc precisar des-
compactar somente um registro, no um bloco muito maior do disco como faz o Stacker no MS-
DOS. Normalmente, myisampack compacta o arquivo de dados 40%-70%.
O MySQL utiliza mapeamento de memria (nmap()) em tabelas compactadas e retorna ao uso nor-
mal de leitura e escrita se nmap() no funcionar.
Por favor, note o seguinte:
Depois de comapctada, a tabela somente-leitura. Isto , normalmente, pretendido (como quan-
do 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.
Administrao do Bancos de Dados MySQL
305
myisampack chamado desta forma:
shell> myisampack [opes] nome_arquivo ...
Cada nome_arquivo deve ter o nome de um arquivo de ndice (.MYI). Se voc no se encontra em
um diretrio de bancos de dados, voc deve especificar o caminho completo para o arquivo. Pode-se
omitir a extenso .MYI.
myisampack suporta as seguintes opes:
-b, --backup
Realiza um backup da tabela como nome_tabela.OLD.
-#, --debug=debug_options
Log da sada de depurao. A string debug_options geralmante
'd:t:o,nome_arquivo'.
-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 com-
pacta a tabela. Se voc matar o myisampack o arquivo .TMD no pode ser removido. Normal-
mente, 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 no-
me_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 pr-
xima vez que voc compactar o mesmo arquivo voc pode utilizar um registro de tamanho me-
nor.)
-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 temporri-
as.
-v, --verbose
Administrao do Bancos de Dados MySQL
306
Modo verbose. Escreve informao sobre o prograsso e resultado da compactao.
-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 Rec/key
1 2 4 unique unsigned long 1024 1024 1
2 32 30 multip. text 10240 1024 1
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
Administrao do Bancos de Dados MySQL
307
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
Administrao do Bancos de Dados MySQL
308
17 262 20 no endspace, no empty 8 9
18 282 20 no endspace, no empty 5 9
19 302 30 no endspace, no empty 6 9
20 332 4 always zero 2 9
21 336 4 always zero 2 9
22 340 1 3 9
23 341 8 table-lookup 9 0
24 349 8 table-lookup 10 0
25 357 8 always zero 2 9
26 365 2 2 9
27 367 2 no zeros, zerofill(1) 2 9
28 369 4 no zeros, zerofill(1) 2 9
29 373 4 table-lookup 11 0
30 377 1 3 9
31 378 2 no zeros, zerofill(1) 2 9
32 380 8 no zeros 2 9
33 388 4 always zero 2 9
34 392 4 table-lookup 12 0
35 396 4 no zeros, zerofill(1) 13 9
36 400 4 no zeros, zerofill(1) 2 9
37 404 1 2 9
38 405 4 no zeros 2 9
39 409 4 always zero 2 9
40 413 4 no zeros 2 9
41 417 4 always zero 2 9
42 421 4 no zeros 2 9
43 425 4 always zero 2 9
44 429 20 no empty 3 9
45 449 30 no empty 3 9
46 479 1 14 4
47 480 1 14 4
48 481 79 no endspace, no empty 15 9
49 560 79 no empty 2 9
50 639 79 no empty 2 9
51 718 79 no endspace 16 9
52 797 8 no empty 2 9
53 805 1 17 1
54 806 1 3 9
55 807 20 no empty 3 9
56 827 4 no zeros, zerofill(2) 2 9
57 831 4 no zeros, zerofill(1) 2 9
A informao exibida pelo myisampack descrita abaixo:
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 ME-
DIUMINT).
pre-space
O nmero de colunas decimais que so armazenadas com espaos a esquerda. Neste caso, cada
Administrao do Bancos de Dados MySQL
309
valor ir conter uma contagem para o nmero de espaos.
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 ca-
da 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
Administrao do Bancos de Dados MySQL
310
Valores zero so armazenados em 1 bit.
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/myi-
samchk 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.
4.8.5. mysqld-max, om servidor mysqld extendido
mysqld-max o servidor MySQL (mysqld) configurado com as seguintes opes de configura-
o:
Opo Comentrio
--with-server-suffix=-max Adiciona um sufixo string de verso mysqld
--with-innodb Suporte a tabelas InnoDB
--with-bdb Suporte para tabelas Berkeley DB (BDB)
CFLAGS=-DUSE_SYMDI
R
Suporte a links simblicos para Windows
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 do MySQL-max em
http://www.mysql.com/downloads/mysql-max-4.0.html.
A distribuio binria Windows MySQL 3.23 inclui tanto o binrio mysqld.exe padro e o bin-
rio 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 binri-
os 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 |
Administrao do Bancos de Dados MySQL
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 A opo est ativa e utilizada.
NO O MySQL no est compilado com suporte a esta opo.
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 op-
o. Neste caso o arquivo hostname.err deve conter uma razo indicando o por-
que 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 configu-
rao 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 mysqld-
max 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 ins-
tala 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 S S
AIX 4.3 N S
HP-UX 11.0 N S
Linux-Alpha N S
Linux-Intel S S
Linux-IA-64 N S
Solaris-Intel N S
Solaris-SPARC S S
SCO OSR5 S S
UnixWare S S
Mac OS X N S
Note que a partir do MySQL 4, voc no precisa de um servidos MySQL Max para o InnoDB por-
que ele includo por padro.
4.9. Utilitrios e Scripts do Lado do Cliente
Administrao do Bancos de Dados MySQL
312
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 uti-
lizam as seguintes variveis de ambiente:
Nome Descrio
MYSQL_UNIX_PORT O socket padro, utilizado para conexes ao localhost
MYSQL_TCP_PORT A porta TCP/IP padro
MYSQL_PWD A senha padro
MYSQL_DEBUG Opes de depurao-ratreamento durante depurao
TMPDIR O diretrio onde tabelas e arquivos temporrios so criados
A utilizao de MYSQL_PWD insegura. See Seco 4.3.8, Conectando ao Servidor MySQL.
No Unix, o cliente mysql utiliza o arquivo nomeado na varivel de ambiente MYSQL_HISTFILE
para salvar o histrico da linha de comando. O valor padro para o arquivo de histrico
$HOME/.mysql_history, onde $HOME o valor da varivel de ambiente HOME. See Apndi-
ce F, Variveis de Ambientes do MySQL.
Se voc no quiser manter um arquivo que contenh um registro de suas consultas, primeiro remova
.mysql_history se ele existir, ento use uma das seguintes tcnicas:
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.
Crie .mysql_histfile como um link simblico para /dev/null:
shell> ln -s /dev/null $HOME/.mysql_history
Voc s precisa de fazer isto uma vez.
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 di-
ferentes opes do programa. Por exemplo, experimente mysql --help
Voc pode sobrepor todas as opes padres para programas cliente padres com um arquivo de op-
es. 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.
Administrao do Bancos de Dados MySQL
313
mysqlcc
Este programa fornece uma interface grfica para interagir com o servidor. server. See Sec-
o 4.9.3, mysqlcc, The MySQL Control Center.
mysqlaccess
Um script que verifica os privilgios de acesso para uma combinao de nome de mquina, usu-
rio 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 esta-
do 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 Ro-
manenko. 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 Sec-
o 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 fi-
nito para comparar strings maiores primeiro. Pode ser usada para trocar conjuntos de caracteres.
Por exemplo, este comando troca a e b nos arquivos dados:
shell> replace a b b a -- arquivo1 arquivo2 ...
4.9.2. mysql, A Ferramenta de Linha de Comando
O mysql uma shell SQL simples (com capacidades GNU readline). Ele suporta usos interati-
vos e no interativos. Quando usado interativamente, os resultados das consultas so apresentadas
no formato de tabela ASCII. Quando no usado interativamente (como um filtro por exemplo), o re-
Administrao do Bancos de Dados MySQL
314
sultado apresentado em um formato separado por tabulaes. (O formato de sada pode ser altera-
do 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 clien-
te.
--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 li-
nha. 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=...
Administrao do Bancos de Dados MySQL
315
Configura o conjunto de caracters padro.
-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 nomea-
dos 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, coman-
dos 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 re-
sultados que incluem mensagens de erro.
--no-pager
Desabilita paginao e impresso na sada padro. Veja tambm a ajuda interativa (\h).
Administrao do Bancos de Dados MySQL
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, --set-variable nome=opo
Fornece um valor a uma varivel. --help lista as variveis. Por favor, note que as sintaxes -
-set-variable=name=value e -O name=value esto obsoletas desde o MySQL 4.0,
use --nome=valor.
-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 mo-
do 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.
--protocol=(TCP | SOCKET | PIPE | MEMORY)
Especifica o protocolo de conexo usado. Novo no MySQL 4.1.
-q, --quick
No faz cache do resultado, imprime linha a linha. Isto pode deixar o servidor mais lento se a sa-
da for suspendida. No usa arquivo de histrico.
-r, --raw
Exibe valores de colunas sem converso de escapes. Utilizado com --batch
--reconnect
Administrao do Bancos de Dados MySQL
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.
-U, --safe-updates[=#], --i-am-a-dummy[=#]
Permite somente que UPDATE e DELETE utilizem chaves. Veja abaixo para maiores informa-
es sobre esta opo. Voc pode zerar esta opo se possui-la no arquivo my.cnf utilizando -
-safe-updates=0.
-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, no-
te 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 0 Nmero de seguntos antes de esgotar o tempo da conexo
local-infile 0 Disabilita (0) ou habilita (1) capacidade LOCAL para LOAD
Administrao do Bancos de Dados MySQL
318
DATA INFILE
max_allowed_packet 1677721
6
Tamanho mximo do pacote para enviar/receber do servidor
net_buffer_length 16384 Tamanho do buffer para comunicao TCP/IP e socket
select_limit 1000 Limite automtico para SELECT quando utilizar -
-safe-updtaes
max_join_size 1000000 Limite automtico para registros em uma join quando utilizar -
-safe-updtaes.
Se o cliente mysql perder a conexo com o servidor enquanto envia uma consulta, ele tentar se re-
conectar imediatamente e automaticamente uma vez e enviar a consulta novamente. Note que mes-
mo 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) Display this text.
? (\h) Synonym for `help'.
clear (\c) Clear command.
connect (\r) Reconnect to the server.
Optional arguments are db and host.
delimiter (\d) Set query delimiter.
edit (\e) Edit command with $EDITOR.
ego (\G) Send command to mysql server,
display result vertically.
exit (\q) Exit mysql. Same as quit.
go (\g) Send command to mysql server.
nopager (\n) Disable pager, print to stdout.
notee (\t) Don't write into outfile.
pager (\P) Set PAGER [to_pager].
Print the query results via PAGER.
print (\p) Print current command.
prompt (\R) Change your mysql prompt.
quit (\q) Quit mysql.
rehash (\#) Rebuild completion hash.
source (\.) Execute an SQL script file.
Takes a file name as an argument.
status (\s) Get status information from the server.
system (\!) Execute a system shell command.
tee (\T) Set outfile [to_outfile].
Administrao do Bancos de Dados MySQL
319
Append everything into given outfile.
use (\u) Use another database.
Takes database name as argument.
Os comandos edit, nopager, pager, e system funcionam apenas no Unix.
O comando status lhe fornece algumas informaes sobre a conexo e o servidor que est utili-
zando. Se voc estiver executando no modo --safe-updates, status ir tambm imprimir os
valores para as variveis mysql que afetam suas consultas.
Uma opo til para iniciantes (introduzido no MySQL verso 3.23.11) o --safe-updates (ou
--i-am-a-dummy para usurios que uma vez possam ter feito um DELETE FROM no-
me_tabela mas esqueceram da clusula WHERE). Quando utilizar esta opo, o mysql envia o
seguinte comando ao servidor MySQL quando abrir a conexo.
SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#,
SQL_MAX_JOIN_SIZE=#max_join_size#"
onde #select_limit# e #max_join size# so variveis que podem ser configuradas da li-
nha de comando mysql. See Seco 5.5.6, Sintaxe de SET.
O efeito da opo acima :
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 LI-
MIT:
UPDATE nome_tabela SET campo_nao_chave=# WHERE campo_nao_chave=# LIMIT 1;
Todos resultados maiores so limitados automaticamente a #select_limit# linhas.
SELECT's que provavelmente precisaro examinar mais que #max_join_size combinaoes
de linhas sero abortadas.
Algumas dicas teis sobre o cliente mysql:
Alguns dados so muito mais legveis quando exibido verticalmente, em vez da sada do tipo caixa
horizontal comum. Por exemplo: Textos longos, que incluem vrias linhas, so muito mais fceis de
serem lidos com sada vertical.
mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 lIMIT 300,1\G
*************************** 1. row ***************************
msg_nro: 3068
date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
reply: monty@no.spam.com
mail_to: "Thimble Smith" <tim@no.spam.com>
sbj: UTF-8
txt: >>>>> "Thimble" == Thimble Smith writes:
Thimble> Hi. I think this is a good idea. Is anyone familiar with UTF-8
Thimble> or Unicode? Otherwise, I'll put this on my TODO list and see what
Thimble> happens.
Yes, please do that.
Regards,
Monty
file: inbox-jani-1
hash: 190402944
1 row in set (0.09 sec)
Administrao do Bancos de Dados MySQL
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 nova-
mente o log reiniciado. Sem um parmetro o arquivo anterior ser usado. Perceba que tee ir atu-
alizar os resultados dentro do arquivo depois de cada comando, pouco antes da linha de comando re-
aparecer 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 op-
o tee pode ser utilizada, entretanto ela pode no ser cmoda como pager pode ser em algumas
situaes.
Algumas dicas sobre pager:
Voc pode us-lo para gravar em um arquivo:
mysql> pager cat > /tmp/log.txt
e os resultados iro somente para um arquivo. Voc tambm pode passar qualquer opes para
os programas que voc deseja utilizar com pager:
mysql> pager less -n -i -S
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 sa-
da 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 con-
tinuem 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 se-
guinte enviaria os resultados para dois arquivos em dois diferentes diretrios, em dois discos di-
ferentes 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
Administrao do Bancos de Dados MySQL
321
\v verso mysqld
\d banco de dados em uso
\h mquina na qual est conectado
\p porta na qual est conectado
\u nome do usurio
\U nome_usurio@maquina
\\ '\'
\n nova quebra de linha
\t tab
\ espao
\_ espao
\R hora no formato 24h (0-23)
\r hora no formato 12h (1-12)
\m minutos
\y ano com dois digitos
\Y ano com quatro digitos
\D formato completo da data
\s segundos
\w dia da semana no formato com 3 letras (Mon, Tue, ...)
\P am/pm
\o ms no formato de nmero
\O ms no formato com 3 letras (Jan, Feb, ...)
\c contador que cresce a cada comando
'\' 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:
Administrao do Bancos de Dados MySQL
322
mysql> prompt (\u@\h) [\d]>\_
PROMPT set to '(\u@\h) [\d]>\_'
(usuario@maquina) [banco de dados]>
(usuario@maquina) [banco de dados]> prompt
Returning to default PROMPT of mysql>
mysql>
4.9.3. mysqlcc, The MySQL Control Center
mysqlcc, o Centro de Controle do MySQL, um cliente independente de plataforma que fornece
um interface grfica ao usurio (GUI) para o servidor de banco de dados MySQL. Ela suporta uso
interativo, incluindo destaque de sintaxe e complementao com tab. Ele fornece gerenciamento de
banco de dados e tabelas e permite a administrao do servidor.
Atualmente, o mysqlcc executa em plataformas Windows e Linux.
mysqlcc no est includo com a distribuio MySQL, mas pode ser feito o download separada-
mente em http://www.mysql.com/downloads/.
mysqlcc suporta as seguintes opes:
-?, --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 es-
pao entre a opa e a senha.
Administrao do Bancos de Dados MySQL
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, no-
te 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 0 Number of seconds before connection timeout.
local-infile 0 Disable (0) or enable (1) LOCAL capability for LOAD DATA
Administrao do Bancos de Dados MySQL
324
INFILE
max_allowed_packet 1677721
6
Max packet length to send to/receive from server
net_buffer_length 16384 Buffer for TCP/IP and socket communication
select_limit 1000 Automatic limit for SELECT when using --safe-updtaes
max_join_size 1000000 Automatic limit for rows in a join when using -
-safe-updates
4.9.4. mysqladmin, Administrando um Servidor
MySQL
Um utilitrio para realizar operaes administrativas. A sintaxe :
shell> mysqladmin [OPES] comando [opo_do_comando] comando...
Voc pode obter uma lista das opo que sua verso do mysqladmin suporta executando mysq-
ladmin --help.
O mysqladmin atual suporta os seguintes comandos:
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
Administrao do Bancos de Dados MySQL
325
Checa se o mysqld est ativo.
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 Nmero de segundos que o servidor MySQL est funcionando.
Threads Nmero de threads ativas (clientes).
Questions Nmero de solicitaes dos clientes desde que o mysqld foi iniciado.
Slow queries Consultas que demoram mais que long_query_time segundos. See
Seco 4.10.5, O Log para Consultas Lentas.
Opens Quantas tabelas foram abertas pelo mysqld.
Flush tables Nmero de comandos flush..., refresh e reload.
Administrao do Bancos de Dados MySQL
326
Open tables Nmero de tabelas abertas atualmente.
Memory in use Memria alocada diretamente pelo cdigo do mysqld (disponvel somente
quando o MySQL compilado com --with-debug=full).
Max memory used Memria mxima alocada diretamente pelo cdigo do mysqld (disponvel
somente quando o MySQL compilado com --with-debug=full).
Se voc executa um mysqladmin shutdown em um socket (em outras palavras, em um compu-
tador 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.
4.9.5. mysqlbinlog, Executando as Consultas a Partir
de um Log Binrio
Voc pode examinad o arquivo de log binrio (see Seco 4.10.4, O Log Binrio) com o utilitrio
mysqlbinlog.
shell> mysqlbinlog hostname-bin.001
exibir todas as consultas contidas no log binrio hostname-bin.001, junto com outras infor-
maes (tempo da consulta, ID da thread que a executou, o timestamp de quando foi executada, etc).
Voc pode colocar a sada do mysqlbinlog em um cliente mysql; isto usado para recupera-
es de falhas quando voc tem um backup antigo (see Seco 4.5.1, Backups dos Bancos de Da-
dos):
shell> mysqlbinlog hostname-bin.001 | mysql
ou
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
Voc tambm pode redirecionar a sada do mysqlbinlog para um arquivo texto, ento modifique
este arquivo texto (para excluir as consultas que voc no quer executar por alguma razo), e ento
execute as consultas a partir do arquivo texto dentro do mysql.
mysqlbinlog possui a opo position=# que exibir apenas as consultas cujo offset no log
binrio maior ou igual a #.
Se voc tiver mais que um log binrio para executar no servidor MySQL, o mtodo seguro faz-lo
em uma nica conexo MySQL. Aqui est o que pode ser INseguro:
shell> mysqlbinlog hostname-bin.001 | mysql # DANGER!!
shell> mysqlbinlog hostname-bin.002 | mysql # DANGER!!
Isto causar problemas se o primeiro log binrio conter um CREATE TEMPORARY TABLE e o se-
gundo contm uma consulta que utiliza esta tabela temporria: quando o primeiro mysql termina,
ele apara a tabela temporria, assim a o segundo mysql relatar um ``tabela desconhecida''. Isto
ocorre porque voc deve executar todos os log binrios que voc deseja em uma nica conexo, es-
pecialmente se voc usa tabelas temporrias. Aqui esto dois modos possveis:
shell> mysqlbinlog hostname-bin.001 hostname-bin.002 | mysql
shell> mysqlbinlog hostname-bin.001 > /tmp/queries.sql
shell> mysqlbinlog hostname-bin.002 >> /tmp/queries.sql
shell> mysql -e "source /tmp/queries.sql"
Administrao do Bancos de Dados MySQL
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 carre-
gar (isto verdade para o MySQL 4.0; o MySQL 3.23 no grava o dado carregado em um log bin-
rio, 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 DA-
TA 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 bi-
nrio 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
4.9.6. Usando mysqlcheck para Manuteno de Tabe-
las e Recuperao em Caso de Falhas
Desde o MySQL verso 3.23.38 voc estar apto a usar a nova ferramenta de reparos e verificao
de tabelas MyISAM. A diferena para o myisamchk que o mysqlcheck deve ser usado quando
o servidor mysqld estiver em funcionamento, enquanto o myisamchk deve ser usado quando ele
no estiver. O benefcio que voc no precisar mais desligar o servidor mysqld para verificar ou
reparar suas tabelas.
O mysqlcheck utiliza os comandos do servidor MySQL CHECK, REPAIR, ANALYZE e OPTI-
MIZE de um modo conveniente para o usurio.
Existem trs modos alternativos de chamar o mysqlcheck:
shell> mysqlcheck [OPES] database [tabelas]
shell> mysqlcheck [OPES] --databases DB1 [DB2 DB3...]
shell> mysqlcheck [OPES] --all-databases
Pode ser usado de uma maneira muito similar ao mysqldump quando o assunto for quais bancos de
dados e tabelas devem ser escolhidas.
O mysqlcheck tem um recurso especial comparado comparado aos outros clientes; o comporta-
mento padro, verificando as tabelas (-c), pode ser alterado renomeando o binrio. Se voc deseja
ter uma ferramenta que repare as tabelas como o procedimento padro, voc deve copiar o mysql-
check para o disco com um outro nome, mysqlrepair, ou crie um link simblico com o nome
mysqlrepair. Se voc chamar mysqlrepair agora, ele ir reparar as tabelas como seu proce-
dimento padro.
Os nomes que podem ser utilizados para alterar o comportamento padro do mysqlcheck so:
mysqlrepair: A opo padro ser -r
mysqlanalyze: A opo padro ser -a
mysqloptimize: A opo padro ser -o
As opes disponveis para o mysqlcheck esto listadas aqui, por favor verifique o que a sua ver-
so suporta com o mysqlcheck --help.
-A, --all-databases
Verifica todos os bancos de dados. Isto o mesmo que --databases com todos os bancos de da-
dos selecionados.
Administrao do Bancos de Dados MySQL
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 de-
pois 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 fe-
chada 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 li-
nhas de lixo.
Administrao do Bancos de Dados MySQL
329
-h, --host=...
Conecta mquina.
-m, --medium-check
Mais rpido que verificao extendida, mas encontra somente 99.99 de todos os erros. Deve re-
solver 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 er-
rados. 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.
4.9.7. mysqldump, Descarregando a Estrutura de Tabe-
las e Dados
Utilitrio para descarregar um banco de dados ou uma coleo de bancos de dados para backup ou
transferencia para outro servidor SQL (No necessariamente um servidor MySQL). A descarga ir
Administrao do Bancos de Dados MySQL
330
conter instrues SQL para cria a tabela e/ou popular a tabela.
Se a idia backup do servidor, deve ser considerada a utilizao do mysqlhotcopy. See Sec-
o 4.9.8, mysqlhotcopy, Copiando Bancos de Dados e Tabelas do MySQL.
shell> mysqldump [OPES] banco_de_dados [tabelas]
OR mysqldump [OPES] --databases [OPES] BD1 [BD2 BD3...]
OR mysqldump [OPES] --all-databases [OPES]
Se voc no fornecer nenhuma tabela ou utilizar o --databases ou --all-databases, to-
do(s) o(s) banco(s) de dados ser(o) descarregado(s).
Voc pode obter uma lista das opes que sua verso do mysqldump suporta executando mysql-
dump --help.
Perceba que se voc executar o mysqldump sem a opo --quick ou --opt, o mysqldump ir
carregar todo o conjunto do resultado na memria antes de descarregar o resultado. Isto provavel-
mente ser um problema se voc est descarregando um banco de dados grande.
Note que se voc estiver utilizando uma cpia nova do programa mysqldump e se voc for fazer
uma descarga que ser lida em um servidor MySQL muito antigo, voc no deve utilizar as opes
--opt ou -e.
mysqldump suporta as seguintes opes:
--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 ta-
bela fornecida. Todos argumentos so estimados como nomes de bancos de dados. USE no-
me_bd; ser includo na sada antes de cada banco de dados novo.
--delayed
Administrao do Bancos de Dados MySQL
331
Insere registros com o comando INSERT DELAYED.
-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 correspon-
dentes 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 loca-
lhost.
-l, --lock-tables.
Bloqueia todas as tabelas antes de iniciar a descarga. As tabelas so bloqueadas com READ LO-
CAL 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 se-
jam logicamente consistentes entre os banco de dados. Tabela me diferentes bancos de dados po-
dem ser descarregadas em estados completamente diferentes.
-K, --disable-keys
/*!40000 ALTER TABLE nome_tb DISABLE KEYS */; e /*!40000 ALTER TA-
BLE nome_tb ENABLE KEYS */; ser colocado na sada. Isto far com que a carga de da-
dos no MySQL 4.0 server seja mais rpida j que os ndices so criados depois que todos os da-
dos 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
Administrao do Bancos de Dados MySQL
332
No grava nenhuma informao de registros para a tabela. Isto muito til se voc desejar ape-
nas 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 mo-
do 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 mutualmen-
te exclusiva com a opo --lock-tables j que LOCK TABLES j faz um commit da tran-
sao 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. Vo-
c 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
Administrao do Bancos de Dados MySQL
333
permisso para criar/gravar um arquivo no local especificado.
-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 sinta-
xe --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 ti-
ver configurado o seu slave usando este dump SQL do master.
-O net_buffer_length=#, where # < 16M
Quando estiver criando instrues de inseres em mltiplas linhas (com a opo -
-extended-insert ou --opt), mysqldump ir criar linhas at o tamanho de
net_buffer_length. Se voc aumentar esta varivel, voc tambm deve se assegurar que a
varivel max_allowed_packet no servidor MySQL maior que a
net_buffer_length.
O uso mais comum do mysqldump provavelmente para fazer backups de bancos de dados intei-
ros. 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
Administrao do Bancos de Dados MySQL
334
mysql -e "source /path-to-backup/backup-file.sql" database
Entretanto, muito til tambm popular outro servidor MySQL com informaes de um banco de
dados:
mysqldump --opt banco_dados | mysql ---host=mquina-remota -C banco_dados
possvel descarregar vrios bancos de dados com um comando:
mysqldump --databases banco_dados1 [banco_dados2 banco_dados3...] > meus_bancosdedados.sql
Se desejar descarregar todos os bancos de dados, pode-se utilizar:
mysqldump --all-databases > todos_bancos_dados.sql
4.9.8. mysqlhotcopy, Copiando Bancos de Dados e
Tabelas do MySQL
O mysqlhotcopy um script perl que utiliza LOCK TABLES, FLUSH TABLES e cp ou scp
para fazer um backup rpido de um banco de dados. a maneira mais rpida para fazer um backup
do banco de dados e de algumas tabelas mas ele s pode ser executado na mesma mquina onde os
diretrios dos bancos de dados esto. O mysqlhotcopy s funciona no Unix e apenas para as ta-
belas MyISAM e ISAM.
mysqlhotcopy nome_bd [/caminho/para/novo_diretrio]
mysqlhotcopy nome_bd_2 ... nome_bd_2 /caminho/para/novo_diretrio
mysqlhotcopy nome_bd./regex/
mysqlhotcopy suporta as seguintes opes:
-?, --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
Administrao do Bancos de Dados MySQL
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, privil-
gio SELECT nas tabelas que desejar copiar e o privilgio Reload no MySQL (para poder executar
FLUSH TABLES).
4.9.9. mysqlimport, Importando Dados de Arquivos
Texto
mysqlimport fornece uma interface de linha de comando para a instruo SQL LOAD DATA
INFILE. A maioria das opes aceitas correspondem diretamente s opes de LOAD DATA IN-
FILE. See Seco 6.4.8, Sintaxe LOAD DATA INFILE.
mysqlimport chamado desta maneira:
shell> mysqlimport [opes] banco_de_dados arquivo_texto1 [arquivo_texto2....]
Administrao do Bancos de Dados MySQL
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 se-
ro 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 processan-
do 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 servi-
dor se voc conectar localhost (mquina padro).
Administrao do Bancos de Dados MySQL
337
-pyour_pass, --password[=sua_senha]
Senha para conectar ao servidor. Se voc no especificar a parte '=sua_senha', o mysqlim-
port ir pedir por uma senha.
-P port_num, --port=port_num
O nmero da porta TCP/IP para usar quando conectar a uma mquina.
--protocol=(TCP | SOCKET | PIPE | MEMORY)
Para especificar o protocolo de conexo. Novo no MySQL 4.1.
-r, --replace
As opes --replace e --ignore controlam o tratamento de registros de entrada que dupli-
cam 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.
Abaixo um exemblo da utilizao de mysqlimport:
$ mysql --version
mysql Ver 9.33 Distrib 3.22.25, for pc-linux-gnu (i686)
$ uname -a
Linux xxx.com 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown
$ mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test
$ ed
a
100 Max Sydow
101 Count Dracula
.
w imptest.txt
32
q
$ od -c imptest.txt
0000000 1 0 0 \t M a x S y d o w \n 1 0
0000020 1 \t C o u n t D r a c u l a \n
0000040
$ mysqlimport --local test imptest.txt
test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
Administrao do Bancos de Dados MySQL
338
$ mysql -e 'SELECT * FROM imptest' test
+------+---------------+
| id | n |
+------+---------------+
| 100 | Max Sydow |
| 101 | Count Dracula |
+------+---------------+
4.9.10. mysqlshow, Exibindo Bancos de Dados, Tabe-
las e Colunas
mysqlshow pode ser usado para exibir rapidamente quais bancos de dados existem, suas tabelas, e
o nome das colunas da tabela.
Como o programa mysql voc pode obter as mesmas informaes com comandos SHOW. See Sec-
o 4.6.8, Sintaxe de SHOW.
mysqlshow chamado assim:
shell> mysqlshow [OPES] [banco_dados [tabela [coluna]]]
Se nenhum banco de dados fornecido, todos os bancos de dados encontrados so exibidos.
Se nenhuma tabela fornecida, todas as tabelas encontradas no banco de dados so exibidas.
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 tabe-
las/colunas apropriadamente. '*' so convertidos em metacaracteres '%' do SQL e '?' em metacarac-
teres '_' 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 argu-
mento separador).
4.9.11. mysql_config, Opes para compilao do
cliente MySQL
mysql_config lhe fornece informao til sobre como compilar o seu cliente MySQL e conect-
lo ao MySQL.
mysql_config suporta as seguintes opes:
--cflags
Parmetros de compilao para encontrar arquivos includos e parmetros e definies de com-
piladores 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)
Administrao do Bancos de Dados MySQL
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 -lnsl -lm -L/usr/lib -lssl -lcrypto]
--libs_r [-L/usr/local/mysql/lib/mysql -lmysqlclient_r -lpthread -lz -lcrypt -lnsl -lm -lpthread]
--socket [/tmp/mysql.sock]
--port [3306]
--version [4.0.16]
--libmysqld-libs [-L/usr/local/mysql/lib/mysql -lmysqld -lpthread -lz -lcrypt -lnsl -lm -lpthread -lrt]
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`"
4.9.12. perror, Explicando Cdigos de Erros
Para a maioria dos erros de sistema o MySQL ir, em adio a uma mensagem de texto interna, im-
primir tambm o cdigo de erro do sistema em um dos seguintes estilos: message ...
(errno: #) ou message ... (Errcode: #).
Voc pode descobrir o que o cdigo de erro significa exeminando a documentao para o seu siste-
ma ou usar o utilitrio perror.
perror exibe a descrio para um cdigo de erro do sistema, ou um cdigo de erro do mecanismo
de armazenamento MyISAM/ISAM (handler de tabela).
perror utilizado assim:
shell> perror [OPES] [CDIGO_ERRO [CDIGO_ERRO...]]
Exemplo:
shell> perror 13 64
Error code 13: Permission denied
Administrao do Bancos de Dados MySQL
340
Error code 64: Machine is not on the network
Note que a mensagem de erro s ona maioria dependente do sistema!
4.9.13. Como Executar Comandos SQL a Partir de um
Arquivo Texto
O cliente mysql normalmente usado de maneira interativa, desta forma:
shell> mysql banco_dados
Entretanto, tambm possvel colocar seus comandos SQL em um arquivo e dizer ao mysql para
ler a entrada a partir deste arquivo. Para fazer isto, crie um arquivo texto arquivo_texto conten-
do os comandos que voc deseja executar. Ento execute o mysql como exibido abaixo:
shell> mysql banco_dados < arquivo_texto
Voc tambm pode iniciar seu arquivo texto com uma instruo USER nome_bd. Neste caso, no
necessrio especificar o nome do banco de dados na linha de comando:
shell> mysql < arquivo_texto
Se voc j est executando o mysql, voc pode executar um arquivo de script SQL usando o co-
mando source:
mysql> source filename;
Para mais informaes sobre o modo batch, Seco 3.5, Utilizando mysql em Modo Batch.
4.10. Os Arquivos de Log do MySQL
O MySQL tem vrios arquivos de log diferentes que podem ajud-lo a descobrir o que est aconte-
cendo dentro do mysqld:
Log file Description
O log de erros Problemas encontrados iniciando, executando ou parando o mysqld.
O log isam Documenta todas alteraes a tabelas ISAM. Usado somente para depurao
do cdigo isam.
O log de consultas Conexes estabelecidas e consultas executadas.
O log de atualiza-
es
Desatulizado: Armazena todas as instrues que alteram dados.
O log binrio Armazena todas as instrues que alteram qualquer coisa. Usada tambm para
replicao.
O log para consul-
tas lentas
Armazena todas queries que levaram mais de long_query_time segundos
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.
4.10.1. O Log de Erros
Administrao do Bancos de Dados MySQL
341
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 fina-
lizou. 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 Win-
dows.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 escri-
to em stderr (o terminal).
No Windows a sada sempre feita no arquivo .err se --console no for utilizado.
4.10.2. O Log de Consultas
Se voc deseja saber o que acontece com mysqld, voc deve inici-lo com a opo -
-log[=arquivo]. Isto ir documentar todas conexes e consultas no arquivo log (por padro no-
meado 'nome_mquina'.log). Este log pode ser muito til quando voc suspeitar de um erro
em um cliente e deseja saber exatamente o que o mysqld acha que o cliente enviou.
Older versions of the mysql.server script (from MySQL 3.23.4 to 3.23.8) pass mysqld_safe
a --log option (enable general query log). If you need better performance when you start using
MySQL in a production environment, you can remove the --log option from mysql.server or
change it to --log-bin. See Seco 4.10.4, O Log Binrio.
Verses mais antigas do script mysql.server (MySQL 3.23.4 a 3.23.8) passam ao sa-
fe_mysql uma opo --log (habilita a log de consulta geral). Se voc precisar melhorar a per-
formance quando iniciar o uso do MySQL em um ambiente de produo, pode remover a opo -
-log do mysql.server ou alter-lo para --log-bin. See Seco 4.10.4, O Log Binrio.
As entradas neste log so escritas quando o mysqld recebe as questes. Pode estar diferente da or-
dem em que as instrues so executadas. Isto est em contraste com o log de atualizaes e o log
binrio nos quais as consultas so escritas depois de serem executadas, mas que quaisquer travas se-
jam liberadas.
4.10.3. O Log de Atualizaes
NOTA: O log de atualizaes est obsoleto e foi substitudo pelo log binrio. See Seco 4.10.4, O
Log Binrio. O log binrio pode fazer qualquer coisa que poderia ser feito com o log de atualiza-
es, e mais. O log de atualizao ser removido no MySQL 5.0
Quando iniciado com a opo --log-update[=nome_arquivo], o mysqld grava um arqui-
vo log contendo todos os comandos SQL que atualizam dados. Se nenhum arquivo for fornecido, o
nome da mquina usado. Se um nome de arquivo for fornecido, mas no possuir o caminho, o ar-
quivo gravado no diretrio de dados. Se nome_arquivo no possuir uma extenso, o mysqld
ir criar os arquivos com os nomes desta forma: nome_arquivo.###, onde ### um nmero
que incrementado cada vez que mysqladmin refresh , mysqladmin flush-logs ou a
instruo FLUSH LOGS forem executados ou o servidor for reiniciado.
Administrao do Bancos de Dados MySQL
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 arqui-
vo 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 or-
dem 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 no-
me_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 refa-
zer as atualizaes que ocorreram entre a hora do backup e a falha.
4.10.4. O Log Binrio
O log binrio deve substituiu o log de atualizaes. O log de atualizaes ser removido do MySQL
5.0. O log binrio contm toda informao que est disponvel no log de atualizaes em um forma-
to mais eficiente e de maneira transacionalmente segura.
O log binrio, como o antigo log de atualizao, apenas registra instrues que realmente atualizam
os dados. Assim um UPDATE ou um DELETE com um WHERE que no encontra nenhum registro
no gravado no log. Ele ignora mesmo instrues UPDATE que definam a uma coluna um valor
que ela j tenha.
O propsito principal do log binrio poder atualizar o banco de dados durante uma operao de
restaurao de forma mais completa possvel, j que o log binrio conteria todas as atualizaes fei-
tas depois que um backup foi realizado.
O log binrio tambm usado para replicar um mysqld slave a partir de um master. See Sec-
o 4.11, Replicao no MySQL.
O log binrio tambm contm informao sobre o tempo que cada consulta leva para atualizar o
banco de dados. Ele no contm consultas que no modificam dados. Se voc quiser registrar todas
as consultas (por exemplo, para encontrar um consulta com problema) voc deve usar o log geral de
consultas. See Seco 4.10.2, O Log de Consultas.
Quando iniciado com a opo --log-bin[=nome_arquivo], o mysqld escreve um arquivo
de log contendo todos comandos SQL que atualizam dados. Se nenhum arquivo for fornecido, ele
aponta para o nome da mquina seguido de -bin. Se for fornecido o nome do arquivo, mas ele no
tiver o caminho, o arquivo escrito no diretrio de dados.
Administrao do Bancos de Dados MySQL
343
Se voc fornecer uma extenso --log-bin=nome_arquivo.extenso, a extenso ser re-
movida 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 au-
tomaticamente 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 Sec-
o 4.6.5, Sintaxe de RESET), ou apenas alguns deles com PURGE MASTER LOGS (see Sec-
o 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 bin-
rio (tenha certeza de ler as notas que seguem esta tabela):
Opo Descrio
binlog-
do-db=nome_banco_dados
Diz ao master que ele deve registrar atualizaes no log bi-
nrio se o banco de dado atual (ex.: aquele selecionado por
USE) 'nome_banco_dados'. Todos os outros bancos de da-
dos que no forem explicitamente mencionados so ignora-
dos. 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 ini-
ciado com binlog-do-db=sales, e voc fizer USE
prices; UPDATE sales.january SET amo-
unt=amount+1000;, esta consulta no ser gravada no
log binrio.
binlog-igno-
re-db=nome_banco_dados
Diz ao master que atualizaes onde o banco de dados atual
(ex.: aquele selecionado com USE) 'nome_banco_dados'
no deve ser gravado no log binrio. Note que se voc usar
esta opo voc deve ter certeza que voc s faz atualizaes
no banco de dados atual. (Exemplo: binlog-igno-
re-db=algum_banco_dados) Exemplo do que no fun-
ciona como voc poderia esperar: se o servidor iniciado
com binlog-do-db=sales, e voc fizer USE pri-
ces; UPDATE sales.january SET amo-
unt=amount+1000;, esta consulta ser gravada no log
binrio.
As regras esto avaliadas na seguinte ordem, para decidir se a consulta deve ser escrita no log bin-
rio ou no:
1. Existem as regras binlog-do-db ou binlog-ignore-db?
No: grave a consulta no log binrio e saia.
Sim: V para o passo abaixo.
2. Ento existe algumas regras (binlog-do-db ou binlog-ignore-db ou ambos). Existe
um banco de dados atual (algum banco de dados foi selecionado com USE?)?
No: NO grave a consulta e saia.
Sim: v para o passo abaixo.
3. Existe um banco de dados. Existe alguma regra binlog-do-db?
Administrao do Bancos de Dados MySQL
344
Sim: O banco de dados atual se encaixa em qualquer uma das regras binlog-do-db?
Sim: grave a consulta e saia.
No: NO grave a consulta e saia.
No: V para o passo abaixo.
4. Existem algumas regras binlog-ignore-db. O banco de dados atual se encaixa em qual-
quer uma das regras binlog-ignore-db?
Sim: no grave a consulta e saia.
No: grave a consulta e saia.
Ento, por exemplo, um slave em execuo com apenas binlog-do-db=sales no gravar no
log binrio qualquer consulta em que o banco de dados atual diferente de sales (em outras pala-
vras, binlog-do-db pode, significar algumas vezes, ``ignore outros bancos de dados'').
Para saber quais arquivos binrios foram usados, o mysqld ir criar tambm um arquivo de ndice
para o log binrio que contm o nome de todos os arquivos de log binrio usados. Por padro este
arquivo tem o mesmo nome que o arquivo de log binrio, com a extenso '.index'. Voc pode
alterar o nome do arquivo de ndice do log binrio com a opo -
-log-bin-index=[nome_arquivo]. Voc no deve eduitar este arquivo manualmente en-
quanto o mysqld estiver em execuo; fazer isto confundiria o mysqld.
Se estiver sendo usado replicao, os arquivos de log binrio antigos no devem ser apagados at ter
certeza que nenhum slave ir mais precisar deles. Uma forma de fazer isto o utilizar mysqlad-
min flush-logs uma vez por dia e ento remover qualquer log com mais de 3 dias. Voc pode
remov-los manualmente, ou de preferncia usando PURGE MASTER LOGS (see Seco 4.11.7,
Instrues SQL para Controle do Servidor Master) o qual atualizar de forma segura o arquivo de
ndice do log binrio para voc (e que pode ter um argumento de data desde o MySQL 4.1)
Uma conexo com o privilgio SUPER pode desabilitar o registro no log binrio de suas consultas
usando SET SQL_LOG_BIN=0. See Seco 4.11.7, Instrues SQL para Controle do Servidor
Master.
Voc pode examinar o arquivo de log binrio com o utilitrio mysqlbinlog. Por exemplo, voc
pode atualizar um servidor MySQL a partir de um log binrio como mostrado a seguir:
mysqlbinlog arquivo-log | mysql -h nome_servidor
Veja Seco 4.9.5, mysqlbinlog, Executando as Consultas a Partir de um Log Binrio para
mais informaes sobre o utilitrio mysqlbinlog e como utiliz-lo.
mysqlbinlog --help ir lhe fornecer mais informaes de como usar este programa!
Se voc estiver utilizando BEGIN [WORK] ou SET AUTOCOMMIT=0, voc deve utilizar o log bi-
nrio do MySQL para backups no lugar do antigo log de atualizao.
O Log binrio feito imedatamente depois que uma consulta terminar mas antes que os bloqueios
sejam liberados ou algum commit seja feito. Isto garante que o log seja feito na ordem de execuo.
Atualizaes em tabelas no transacionais so armazenadas o log binrio imediatamentedepois da
execuo. Para tabelas tranascionais como BDB ou InnoDB, Todas atualizaes (UPDATE, DELE-
TE ou INSERT) que alteram uma tabela transacional so armazenadas no cache at um COMMIT.
Quaisquer atualizaes a uma tabela no transacional so armazenadas no log binrio de uma vez.
Todas as threads iro, no incio, alocar um buffer de binlog_cache_size para registrar consul-
tas. Se uma conaulta maior que o registro, a thread ir criar um arquivo temporrio para lidar com
a mesma. O arquivo temporrio ser apagado quando a thread terminar.
Administrao do Bancos de Dados MySQL
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.
4.10.5. O Log para Consultas Lentas
Quando iniciado com a opo --log-slow-queries[=file_name] o mysqld escreve em
um arquivo log contendo todos os comandos SQL que levam mais de long_query_time segun-
dos para executar. O tempo para obter os bloqueios de tabelas iniciais no so contados como tempo
de execuo.
O log de consultas lentas gerado depois que uma query executada e depois de todas as bloqueios
serem liberados. Ela pode estar em ordem diferente da que as instrues foram executadas.
Se nenhum nome de arquivo for fornecido, o padro o nome da mquina com o sufixo -
slow.log. Se um nome de arquivo for especificado, mas no conter o caminho, o arquivo grava-
do no diretrio de dados.
O log para queries lentas pode ser usado para encontrar queries que levam muito tempo para execu-
tar e que devem ser candidatas a otimizao. Com um log muito grande, isto pode ser uma tarefa di-
fcil. Voc pode utilizar o log de consultas lentas atravs do comando mysqldumpslow para obter
um resumo das consultas que aparecem no log.
Se a opo --log-long-format estiver sendo usada, ento as consultas que no estiverem utili-
zando ndices sero escritas. See Seco 4.1.1, Opes de Linha de Comando do mysqld.
4.10.6. Manuteno do Log de Arquivo
O MySQL tem vrios arquivos de log que possibilitam ver o que est ocorrendo com mais facilida-
de. See Seco 4.10, Os Arquivos de Log do MySQL. Porm de tempos em tempos deve ser feita
uma limpeza nos arquivos de logs do MySQL para que eles no ocupem muito do espao do disco.
Ao utilizar o MySQL com arquivos log, voc necessitar de tempos em tempos remover antigos ar-
quivos de log e dizer ao MySQL para logar com novos arquivos. See Seco 4.5.1, Backups dos
Bancos de Dados.
Em uma instalao Linux RedHat), voc pode usar o script mysql-log-rotate para isto. Se
voc instalou o MySQL de uma distribuio RPM, o script deve ter sido instalado automaticamente.
Perceba que voc deve ter cuidado com este script se voc estiver utilizando o log binrio para repli-
cao!
Em outros sistemas voc deve instalar um pequeno script que ser executado pelo cron para lidar
com os arquivos de log.
Voc pode forar o MySQL a iniciar utilizando novos arquivos de log usando mysqladmin
flush-logs ou utlizando o comando SQL FLUSH LOGS. Se voc usa o MySQL Verso 3.21
deve utilizar o comando mysqladmin refresh.
O comando acima faz o seguinte:
Se o log padro (--log) ou log de consultas lentas (--log-slow-queries) forem utiliza-
dos, fecha e reabre o arquivo de log. (mysql.log e `hostname`-slow.log como pa-
dro).
Se o log de atualizao (--log-update) usado, fecha o log de atualizao e abre um novo
arquivo log com uma sequncia numrica mais alta.
Administrao do Bancos de Dados MySQL
346
Se voc s estiver utilizando o log de atualizao, voc tem apenas que atualizar os logs e ento mo-
ver 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. Replicao no MySQL
Capacidades de replicao permitidindo que os bancos de dados em um servidor MySQL seja dupli-
cado em outro foram introduzidos no MySQL verso 3.23.15. Esta seo descreve os vrios recur-
sos da replicao no MySQL. Ele serve como uma referncia para as opes disponveis na replica-
o. Voc ser introduzido a replicao e aprender como implement-la. Em direo ao final, exis-
tem algumas questes mais perguntadas (FAQ), descries de problemas e como resolv-los.
Sugeriemos que voc visite nosso website em http://www.mysql.com/ frequentemente e leia as atua-
lizaes desta seo. A replicao esta constantemente sendo melhorada e ns atualizamos o manual
frequentemente com a informao mais atual.
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 rea-
lizadas no servidor master. Seno, voc sempre deve ter cuidados para evitar conflitos entre as atua-
lizaes 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 robustez aumentada com uma configurao master/slave. No evento de problemas com o
master, voc pode trocar para o slave como um backup.
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 SE-
LECT 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 fazen-
do backups no slave em vez de faz-los no master. See Seco 4.5.1, Backups dos Bancos de
Dados.
4.11.2. Viso Geral da Implementao da Replicao
A replicao no MySQL baseia-se no fato do servidor master manter o registro de todas as altera-
es de seus bancos de dados (atualizaes, delees, etc) no log binrio. (see Seco 4.10.4, O
Log Binrio). Cada servidor slave recebe do master consultas salvas no log binrio, para que assim
Administrao do Bancos de Dados MySQL
347
execute as mesmas consultas nos seus dados replicados.
muito importante entender que o log binrio simplesmente um registro iniciando a partir de um
ponto fixo no tempo (o momento que voc habilitou o log binrio). Quaisquer slaves que voc con-
figure necessitar de cpias do banco de dados do seu master como eles existiam no momento em
que o log binrio foi habilitado no master. Se voc iniciar os slaves com dados diferentes daqueles
do master quando o log binrio foi iniciado, seus slaves falharo.
A seguinte tabela indica a compatibilidade de replicao master/slave entre diferentes verses do
MySQL.
Master Master Master Master
3.23.33 e posteri-
or
4.0.0 4.0.1 4.0.3 e posterior
Slave 3.23.33 e posteri-
or
sim 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 replica-
o.
Note qye quando voc atualiza um mestre do MySQL 3.23 para o MySQL 4.0 (ou 4.1) voc no de-
ve 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. Bloqueie todas as atualizaes no mestre (FLUSH TABLES WITH READ LOCK).
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 execu-
te STOP SLAVE nos slaves.
3. Finalize o MySQL no master e atualize o master para o MySQL 4.0.
4. Reinicie o MySQL no master. Grave o nome <name> do log binrio mais recentemente 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. Es-
teja 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 im-
plementarmos 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 con-
junto de dados de master for relativamente pequeno, ou se um lock de leitura prolongado no master
aceitvel. Enquanto a velocidade atual do LOAD DATA FROM MASTER pode variar de sistema
Administrao do Bancos de Dados MySQL
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 co-
nectividade com seu master, ele tentar conectar periodicamente at conseguir reconectar e consti-
nuar 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.
4.11.3. Detalhes de Implementao da Replicao
Trs threads esto envolvidas na replicao: uma no master e duas no slave. Quando START SLA-
VE executado, a thread de E/S criada no slave. Ela se conecta ao master e pede pelo envio de
seus logs binrios. Ento uma thread (chamada Binlog dump no SHOW PROCESSLIST no mas-
ter) criada no master para enviar estes logs binrios. A thread de E/S l o que o Binlog dump
envia e simplesmente a copia para algum arquivo local no diretorio de dados do slave chamado relay
logs. A ltima thread, a thread de SQL, criada no slave; ela l o relay logs e executa as consultas
contidas nele.
Note que o master tem uma thread para cada servidor slave atualmente conectado.
Com SHOW PROCESSLIST voc pode saber o que est acontecendo no master e no slave em rela-
o a replicao.
O exemplo seguinte ilustra como as trs threads aparecem em SHOW PROCESSLIST. O formato
da sada aquele usado por SHOW PROCESSLIST a partir do MySQL verso 4.0.15, quando o
contedo da coluna State foi alterado para ser mais significativo comparado com verses altera-
es.
No servidor master a sada se parece com isto:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 2
User: root
Host: localhost:32931
db: NULL
Command: Binlog Dump
Time: 94
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
No servidor slave, a sada se parece com isto:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 10
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 11
User: system user
Host:
db: NULL
Command: Connect
Administrao do Bancos de Dados MySQL
349
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 mas-
ter (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 Bin-
log Dump do master. Se voc no ver estas threads em um servidor master, a replicao no est
sendo executada.
Sending binlog event to slave
Logs binrios consistem de eventos, onde um evento normamente uma consulta mais alguma
informao. A thread l um evento do log binrio e ele enviado para o slave.
Finished reading one binlog; switching to next binlog
A thread finalizou a leitura de um log binrio e est abrindo o seguinte a ser enviado para o sla-
ve.
Has sent all binlog to slave; waiting for binlog to be updated
A thread leu todos os log binrios e est inativa. Ela est esperando por conexes no master para
gravar mais dados no log binrio, se ele quiser.
Waiting to finalize termination
Estado muito breve que ocorre quando a thread para.
Aqui esto os estados mais comuns que voc ver na coluna State para a thread de E/S de um ser-
vidor 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.
Checking master version.
Estado muito breve que ocorre um pouco depois da conexo ser estabelecida.
Registering slave on master.
Estado muito breve que ocorre um pouco depois da conexo ser estabelecida.
Requesting binlog dump.
Estado muito breve que ocorre um pouco depois da conexo com o master ser estabelecida. A
thread envia ao master um pedido para envio do contedo de seu log binrio, iniciando a partir
do log binrio requisitado e sua posio.
Waiting to reconnect after a failed binlog dump request.
Se o pedido de dump do log binrio falhar (devido a desconexo), a thread fica neste estado en-
quanto est inativa. A thread fica inativa por master-connect-retry segundos antes de
uma nova tentativa.
Reconnecting after a failed binlog dump request.
Administrao do Bancos de Dados MySQL
350
Ento a thread tenta se conectar com o master.
Waiting for master to send event.
A thread conectou e est esperando que os eventos do log binrio cheguem. Isto pode demorar
se o master estiver inativo. Se a espera for maior que slave_read_timeout segundos, o
tempo se esgotar. Neste ponto, a thread ir considerar a conexo quebrada e far uma nova ten-
tativa de conexo.
Queueing master event to the relay log.
A thread leu o evento e o est copiando para o ser relay log para que a thread SQL possa proces-
s-lo
Waiting to reconnect after a failed master event read.
Um erro ocorreu durante a leitura (devido a desconexo); inativo por master-con-
nect-retry segundos antes de tentar se reconectar.
Reconnecting after a failed master event read.
Ento a thread tenta se reconectar. Quando a conexo estabelecida novamente, o estado se tor-
nar Waiting for master to send event.
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 de-
letar alguns arquivos de relay logs.
Waiting for slave mutex on exit.
Estado muito breve que ocorre quando a thread esta parando.
Aqui esto os estado mais comuns que voc ver na coluna State para a thread de SQL de um ser-
vidor slave:
Reading event from the relay log
A thread leu um evento do relay log para poder process-lo.
Has read all relay log; waiting for the slave I/O thread to up-
date 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.
Waiting for slave mutex on exit.
Estado muito breve que ocorre quando a thread parada.
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 exe-
cuo da consulta for lento. Por exemplo, se o servidor slave no estiver em execuo por um ins-
tante, a sua thread de E/S pode rapidamente buscar todos o contedo dos logs binrios do master
Administrao do Bancos de Dados MySQL
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 finalmen-
te 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 apaga-
dos 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 atualmen-
te 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 ro-
taciona 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.)
Uma instruo FLUSH LOGS executada (a partir da verso 4.0.14).
O tamanho do relay log atual se torna muito grande. O significado de ``muito grande'' determi-
nado da seguinte forma:
max_relay_log_size, se max_relay_log_size > 0
max_binlog_size, se max_relay_log_size = 0 ou o MySQL mais velho que
4.0.14
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 dis-
cos, 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-
nh
a
Descrio
1 Master_Log_File
2 Read_Master_Log_Pos
3 Master_Host
4 Master_User
5 Senha (no mostrado por SHOW SLAVE STATUS)
6 Master_Port
7 Connect_Retry
Administrao do Bancos de Dados MySQL
352
O arquivo relay-log.info atualizada pela thread de SQL. A correspondncia entre as linhas
do arquivo e as colunas mostradas por SHOW SLAVE STATUS apaerece a seguir:
Li-
nh
a
Descrio
1 Relay_Log_File
2 Relay_Log_Pos
3 Relay_Master_Log_File
4 Exec_Master_Log_Pos
Quando voc faz backup dos dados de seu slave, voc deve fazer backup destes 2 pequenos arqui-
vos, 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 relay-
log.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 MAS-
TER_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 pro-
psito. 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 pa-
dro, se no especificado, o valor da varivel tmpdir.
4.11.4. Como Configurar a Replicao
Aqui est uma descrio rpida de como configurar uma replicao completa em seu servidor
MySQL atual. Ele assume que voc deseja replicar todos os bancos de dados e nunca configurou
uma replicao anteriormente. Voc precisar desligar seu servidor master rapidamente para com-
pletar os passos delineados abaixo.
O procedimento gravado para a configurao de um nico slave, mas voc pode us-lo para confi-
gurar vrios slaves.
Este mtodo o modo mais direto de se configurar um slave, mas ele no o nico. Por exemplo, se
voc j tem uma cpia instantnea dos dados do master, e o master j tem o seu ID do servidor defi-
nido e o log binrio habilitado, voc pode configurar um slaver sem desligar o master ou mesmo
bloquear suas atualizaes. Para maiores detalhes, veja Seco 4.11.9, FAQ da Replicao.
Se voc deseja administrar uma configurao de replicao MySQL, sugerimos que leia todo este
captulo e experimente todos os comandos mencionados em Seco 4.11.7, Instrues SQL para
Controle do Servidor Master e Seco 4.11.8, Instrues SQL para Controle do Servidor Slave.
Voc tambm deve se familiarizar com as opes de inicializao da replicao em my.cnf na
Seco 4.11.6, Opes de Inicializao da Replicao.
Note que este procedimento e algumas das instrues SQL da replicao em sees posteriores se
referrem ao privilgio SUPER. Antes do MySQL 4.0.2, use o privilgio PROCESS.
1. 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 Sec-
o 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 lti-
ma distribuio.
2. Configure uma conta no servidor master com o com a qual o slave possa se conectar. Deve ser
Administrao do Bancos de Dados MySQL
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 recomen-
dvel), 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:
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY '<password>';
Para verses do MySQL anteriores a 4.0.2, use este comando:
mysql> GRANT FILE ON *.* TO repl@'%' IDENTIFIED BY '<password>';
Se voc planeja usar as instrues LOAD TABLE FROM MASTER ou LOAD DATA FROM
MASTER a partir da mquina slave, voc precisar de permisso para esta conta adicional.
Conceda a conta os privilgios globais SUPER e RELOAD.
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.
3. 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, Powe-
rArchiver, WinRAR, WinZip ou qualquer outro software similar no Windows) para produ-
zir 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, al-
tere a localizao em um diretrio de dados do slave e desempacote o arquivo usando este co-
mando:
shell> tar -xvf /tmp/mysql-snapshot.tar
Voc pode no desejar replicar o banco de dados mysql. Se no, voc pode exclu-lo do arqui-
vo. 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 |
Administrao do Bancos de Dados MySQL
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 servi-
dor 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 de-
finio 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 off-
set:
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
Administrao do Bancos de Dados MySQL
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 di-
ferente 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 co-
nectar 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 op-
o --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
10. Inicie a thread slave:
mysql> START SLAVE;
Administrao do Bancos de Dados MySQL
356
Depois de realizado este procedimento, o slave deve se conectar ao master e pegar todas as atualiza-
es 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 is-
so siga a poro referente ao slave descrita acima. Voc no precisa ter outra cpia do master.
4.11.5. Recursos de Replicao e Problemas Conheci-
dos
Abaixo uma explicao do que e o que no suportado:
A Replicao ser feita corretamente com valores AUTO_INCREMENT, LAST_INSERT_ID e
TIMESTAMP.
As funes USER() e LOAD_FILE() so replicadas sem alteraes e no funcionaro de for-
ma confivel no slave. Isto tambm verdade para CONNECTION_ID() em verses de servi-
dor slaves mais antigas que 4.1.1. A nova funo PASSWORD() no MySQL 4.1, bem replica-
da desde os masters 4.1.1; o seu slave deve ser 4.1.0 ou acima para replic-la. Se voc tem sla-
ves mais antigos e precisa replicar PASSWORD() do seu master 4.1.x, voc deve iniciar o mas-
ter com a opo --old-password.
As varivies SQL_MODE, UNIQUE_CHECKS, SQL_SELECT_LIMIT, SQL_AUTO_IS_NULL
e TABLE_TYPE no so replicados ainda. FOREIGN_KEY_CHECKS replicado desde a verso
4.0.14.
Voc deve uilizar o mesmo conjunto de caracteres (--default-character-set) no mas-
ter 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 tabe-
las) 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 insensiti-
vo 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.
Administrao do Bancos de Dados MySQL
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 modifi-
cao 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 arma-
zenados 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 atuali-
zar 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 algor-
timo 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 instru-
es 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 inici-
ar novamente.) Para evitar este problema, no desligue o servidor enquanto ele tiver tabelas tem-
porrias abertas. Em vez disto, use este procedimento:
1. Envie uma instruo STOP SLAVE.
2. Use SHOW STATUS para verificar o valor da varivel Slave_open_temp_tables.
3. Se o valor 0, envie um comando mysqladmin shutdown para desligar o slave.
4. Se o valor diferente de 0, reinicie as threads slaves com START SLAVE.
5. Repita o procedimento anterior para ver se voc ter melhor sorte na prxima vez.
Planejamoc corrigir este problema em um futuro prximo.
seguro conectar servidores em um relacionamento master/slave circular com log-sla-
ve-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 tabe-
las. 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
Administrao do Bancos de Dados MySQL
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 fa-
lhar, o slave ir tenatr a cada master-connect-retry segundos (padro 60). Por causa dis-
to, 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 VA-
RIABLES.
Desligar o slave (corretamente) tambm seguro, pois mantm sinais de onde parou. Desliga-
mentos incorretos podem produzir problemas, especialmente se o cache de disco no foi sincro-
nizado antes do sistema morrer. Seu sistema de tolerncia a falhas ser melhorado se voc pos-
suir um bom No-Break ou UPS.
Devido a natureza no trabnsacional das tabelas MyISAM, possvel ter uma consulta que atuli-
zar 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 segmen-
to BEGIN/COMMIT, a atualizao no log binrio pode estar fora de sincronia se algumas thre-
ads 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 bi-
nrio imeditamente quando a atualizao feita enquanto atualizaes transacionais so grava-
das 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 comportamen-
to do registro de transaes que misturam atualizaes de tabelas transacionais e no transacio-
nais, 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 pri-
meira transao da conexo ainda no est finalizada (ordenao errada ainda pode ocorrer, por-
que 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.
LOAD LOCAL DATA INFILE ser ignorado.
Na verso 3.23 RAND() em atualizaes no replicado apropriadamente. Use
RAND(alguma_expr_nao_rand) se voc estiver replicando atualizes com RAND(). Vo-
c pode, por exemplo, utilizar UNIX_TIMESTAMP() para o argumento de RAND(). Isto cor-
rigido na verso 4.0.
4.11.6. Opes de Inicializao da Replicao
Voc deve utilizar a opo server-id no master e no slave para estabelecer uma ID de conexo
nica em cada servidor. Voc deve escolher um valor nico no intervalo de 1 a 2^32-1 para cada
master e slave. Example: server-id=3
Administrao do Bancos de Dados MySQL
359
As opes que voc pode utilizar no servidor master para controle do log binrio esto todas descri-
tas em Seco 4.10.4, O Log Binrio.
A seguinte tabela descreve as opes que voc pode utilizar nos servidores slaves. Voc pode espe-
cific-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 espe-
cficados no arquivo de opes ou na linha de comando. Isto ir ocorrer quando voc iniciar o servi-
dor 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 li-
nha 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 mas-
ter.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 for-
mato 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 manualmen-
te 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 inicia-
Administrao do Bancos de Dados MySQL
360
lizao acima descrito, voc pode preferir usar as opes de inicializao para estes valores, e espe-
cifique-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 es-
pectro 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 defi-
nida, um senha vazia considerada. O valor em master.info toma precedncia se puder ser
lido.
--master-port=portnumber
Administrao do Bancos de Dados MySQL
361
A porta que o master est escutando. Se no definifa, a configurao de compilao do
MYSQL_PORT consierada. Se voc no alterou as opes do configure , ela deve ser 3306.
O valor em master.info toma precedncia se ele puder ser lido.
--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 pre-
cedncia 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 no-
me 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 algu-
ma 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 dire-
trio 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 RE-
LAY_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 es-
te 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
Administrao do Bancos de Dados MySQL
362
for feito ela entra em deadlock (o que acontecia antes do MySQL 4.0.13). Os usurios no de-
vem 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 co-
mecem com bar.
Note que se voc fizer --replicate-wild-do-table=foo%.% ento a regra ser propa-
gada para CREATE DATABASE e DROP DATABASE, ex.: estas duas instrues sero replica-
das 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 mgi-
ca ocorre devido ao '%' como padro da tabela).
Administrao do Bancos de Dados MySQL
363
Caracteres curingas _ e % escapados: veja as anotaes na descrio de replicate-
wild-do-table logo acima.
--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 de dados funcionem, use -
-replicate-wild-do-table=db_name.%.
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 da-
dos. 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 seleciona-
do 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 atualiza-
o 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 sa-
les.january SET amount=amount+1000;, esta consulta ser replicada.
Se voc precisar de atualizaes entre banco de dados funcione, use -
-replicate-wild-ignore-table=db_name.%.
--replicate-rewrite-db=de_nome->para_nome
Diz ao slave para traduzir o banco de dados atual (p.ex. aquele selecionado por USE) para pa-
ra_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. No-
te 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.
Administrao do Bancos de Dados MySQL
364
Esta opo est disponvel a partir do MySQL 4.0.0.
--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 re-
plica 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 re-
lay logs sero grandes tambm. --slave-load-tmpdir deve apontar para o sistema de ar-
quivo 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.
--slave-skip-errors= [err_code1,err_code2,... | all]
Diz ao a thread SQL do slave para continuar a replicao quando uma consulta retornar um erro
de uma lista fornecida. Normalmente, a replicao ir parar ao encontrar um erro, dando ao usu-
rio a chance de resolver a inconsistncian nos dados manualmente. No use esta opo a menos
que voc saiba exetamente o motivo dos erros. Se no houver erros em sua configurao da re-
plicao e programas clientes, e no houver erros no MySQL, voc nunca deve ter uma replica-
o abortada com erro. O uso indiscriminado desta opo resultar em slaves fora de sincronia
com o master e voc no ter idia de como o problema aconteceu.
Para cdigos de erros, voc deve usar o nmero fornecido pela mensagem de erron no seu log de
erros do slave e na sada de SHOW SLAVE STATUS. Uma lista completa de mensagens de erro
podem ser encontradas na distribuio fonte em Docs/mysqld_error.txt. Os cdigos de
erros do servidor tambm so listados em Seco 13.1, Erros Retornados.
Voc tambm pode (mas no deve) usar um valor no recomendado de all o que ir ignorar to-
das as mensagens de erro e continua em frente indiferentemente. No preciso dizer, que se vo-
c usar isto, no podemos garantir a integridade dos seus dados. Por favor, no reclame se seus
dados no slave no estiver nem prximo daqueles em seu master neste caso --- voc foi avisado.
Exemplos:
Administrao do Bancos de Dados MySQL
365
--slave-skip-errors=1062,1053
--slave-skip-errors=all
Algumas destas opes, como todas as opes --replicate-*, s podem ser definidas na inicia-
lizao 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 execu-
tada pelo slave ou ignorada por ele:
1. Existe alguma regra --replicate-do-db ou --replicate-ignore-db?
Sim: teste-as como para --binlog-do-db e --binlog-ignore-db (see Sec-
o 4.10.4, O Log Binrio). Qual o resultado do teste?
ignore a consulta: ignore-a e saia.
execute a consulta: no execute-a imediatamente, adie a deciso, v para o passo abai-
xo.
No: v para o passo abaixo.
2. Existe alguma regra --replicate-*-table?
No: execute a consulta e saia.
Sim: v para o passo abaixo. Apenas tabela que sero atualizadas sero comparadas s re-
gras (INSERT INTO sales SELECT * from prices: apenas sales ser compa-
rada 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).
3. Existe alguma regra --replicate-do-table?
Sim: o tabela encaixa em alguma delas?
Sim: execute a consulta e saia.
No: v para o passo abaixo.
No: v para o passo abaixo.
4. Existe alguma regra --replicate-ignore-table?
Sim: a tabela encaixa em alguma delas?
Sim: ignore a consulta e saia.
No: v para o passo abaixo.
No: v para o passo abaixo.
5. Existe alguma regra --replicate-wild-do-table?
Sim: a tabela se encaixa em qualquer uma delas?
Sim: execute a consulta e saia.
No: v para o passo abaixo.
No: v para o passo abaixo.
Administrao do Bancos de Dados MySQL
366
6. Existe alguma regra --replicate-wild-ignore-table?
Sim: a tabela se encaixa em qualquer uma delas?
Sim: ignore a consulta e saia.
No: v para o passo abaixo.
No: v para o passo abaixo.
7. Nenhuma regra --replicate-*-table foi correspondida. Existe outra tabela para se tes-
tar 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?
Sim: ignore a consulta e saia.
No: execute a consulta e saia.
4.11.7. Instrues SQL para Controle do Servidor Mas-
ter
0 replicao pode ser controlada por meio da interface SQL. Esta seo discute instrues para ge-
renciamento dos servidores masters de replicao. Seco 4.11.8, Instrues SQL para Controle do
Servidor Slave discute instrues para gerenciamento dos servidores slaves.
4.11.7.1. PURGE MASTER LOGS
PURGE {MASTER|BINARY} LOGS TO 'log_name'
PURGE {MASTER|BINARY} LOGS BEFORE 'date'
Deleta todos os logs binrios que esto listados no ndice de log anteriores ao log ou data especifica-
do. O log tambm remove da lista gravada no ndice de log, e assim o log dado se torna o primeiro.
Exemplo:
PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2003-04-02 22:46:26';
A variante BEFORE est disponvel no MySQL 4.1; este argumento de data pode estar no formato
'YYYY-MM-DD hh:mm:ss'. MASTER e BINARY so sinnimos, embora BINARY possa ser
usado apenas a partir do MySQL 4.1.1.
Se voc tiver um slave ativo que est atualmente lendo um dos logs que voc st tentando deletar,
este comando no faz nada e falha com um erro. No entanto, se voc tiver um slave ativo e apagar
um dos logs que ele quiser ler, o slave no poder replicar uma vez que ele esteja ativo. O comando
seguro para de se executar enquanto os sslaves estiverem replicando. Voc no precisa de par-los.
Voc deve primeiro verificar todos os slaves com SHOW SLAVE STATUS para ver qual log eles
esto lendo, e ento voc deve fazer uma lista dos logs no master com SHOW MASTER LOGS, en-
contrar o log mais novo entre todos os slaves (se todos os slaves esto atualizados, ele ser o ltimo
log da lista), tirar backup de todos os logs que voc est prestes a deletar (opcional) e deletar at o
log alvo.
4.11.7.2. RESET MASTER
Administrao do Bancos de Dados MySQL
367
RESET MASTER
Deleta todos os logs binrios listado no arquivo de ndice, zerando o arquivo de ndice do log bin-
rio.
Esta instruo rea chamada FLUSH MASTER antes do MySQL 3.23.26.
4.11.7.3. SET SQL_LOG_BIN
SET SQL_LOG_BIN = {0|1}
Disabilita ou habilita o log binrio para a conexo do usurio (SQL_LOG_BIN uma varivel de
sesso) se o cliente conecta usando uma conta que tem o privilgio SUPER. A instruo ignorada
se o cliente no possui este privilgio.
4.11.7.4. SHOW BINLOG EVENTS
SHOW BINLOG EVENTS [ IN 'log_name' ] [ FROM pos ] [ LIMIT [offset,] row_count ]
Mostra o evento no log binrio. Se voc no especificar 'log_name', o primeiro log binrio ser
exibido.
Esta instruo est disponvel a partir do MySQL 4.0.
4.11.7.5. SHOW MASTER STATUS
SHOW MASTER STATUS
Fornece a informao de status no log binrio do master.
4.11.7.6. SHOW MASTER LOGS
SHOW MASTER LOGS
Lista o log binrio no master. Voc deve usar este comando antes de PURGE MASTER LOGS para
descobrir at onde voc deve ir.
4.11.7.7. SHOW SLAVE HOSTS
SHOW SLAVE HOSTS
Mostra uma lista de slaves atualmente registrados com o master. Note que slaves no iniciados com
a opo --report-host=slave_name no estaro visveis nesta lista.
4.11.8. Instrues SQL para Controle do Servidor Sla-
ve
A replicao pode ser controlada por meio da interface SQL. Esta seo discute instrues para ge-
renciamento dos servidores slaves de replicao. Seco 4.11.7, Instrues SQL para Controle do
Servidor Master discute instrues para gerenciamento dos servidores master.
4.11.8.1. CHANGE MASTER TO
CHANGE MASTER TO master_def [, master_def] ...
master_def =
Administrao do Bancos de Dados MySQL
368
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, MAS-
TER_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, MAS-
TER_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 ca-
so 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, MAS-
TER_LOG_FILE='' e MASTER_LOG_POS=4 so silenciosamente adicionados a ele.
Administrao do Bancos de Dados MySQL
369
MASTER_LOG_FILE e MASTER_LOG_POS so as coordenadas das quais a thread de E/S do slave
comeara a ler do master na prxima vez em que ele for iniciado. If you specify any of them, you
can't specify RELAY_LOG_FILE or RELAY_LOG_POS. If none of MASTER_LOG_FILE and
MASTER_LOG_POS was specified, then the last coordinates of the slave SQL thread before
CHANGE MASTER was issued, are used. This ensures that replication has no discontinuity, even if
the slave SQL thread was late compared to the slave I/O thread, when you just want to change, say,
the password to use. This safe behaviour was introduced starting from MySQL 4.0.17 and 4.1.1.
(Before these versions, the used coordinates were the last coordinates of the slave I/O thread before
CHANGE MASTER was issued, which caused the SQL thread to sometimes lose some events from
the master, thus breaking replication.)
CHANGE MASTER TO deleta todos os relay logs (e inicia um novo), a menos que voc especifi-
que RELAY_LOG_FILE ou RELAY_LOG_POS (neste caso os relay logs sero mantidos; desde o
MySQL 4.1.1 a varivel global RELAY_LOG_PURGE ser definida com zero sem aviso prvio).
CHANGE MASTER TO atualiza master.info e relay-log.info.
CHANGE MASTER util para configurar um slave quando voc tem a cpia do master e gravou o
registro e offset no master que corresponde a cpia tirada. Voc pode executar CHANGE MASTER
TO MASTER_LOG_FILE='log_name_on_master', MAS-
TER_LOG_POS=log_offset_on_master no slave depois de restaurar a cpia.
O primeiro exemplo acima (CHANGE MASTER TO MAS-
TER_HOST='master2.mycompany.com' etc) altera as coordenadas do master e do seu log
binrio. Isto quando voc deseja que o slave replique o master. O segundo exemplo, usado com
menos frequncia, quando o slave possui relay logs que, por alguma razo, voc deseja que o slave
execute novamente; para fazer isto o master no precisa estar alcanavel, voc s precisa fazer
CHANGE MASTER TO e iniciar a thread de SQL (START SLAVE SQL_THREAD). Voc pode
usar isto mesmo fora da consigurao de replicao, em um servidor standalone, slave-de-ningum,
para recuperao depois de uma falha.
Suponha que o seu servidor tenha falhado e voc tenha restaurado um backup. Voc deseja reexecu-
tar o prprio log binrio do servidor (no os relay logs, mas logs binrios regulares), supostamente
chamado myhost-bin.*. Primeiro faa uma cpia destes logs binrios em alguns lugares segu-
ros, no caso de voc no seguir exatamente o procedimento abaixo e acidentalmente apagar os logs
binrios de servidor. Se voc estiver usando o MySQL 4.1.1 ou mais novos, defina SET GLOBAL
RELAY_LOG_PURGE=0 para segurana adicional. Ento inicie o servidor sem log-bin, com um
novo ID do servidor (diferente do anterior), com relay-log=myhost-bin (para fazer o servi-
dor acreditar que estes logs binrios regulares so relay logs) e skip-slave-start, ento exe-
cute estas instrues:
mysql> CHANGE MASTER TO
-> RELAY_LOG_FILE='myhost-bin.153',
-> RELAY_LOG_POS=410,
-> MASTER_HOST='some_dummy_string';
mysql> START SLAVE SQL_THREAD;
Ento o servidor ir ler e executar seus prprios logs binrios, e assim conseguindo a recuperao de
falhas. Uma vez que a recuperao est finalizada, execute STOP SLAVE, desligue o servidor, de-
lete master.info e relay-log.info, e reinicie o servidor com suas opes originais. No
momento, especificar MASTER_HOST (mesmo com um valor modelo) compulsrio para fazer o
servidor pensar que ele um slave, e dar ao servidor um novo ID, diferente do anterior compuls-
rio seno o servidor ver os eventos com seus IDs e pensar que ele est em uma configurao de
replicao circular e ignora os eventos, o que indesejado. No futuro planejamos adicionar opes
para lidar com estas pequenas restries.
4.11.8.2. LOAD DATA FROM MASTER
LOAD DATA FROM MASTER
Tira uma cpia do master para o slave. Atualiza os valores de MASTER_LOG_FILE e MAS-
TER_LOG_POS assim o slave ser iniciado replicando da posio correta. Respeitar a regras de
Administrao do Bancos de Dados MySQL
370
excluso de tabelas e bancos de dados especificadas com as opes replicate-*.
O uso desta instruo est sujeito ao seguinte:
Funciona apenas com tabelas MyISAM.
Ele adquire um lock de leitura global no master enquanto tira um instantneo, que evita atualiza-
es 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 ig-
noradas pelo LOAD DATA FROM MASTER; isto ocorre porque o master ir esconde-los do usu-
rio: 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.3. LOAD TABLE tbl_name FROM MASTER
LOAD TABLE tbl_name FROM MASTER
Faz o download de uma cpia da tabela do master para o slave. Esta instruo implementada prin-
cipalmente para depurao de LOAD DATA FROM MASTER. Exige que o usurio de replicao
que usado para conectar ao master tenha privilgios RELOAD e SUPER no master, e SELECT na
tabela do master que ser carregada. No lado do slave, o usurio que envia LOAD TABLE FROM
MASTER deve ter permisso para apagar e criar a tabela. Leia as anotaes sobre tempo limite na-
descrio de LOAD DATA FROM MASTER abaixo, elas se aplicam aqui tambm. Por favor, leia
tambm as limitaes de LOAD DATA FROM MASTER acima, elas tambm se aplicam (por exem-
plo, LOAD TABLE FROM MASTER s funciona com tabelas MyISAM).
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 pa-
ra uma descrio completa.
4.11.8.5. RESET SLAVE
RESET SLAVE
Faz o slave esquecer a sua posio de replicao no log binrio do master. Esta instruo usada pa-
ra uma inicializao limpa: ela deleta os arquivos master.info e relay-log.info, todos os
relay logs e inicia um novo relay log. Nota: Todos os relay logs so deletados, mesmo se no forem
totalmente executados pela threads SQL do slave. (Esta uma condio que deveria existir em um
slave de replicao altamente carregado, ou se voc enviasse uma instruo STOP SLAVE.) As in-
Administrao do Bancos de Dados MySQL
371
formaes de conexo armazenadas no arquivo master.info so imediatamente recarregadas
com os valores especificados nas opes de inicializaco, se forem especificadas. Estas informaes
incluem valores como mquina master, porta do master, usurio do master e senha do master. Se a
thread SQL do slave estava no meio de uma replicao de tabelas temposrrias quando ela foi para-
da, e RESET SLAVE excutado, estas tabelas temporrias replicadas so deletadas no slave.
Esta instruo era chamada FLUSH SLAVE antes do MySQL 3.23.26.
4.11.8.6. SET GLOBAL SQL_SLAVE_SKIP_COUNTER
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n
Salta os prximos n eventos do master. til para recuperao de paradas da replicao causada por
um erro.
Esta instruo s vlida quando a thread slave no est em execuo, em caso contrrio, retorna
um erro.
Antes do MySQL 4.0, omite a palavra chave GLOBAL da instruo.
4.11.8.7. SHOW SLAVE STATUS
SHOW SLAVE STATUS
Fornece a informao de status nos parmetros essenciais da thread do slave. Se voc utilizar esta
instruo usando no cliente mysql, voc pode usar o terminador \G em vez de um ponto e vrgula
no fim, para conseguir um layout vertical mais legvel:
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: localhost
Master_User: root
Master_Port: 3306
Connect_Retry: 3
Master_Log_File: gbichot-bin.005
Read_Master_Log_Pos: 79
Relay_Log_File: gbichot-relay-bin.005
Relay_Log_Pos: 548
Relay_Master_Log_File: gbichot-bin.005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 79
Relay_Log_Space: 552
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 8
Dependendp da sua verso do MySQL, voc pode no ver todos os campos como aqui mostrado.
Alguns campos esto presentes apenas a partir do MySQL 4.1.1.
Os campos mostrados por SHOW SLAVE STATUS tem o seguinte significado:
Administrao do Bancos de Dados MySQL
372
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, re-
conectando 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 copia-
da, 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 th-
read 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, Replica-
Administrao do Bancos de Dados MySQL
373
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 sla-
ve, 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 apare-
ceria 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 executa-
do 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.
Until_Condition, Until_Log_File, Until_Log_pos
O valor especificado na clusula UNTIL da instruo START SLAVE.
Until_Condition possui estes valores estes valorer:
None se nenhuma clusula UNTIL foi especificada
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
Until_Log_File e Until_Log_Pos indicam o nome do arquivo de log e e posio que
define o ponto no qual a thread SQL ir parar a execuo.
Estes campos esto presentes a partir do MySQL 4.1.1.
Master_SSL_Allowed, Master_SSL_CA_File, Master_SSL_CA_Path, Mas-
ter_SSL_Cert, Master_SSL_Cipher, Master_SSL_Key
Estes campos mostram os parmetros SSL usado pelo slave para se conectar os master, se existi-
Administrao do Bancos de Dados MySQL
374
rem.
Master_SSL_Allowed possui estes valores:
Yes se uma conexo SSL ao master permitida
No se uma conexo SSL ao master no permitida
Ignored se uma conexo SSL permitida pelo servidor slave no tem suporte a SSL habili-
tado.
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". Funci-
onar mesmo se o seu master e slave no tiverem clocks idnticos.
Estes campos esto presentes a partir do MySQL 4.1.1.
4.11.8.8. START SLAVE
START SLAVE [thread_name [, thread_name] ... ]
START SLAVE [SQL_THREAD] UNTIL
MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos
START SLAVE [SQL_THREAD] UNTIL
RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos
thread_name = IO_THREAD | SQL_THREAD
START SLAVE sem nenhuma opo inicia ambas as threads slaves. A thread de E/S lem as con-
sultas do servidor master e as armazena no relay logs. A thread de SQL le o relay log e executa a
consulta. Note que se START SLAVE obter sucesso no inicializao da thread slave ela retornar
sem qualquer erro. Mas mesmo neste caso pode ser que a thread slave iniciou e parou mais tarde
(por que elas no conseguiram se conectar ao master ou leram o seu log binrio ou qualquer outro
problema). START SLAVE no lhe avisar sobre insto. Voc dever verifica seu arquivo log de er-
ro do slave por mensagens de erro gerada pela thread slave, ou verificar que eles esto rodando bem
com SHOW SLAVE STATUS.
A partir do MySQL 4.0.2, voc pode adicionar as opes IO_THREAD ou SQL_THREAD instru-
o a ser chamada quando a thread iniciar.
A partir do MySQL 4.1.1, uma cusula UNTIL pode ser adicionada para especificar que o slave de-
ve iniciar at que a thread de SQL alcance um determinado ponto no log binrio dp master ou no re-
lay log do slave. Quando a thread SQL alcana este ponto, ela para. Se a opo SQL_THREAD es-
pecificada na instruo, ela inicia apenas a thread de SQL. Seno, ela inicia ambas as threads slaves.
Se a thread SQL j estiver em execuo, a clasula UNTIL ignorada e um aviso enviado.
Com uma clusula UNTIL, voc deve especificar tanto uma nome de arquivo de log quanto uma po-
sio. No misture opes do master e do relay logs.
Qualquer condio UNTIL restaurada por uma instruo STOP SLAVE subsequente, ou uma ins-
truo START SLAVE que no incluir a clusula UNTIL, ou um servidor reinicie.
A clusula UNTIL pode ser til para depurar a replicao, ou para fazer com que a replicao proce-
Administrao do Bancos de Dados MySQL
375
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 di-
zer 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, recomen-
dado 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 op-
o 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.
4.11.8.9. STOP SLAVE
STOP SLAVE [thread_name [, thread_name] ... ]
thread_name = IO_THREAD | SQL_THREAD
Para a thread slave. Como o START SLAVE, esta instruo pode ser usada com as opes
IO_THREAD e SQL_THREAD para chamar a thread ou threads que iro parar.
Este comando chamado SLAVE STOP antes do MySQL 4.0.5. No momento, SLAVE STOP ain-
da aceito para compatibilidade com verses anteriores, mas est obsoleto.
4.11.9. FAQ da Replicao
P: Como eu configuro um slave se o master j estiver em execuo e eu no quiser par-lo?
R: Existem diversas opes. Se voc tirou um backup do master em alguns pontos e gravou o nome
e offset do log binrio (da sada do SHOW MASTER STATUS) correspondente cpia, faa o segu-
inte:
1. Esteja certo de que o slave possu um ID server nico.
2. Execute as seguintes instrues no slave, preenchendo os valores apropriados para cada par-
metro:
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. Execute START SLAVE no slave.
Se voc j no tiver um backup do master, aqui est um modo rpido de faz-lo de forma consisten-
te:
1. FLUSH TABLES WITH READ LOCK
2. gtar zcf /tmp/backup.tar.gz /var/lib/mysql ( ou uma variao disto)
3. SHOW MASTER STATUS - esteja certo de gravar a sada - voc precisar dela mais tarde
Administrao do Bancos de Dados MySQL
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 es-
te 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 di-
versos 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 preenchi-
do 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 futu-
ro, LOAD DATA FROM MASTER ser o modo recomendado de configurar um slave. Esteja avisa-
do, no entanto, que o lock de leitura pode ser mantido por um longo tempo se voc usar este coman-
do. Ele ainda no est implementado de forma to eficiente quanto gostariamos. Se voc tiver tabe-
las grandes, o mtodo prefervel neste momento ainda com uma cpia tar local depois de execu-
tar 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 mes-
mo 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 SLA-
VE 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. No master, execute estes comandos:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
Grave o nome do log e o offset da sada da instuo SHOW.
2. No slave, execute este comando, onde as coordenadas da replicao que so os argumentos da
funo MASTER_POS_WAIT() so os valores gravados nos passos anteriores:
mysql> SELECT MASTER_POS_WAIT('log_name', log_offset);
Administrao do Bancos de Dados MySQL
377
A instruo SELECT ser bloqueada at que o slave alcance o arquivo de log e offset especifi-
cados. 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 atuali-
zaes 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 sla-
ve 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 tam-
bm 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 or-
dem 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 atu-
alizaes 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 veloci-
dade 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.
Administrao do Bancos de Dados MySQL
378
Voc pode, claro, usar diferentes nomes para as funes. O importante ter uma interface unifica-
da 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 solu-
es 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 infre-
quentes. 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 atualiza-
es cresa ao ponto que o master no possa trat-la.
Para determinar quantos slaves voc pode ter antes dos benefcios adicionados comearem a estabil-
zar e quanto voc pode melhorar o desempenho do seu site, voc precisa saber o padro de suas con-
sultas 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 m-
dia e a realao linear. Vamos supor que o master e cada slave possuem a mesma capacidade, e te-
mos 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 pa-
ra 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 = 1, podemos aumentar para 184 escritas por segundos.
Se N = 8, conseguimos 400.
Se N = 17, 480 escritas.
Eventualmente, a medida que N se aproxima de infinito (e seu oramento de menos infinito), po-
demos chegar prximo a 600 escritas por segundo, aumentando o throughput do sistema em cer-
ca 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 ou-
tros fatores que podiam se tornar significante em seu sistema. Em muitos casos, voc pode no con-
Administrao do Bancos de Dados MySQL
379
seguir fazer um clculo similar ao acima que ir predizer exatamente o que acontecer em seus siste-
ma se voc adicionar N slaves de replicao. No entanto, responder as seguintes questes deve aju-
d-lo a decidir quando e quanto a replicao aumentar a performance do seu sistema:
Qual a razo da leitura/escrita no 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?
P: Como eu posso usar replicao para fornecer redundncia/alta disponibilidade?
R: Com os recursos disponveis atualmente, voc teria que configurar um master e um slave (ou di-
versos slaves) e escrever um script que monitoraria o master para ver se ele est no ar e instruir as
suas aplicaes e os slaves do master a alterar no caso de falha. Sugestes:
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 di-
namicamente o seu DNS.
Voc deve executar seus escravos com a opo --log-bin e sem
--log-slave-updates. Deste modo o slave estar pronto para se tornar um master assim
que voc executar STOP SLAVE; RESET MASTER, e CHANGE MASTER TO em outros sla-
ves.
Por exemplo, considere que voce tenha a seguinte configurao (``M'' representa o master, ``S''
o slave, ``WC'' o cliente que faz a leitura e escrita do banco de dados; clientes que fazem apenas
a leitura do banco de dados bo so representadas j que elas no precisam trocar):
WC
\
v
WC----> M
/ | \
/ | \
v v v
S1 S2 S3
S1 (como S2 e S3) um slave executando com --log-bin e sem
--log-slave-updates. Como as nicas escritas executada em S1 so aquelas replicadas
de M, o log binrio em S1 empty (lembre-se, que S1 executado sem -
-log-slave-updates). Ento, por alguma razo, M se torna indisponvel, e voc quer que
o S1 se torne o novo master (isto , direciona todos os WC para S1 e faa S2 e S3 replicar em
S1).
Certifique-se que todos os slaves processaram aqulquer consulta em seus relay log. Em cada sla-
ve, execute STOP SLAVE IO_THREAD, ento verifique a sada de SHOW PROCESSLIST at
voc ver Has read all relay log. Quando isto ocorrer para todos os slaves, eles podem
ser reconfigurados para a nova configurao. Envie STOP SLAVE para todos os slaves, RESET
MASTER no slave sendo promovido para master, e CHANGE MASTER nos outros slaves.
Nenhum WC acessa M. Instru todos os WCs a direcionar as suas consultas para S1. De agora em
diante, todas as consultas enviadas por WC para S1 so escritas no log binrio de S1. O log bi-
nrio de S1 contm exatamente todas as consultas de escrita enviada para S1 desde que M foi fi-
nalizado. Em S2 (e S3) faa STOP SLAVE, CHANGE MASTER TO MASTER_HOST='S1'
(onde 'S1' substituido pelo nome de mquina real de S1). Para CHANGE MASTER, adicione
todas as informaes sobre como conectar a S1 de S2 ou S3 (usurio, senha, porta). Em CHAN-
GE MASTER, no necessrio especificar o nome do log binrio de S1 ou a sua posio: ns sa-
Administrao do Bancos de Dados MySQL
380
bemos que ele o primeiro log binrio, na posio 4, e estes so os padres de CHANGE MAS-
TER. 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 an-
tes 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 monitora-
mento.
4.11.10. Problemas com Replicao
Se voc tiver seguido as instrues e suia configurao de replicao no est funcionando, primeiro
verifique o seguinte:
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 de-
finiu o server-id.
O slave est executando? Faa SHOW SLAVE STATUS e verifique se os valores Sla-
ve_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 PRO-
CESSLIST, 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 Con-
necting 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 con-
sultas que obtem sucesso no master falham no slave. Into nunca deve acontecer se voc tiver ti-
rado 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 fa-
zer 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 aconte-
ceu (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
Administrao do Bancos de Dados MySQL
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.
4.11.11. Relatando Problemas de Replicao
Quando voc tiver determinado que no h erro de usurio envolvido, e a replicao ainda no fun-
ciona perfeitamente ou est instvel, hora de comear a fazer num relatrio de erros. Ns precisa-
mos do mximo de informaes que voc puder fornecer para conseguirmos rastrear o bug. Por fa-
vor gaste algum tempo e esforo preparando um bom relato de erro.
Se voc tiver uma forma repetitvel de demonstrar o problema, por favor inclua-o em nosso banco
de dados de bugs http://bugs.mysql.com. Se voc tem um problema de fantasma (um problema que
no pode ser duplicado a sua vontade), use o seguinte procedimento:
1. 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 tabe-
las manualmente para entrar em sincronia. Este no um problema de replicao; um proble-
ma 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 re-
gistre todas as atualizaes que ele receber no seu prprio log binrio.
3. Salve todas as evidncias antes de restaurar o estado da replicao. Se no tivermos nenhuma
informao ou apenas algum esboo, ser um pouco mais difcil para rastrearmos o problema.
As evidncias que voc deve coletar so:
Todos os logs binrios no master
Todos os logs binrios no slave
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.
Logs de erro no master e no slave
4. Utilize mysqlbinlog para examinar os logs binrios. A informao a seguir pode ser til pa-
ra encontrar a consulta problemtica, por exemplo:
mysqlbinlog -j pos_from_slave_status /caminho/para/log_do_slave | head
Administrao do Bancos de Dados MySQL
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 quantida-
de possveis de informaes.
Administrao do Bancos de Dados MySQL
383
Captulo 5. Otimizao do MySQL
Otimizao uma tarefa complicada porque necessita um entendimento do sistema como um todo.
Enquanto for possvel fazer algumas otimizaes com pequeno conhecimento de seu sistema ou
aplicao, quanto mais otimizado voc desejar que o seu sistema esteja, mais ter que saber sobre
ele.
Este captulo tentar explicar e fornecer alguns exemplos de diferentes formas de otimizar o
MySQL. Lembre-se, no entanto, que sempre existiro (cada vez mais difceis) formas adicionais de
deixar seu sistema mais rpido.
5.1. Viso Geral da Otimizao
A parte mais importante para obter um sistema rpido com certeza o projeto bsico. Voc tambm
precisa saber quais tipos de coisas seus sistema estar fazendo, e quais so gargalos existentes.
Os gargalos mais comuns so:
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 da-
dos 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 pa-
ralelo.
Ciclos de CPU. Quando tivermos os dados na memria principal (ou se eles j estiverem l) pre-
cisaremos 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.
5.1.1. Limitaes do Projeto MySQL/Trocas
Quando usamos o mecanismos de armazenamento MyISAM, o MySQL utiliza travamento de tabela
extremamente rpidos (mltiplas leituras / nica escrita). O maior problema com este tipo de tabela
ocorre quando voc tem uma mistura do fluxo fixo de atualizaes e selees lentas na mesma tabe-
la. Se isto for um problema com algumas tabelas, voc pode usa outro tipo de tabela. See Captulo 7,
Tipos de Tabela do MySQL.
O MySQL pode trabalhar com tabelas transacionais e no transacionais. Para trabalhar sem proble-
mas com tabelas no transacionais (nas quais no se pode fazer um rollback se alguma coisa der er-
rada), o MySQL tem as seguintes regras:
Todas as colunas possuem valor padro.
Se voc inserir um valor 'errado' em uma coluna, como um NULL em uma coluna NOT NULL
ou um valor numrico muito grande em 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
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 aplica-
tivos 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 da-
dos 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 escre-
ver sua aplicao independente do banco de dados. Os benchmarks podem ser encontrados no dire-
trio 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 in-
terface 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 adicio-
nar 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 forne-
cer uma performance ainda mais alta. Deixando resultados antigos 'expirar' depois de um tempo, vo-
c 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 expira-
o maior at que as coisas voltem ao normal.
Otimizao do MySQL
385
Neste caso a informao de criao de tabelas devem conter informaes do tamanho inicial do ca-
che e com qual frequncia a tabela, normalmente, deve ser renovada.
5.1.3. Para que Utilizamos o MySQL?
Durante o desenvolvimento inicial do MySQL, os recursos do MySQL foram desenvolvidos para
atender nosso maior cliente. Eles lidam com data warehousing para alguns dos maiores varejistas na
Sucia.
De todas as lojas, obtemos resumos semanais de todas as transaes de cartes de bonus e espera-
mos fornecer informaes teis para ajudar os donos das lojas a descobrir como suas campanhas pu-
blicitrias esto afetando seus clientes.
Os dados so bem grandes (cerca de 7 milhes de transaes por ms), e armazenamos dados por
cerca de 4-10 anos que precisamos apresentar para os usurios. Recebemos requisies semanais
dos clientes que desejam ter acesso 'instantneo' aos novos relatrios contendo estes dados.
Resolvemos este problema armazenando todas informaes mensalmente em tabelas com transaes
compactadas. Temos um conjunto de macros (script) que geram tabelas resumidas agrupadas por di-
ferentes critrios (grupo de produto, id do cliente, loja...) das tabelas com transaes. Os relatrios
so pginas Web que so geradas dinamicamente por um pequeno shell script que analisa uma pgi-
na Web, executa as instrues SQL na mesma e insere os resultados. Ns usariamos PHP ou
mod_perl mas eles no estavam disponveis na poca.
Para dados graficos escrevemos um ferramenta simples em C que pode produzir GIFs baseados no
resultado de uma consulta SQL (com alguns processamentos do resultado). Isto tambm executado
dinamicamente a partir do script Perl que analisa os arquivos HTML.
Na maioria dos casos um novo relatrio pode simplesmente ser feito copiando um script existente e
modificando a consulta SQL no mesmo. Em alguns casos, precisamos adicionar mais campos a uma
tabela de resumo existente ou gerar uma nova, mas isto tambm bem simples, pois mantemos to-
das as tabelas com as transas no disco. (Atualmente possuimos pelo menos 50G de tabelas com
transaes e 200G de outos dados do cliente.)
Ns tambm deixamos nossos clientes acessarem as tabelas sumrias diretamente com ODBC para
que os usurios avanados possam tambm fazer experimentar com os dados.
Ns no tivemos nenhum problema lidando com isso em um servidor Sun Ultra SPARCstation
(2x200 Mhz) bem modesto. Atualmente atualizamos um de nossos servidores para um UltraSPARC
com 2 CPUs de 400 Mhz, e planejamos lidar com transaes no nvel de produto, o que pode signi-
ficar um aumento de pelo menos dez vezes nosso volume de dados. Acreditamos que podemos lidar
com isto apenas adicionando mais disco aos nossos sistemas.
Tambm estamos experimentando com Intel-Linux para obter mais poder de CPU por um melhor
preo. Agora que possuimos o formato binrios do bancos de dados portveis (a partir da verso
3.23), comearemos a utiliz-lo para partes da aplicao.
Nossa sensao inicial que o Linux ir atuar muito melhor em cargas baixas e mdias e o Solaris
ir atuar melhor quando voc comear a ter uma carga alta pelo uso extremo de IO de disco, mas
ainda no temos nada conclusivo sobre isto. Depois de algumas discusses com um desenvolvedor
do kernel do Linux, conclumos que isto pode ser um efeito colateral do Linux; alocar muitos recur-
sos para uma tarefa batch que a performance interativa se torna muito baixa. Isto deixa a mquina
muito lenta e sem resposta enquanto grandes batches estiverem em execuo. Esperamos que isto te-
nha um tratamento melhor em futuras verses do kernel Linux.
5.1.4. O Pacote de Benchmark do MySQL
Esta seo deve conter uma descrio tcnica do pacote de benchmarks do MySQL (e crash-me),
mas a descrio ainda no est pronta. Atualmente, voc pode ter uma boa idia do benchmark veri-
ficando os cdigos e resultados no diretrio sql-bench em qualquer distribuio fonte do
MySQL.
Otimizao do MySQL
386
Este conjunto de benchmark pretende ser um benchmark que ir dizer a qualquer usurio que opera-
es 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 opera-
es realizadas. Planejamos adicionar vrios testes multi-threaded no conjunto de benchmark no fu-
turo.
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
Inserindo 350768 linhas 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 de benchmarks em
http://www.mysql.com/information/benchmarks.html.
Perceba que a Oracle no est includa porque eles solicitaram a remoo. Todos benchmarks Ora-
cle devem ser aprovados pela Oracle! Acreditamos que os benchmarks da Oracle so MUITO ten-
decioso 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 Sec-
o 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 es-
percfico 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.
Otimizao do MySQL
387
O pacote de benchmark est localizado no diretrio sql-bench da distribio fonte do MySQL.
Para executar o teste de benchmark, altera a localizao dentro daquele diretrio e execute o script
run-all-tests:
shell> cd sql-bench
shell> perl run-all-tests --server=server_name
server_name um dos servidores suportados. Voc pode obter uma lista de todos parmetros e
servidores suportados executando run-all-tests --help.
crash-me tenta determinar quais recursos um banco de dados suporta e quais suas capacidades e
limitaes atuais para a execuo de consultas. Por exemplo, ele determina:
Quais tipos de colunas so suportados
Quantos ndices so suportados
Quais funes so suportadas
Qual o tamanho mximo de uma query
Qual o tamanho mximo de um registro do tipo VARCHAR
Podemos encontrar o resultado do crash-me para diversos bancos de dados em
http://www.mysql.com/information/crash-me.php.
5.1.5. Utilizando seus Prprios Benchmarks
Definitivamente voc deve fazer benchmarks de sua aplicao e banco de dados para saber quais so
os gargalos. Corrigindo (ou substituindo o gargalho com um ``mdulo burro'') voc pode facilmente
identificar o prximo gargalo (e continuar). Mesmo se a performance geral para sua aplicao atual-
mente aceitvel, voc deve pelo menos criar um plano para cada gargalo e decidir como resolv-lo
se algum dia voc precisar de performance extra.
Para um exemplo de programas de benchmarks portveis, consulte o conjunto de benchmarks do
MySQL. See Seco 5.1.4, O Pacote de Benchmark do MySQL. Voc pode pegar qualquer pro-
grama deste conjunto e modific-lo para suas necessidades. Fazendo isto voc pode tentar solues
diferentes para seu problema e testar qual a mais rpida para voc.
Outro pacote de benchmark grtis o Open Source Database Benchmark disponvel em
http://osdb.sourceforge.net/.
muito comum que um problemas ocorram apenas quando o sistema estiver muito carregado. Ns
tivemos alguns clientes que nos contactaram quando eles testaram um sistema em produo e encon-
traram problemas de carga. Na maioria dos casos, problemas de desempenho ocorrem devido a as-
suntos relacionados ao projeto bsico do banco de dados (busca em tabelas no so bons com
alta carga) ou problemas com o sistema operacional e de bibliotecaa. A maioria das vezes, estes pro-
blemas seriam MUITO mais fceis de resolver se os sistemas j no estivessem em uso.
Para evitar problemas deste tipo, voc deve colocar algum esforo em testar a performance de toda
sua aplicao sobre a pior carga possvel! Voc pode utilizar o Super Smack para isto. Ele est dis-
ponvel em: http://www.mysql.com/Downloads/super-smack/super-smack-1.0.tar.gz. Como o nome
sugere, ele pode derrubar seu sistema se voc solicitar, portanto, utilize-o somente em sistemas de
desenvolvimento.
5.2. Otimizando SELECTs e Outras Consultas
Primeiramente, uma coisa que afeta todas as consultas: Quanto mais complexo seu sistema de per-
misses, maior a sobrecarga.
Otimizao do MySQL
388
Se voc no tiver nenhuma instruo GRANT realizada, MySQL otmizar a verificao de permis-
ses de alguma forma. Dessa forma, se voc possui um volume muito alto, o tempo pode piorar ten-
tando 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 bench-
mark(loop_count,expression) uma tima ferramenta para saber se existe um problema
com sua query.
5.2.1. Sintaxe de EXPLAIN (Obter informaes sobre
uma SELECT)
EXPLAIN nome_tabela
ou EXPLAIN SELECT opes_select
EXPLAIN nome_tabela um sinnimo para DESCRIBE nome_tabela ou SHOW CO-
LUMNS FROM nome_tabela.
Quando uma instruo SELECT for precedida da palavra chave EXPLAIN, o MySQL explicar co-
mo 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 ob-
ter uma SELECT mais rpida que utiliza ndices para encontrar os registros.
Voce deve executar frequentemente ANALYZE TABLE para atualizar estatsticas de tabela tais co-
mo 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 otimiza-
dor 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 utiliza-
da na instruo SELECT. As tabelas so listadas na ordem que seriam lidas. O MySQL soluciona to-
das 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 encontra-
da. 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 co-
mo 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:
Otimizao do MySQL
389
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 ti-
po:
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 consul-
ta. 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
Otimizao do MySQL
390
WHERE primary_key_part1=1 AND primary_key_part2=2;
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 li-
das 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 (PRI-
MARY 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 selecio-
nar 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
Otimizao do MySQL
391
=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN e IN.
SELECT * FROM range_table WHERE key_column = 10;
SELECT * FROM range_table WHERE key_column BETWEEN 10 and 20;
SELECT * FROM range_table WHERE key_column IN (10,20,30);
SELECT * FROM range_table WHERE key_part1= 10 and key_part2 IN (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 da-
dos.
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 an-
terior. 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 re-
gistros 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 per-
formance 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 ne-
nhum ndice for escolhido. Para forar o MySQL a usar um ndice listado na coluna possi-
ble_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 aju-
dar 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
Otimizao do MySQL
392
A coluna rows informa o nmero de linhas que o MySQL deve examinar para executar a con-
sulta.
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 com-
binando 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.
range checked for each record (index map: #)
O MySQL no encontrou um bom ndice para usar. No lugar, ele ir fazer uma verificao
sobre qual ndice usar (se existir) para cada combinao das tabelas precedentes, e usar este
ndice para recuperar os registros da tabela. Isto no muito rpido mas mais rpido que
fazer um join sem um ndice.
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 to-
dos os registros que combinarem com o WHERE. Ento as chaves so classificadas. Final-
mente 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 colu-
nas diferentes das quais voc fez um GROUP BY.
Using where
Uma clusula WHERE ser utilizada para restringir quais registros sero combinados com a
Otimizao do MySQL
393
prxima tabela ou enviar para o cliente. se voc no possui esta informao e a tabela do ti-
po 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 exa-
minar 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 infor-
mao 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:
As colunas comparadas foram declaradas como a seguir:
Tabela Coluna Tipo da coluna
tt ActualPC CHAR(10)
tt AssignedPC CHAR(10)
tt ClientID CHAR(10)
et EMPLOYID CHAR(15)
do CUSTNMBR CHAR(15)
As tabelas possuem os ndices mostrados abaixo:
Tabela ndice
tt ActualPC
tt AssignedPC
tt ClientID
et EMPLOYID (chave primria)
do CUSTNMBR (chave primria)
The tt.ActualPC values aren't evenly distributed.
Otimizao do MySQL
394
Initially, before any optimizations have been performed, the EXPLAIN statement produces the fol-
lowing information:
table type possible_keys key key_len ref rows Extra
et ALL PRIMARY NULL NULL NULL 74
do ALL PRIMARY NULL NULL NULL 2135
et_1 ALL PRIMARY NULL NULL NULL 74
tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872
range checked for each record (key map: 35)
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 nme-
ro 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 de-
morar.
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 mes-
mo a menos que tenham sido declarados com tamanhos diferentes. Como tt.ActualPC decla-
rado 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 tama-
nho 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 instru-
o EXPLAIN novamente produzir este resultado:
table type possible_keys key key_len ref rows Extra
tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 Using where
do ALL PRIMARY NULL NULL NULL 2135
range checked for each record (key map: 1)
et_1 ALL PRIMARY NULL NULL NULL 74
range checked for each record (key map: 1)
et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1
Isto 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 possible_keys key key_len ref rows Extra
et ALL PRIMARY NULL NULL NULL 74
tt ref AssignedPC, ActualPC 15 et.EMPLOYID 52 Using where
ClientID,
ActualPC
et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1
do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1
Este resultado quase o melhor que se pode obter.
O problema restante que, por padro, o MySQL assume que valores na coluna tt.ActualPC es-
to distribudos igualmente, e este no o caso para a tabela tt. Felizmente, fcil informar ao
Otimizao do MySQL
395
MySQL sobre isto:
shell> myisamchk --analyze PATH_TO_MYSQL_DATABASE/tt
shell> mysqladmin refresh
Agora a join est perfeita, e EXPLAIN produz esta sada:
table type possible_keys key key_len ref rows Extra
tt ALL AssignedPC NULL NULL NULL 3872 Using where
ClientID,
ActualPC
et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1
et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1
do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1
Perceba que a coluna rows na 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.
5.2.2. Estimando o Desempenho de uma Consulta
Na maioria dos casos voc pode estimar a performance contando buscas em disco. Para tabelas pe-
quenas, normalmente voc pode encontrar o registro com 1 pesquisa em disco (uma vez que o ndice
provavelmente est no cache). Par tabelas maiores, voc pode estimar (usando indces de arvores
B++) que voc precisar de: log(row_count) / log(index_block_length / 3 * 2
/ (index_length + data_pointer_length)) + 1 buscas em disco para encontrar um
registro.
No MySQL um bloco de ndice tem geralmente 1024 bytes e o ponteiro de dados 4 bytes. Uma tabe-
la de 500.000 registros com um ndice com tamanho de 3 (inteiro mdio) lhe d:
log(500,000)/log(1024/3*2/(3+4)) + 1 = 4 pesquisas.
Como o ndice acima necessita cerca de 500,000 * 7 * 3/2 = 5.2M, (assumindo que os buffers de n-
dices so carregados at 2/3, que o normal) voc provavelmente ter grande parte dos ndices em
memria e provavelmente precisar somente de 1 ou 2 chamadas para ler dados do SO para encon-
trar o registro.
Entretanto, para escritas, voc precisar utilizar 4 requisies para encontrar onde posicionar o novo
ndice e normalmente 2 buscas para atualizar o ndice e escrever o registro.
Perceba que o que foi dito acima no significa que sua aplicao perder performance por N log N!
Como tudo armazenado no cache de seu SO ou do servidor SQL as coisas comearo a ficar um
pouco mais lentas quando as tabelas comearem a crescer. Quando os dados se tornam muito gran-
des para o cache, as coisas comearo a ficar bem mais lentas at que suas aplicaes estejam limi-
tadas a buscas em disco (o que aumenta em N log N). Para evitar isto, aumente o cache de ndice
quando os dados crescerem. See Seco 5.5.2, Parmetros de Sintonia do Servidor.
5.2.3. Velocidade das Consultas que Utilizam SELECT
Em geral, quando voc desejar tornar uma consulta lenta SELECT ... WHERE mais rpida, a pri-
meira coisa que deve ser conferida se voc pode ou no adicionar um ndice. See Seco 5.4.3,
Como o MySQL Utiliza ndices. Todas as referncias entre diferentes tabelas devem ser feitas
normalmente com ndices. Voc pode utilizar o comando EXPLAIN para determinas quais ndices
so usados para uma SELECT. See Seco 5.2.1, Sintaxe de EXPLAIN (Obter informaes sobre
uma SELECT).
Algumas dicas gerais:
Para ajudar o MySQL a otimizar melhor as consultas, execute myisamchk --analyze em
uma tabela depois dela ter sido carregada com dados relevantes. Isto atualiza um valor para cada
Otimizao do MySQL
396
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 otimiza-
da e levar muito tempo em tabelas grandes!
5.2.4. Como o MySQL Otimiza Clusulas WHERE
As otimizaes WHERE so colocadas aqui na parte da SELECT porque normalmente elas so usa-
das com SELECT, mas as mesmas otimizaes aplicam-se para WHERE em instrues DELETE e
UPDATE.
Note tambm que esta seo est incompleta. O MySQL faz vrias otimizaes e ainda no tivemos
tempo para documentarmos todas elas.
Algumas das otimizaes feitas pelo MySQL so so listadas abaixo:
Remoo de parnteses desnecessrios:
((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b AND c) OR (a AND b AND c AND d)
Enlaos de constantes:
(a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5
Remoo de condies contantes (necessrio por causa dos enlaos de contantes):
(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6
Expresses constantes utilizadas por ndices so avaliadas somente uma vez.
COUNT(*) em uma nica tabela sem um WHERE recuperado diretamente da informao da ta-
bela dos tipos MyISAM e HEAP. Isto tambm feito para qualquer expresso NOT NULL quan-
do usada somente com uma tabela.
Pr deteco de expresses contantes invlidas. O MySQL detecta rapidamente que algumas ins-
trues SELECT so impossveis e no retornar registros.
HAVING fundido com WHERE se no for utilizado GROUP BY ou funes de agrupamento
(COUNT(), MIN()...).
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 vazia ou uma tabela com 1 registro.
Uma tabela que usada com uma clusula WHERE em um ndice UNIQUE, ou uma PRI-
MARY KEY, onde todas as partes do ndice so usadas com expresses constantes e as partes
Otimizao do MySQL
397
do ndice so definidas como NOT NULL.
Todas as tabelas seguintes so usadas como tabelas constantes:
mysql> SELECT * FROM t WHERE primary_key=1;
mysql> SELECT * FROM t1,t2
-> WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
A melhor 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.
Se existerem uma clusula ORDER BY e uma GROUP BY diferente, ou se a ORDER BY ou
GROUP BY conterem colunas de tabelas diferentes da primeira tabela na fila de join, uma tabela
temporria ser criada.
Se voc utilizar SQL_SMALL_RESULT, o MySQL usar a tabela temporria em memria.
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 da-
dos. 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 ig-
norados.
Some examples of queries that are very fast:
mysql> SELECT COUNT(*) FROM tbl_name;
mysql> SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;
mysql> SELECT MAX(key_part2) FROM tbl_name
-> WHERE key_part_1=constant;
mysql> SELECT ... FROM tbl_name
-> ORDER BY key_part1,key_part2,... LIMIT 10;
mysql> SELECT ... FROM tbl_name
-> ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10;
As seguintes consultas so resolvidas utilizando somente a rvore de ndices (assumindo que as co-
lunas 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,... ;
5.2.5. Como o MySQL Otimiza IS NULL
O MySQL pode fazer a mesma otimizao em column IS NULL que ele pode com column =
constant_value. Por exemplos, o MySQL pode usar ndices e faixas para buscar por NULL
Otimizao do MySQL
398
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 * FROM t1 WHERE t1.a=expr OR t1.a IS NULL;
SELECT * FROM t1,t2 WHERE t1.a=t2.a OR t2.a IS NULL;
SELECT * FROM t1,t2 WHERE (t1.a=t2.a OR t2.a IS NULL) AND t2.b=t1.b;
SELECT * FROM t1,t2 WHERE t1.a=t2.a AND (t2.b=t1.b OR t2.b IS NULL);
SELECT * FROM t1,t2 WHERE (t1.a=t2.a AND t2.a IS NULL AND ...) OR (t1.a=t2.a AND t2.a IS NULL AND ...);
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 NULL);
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.
5.2.6. Como o MySQL Otimiza Clusulas DISTINCT
DISTINCT combinado com ORDER BY tambm ir em vrios casos criar uma tabela temporria.
Note que como DISTINCT pode usar GROUP BY, voc deve estar ciente de como o MySQL funci-
ona com campos na parte ORDER BY ou HAVING que no so parte dos campos selecionados. See
Seco 6.3.7.3, GROUP BY com Campos Escondidos.
Quando combinando LIMIT row_count com DISTINCT, o MySQL ir parar logo que encon-
trar row_count registros nicos.
Se voc no utiliza colunas de todas tabelas usadas, o MySQL ir parar a varredura das tabelas no
usadas logo que encontrar a primeira coincidncia.
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;
Neste caso, assumindo que t1 usando antes de t2 (confira com EXPLAIN), MySQL ir parar de
ler de t2 (para aquele registro particular em t1) quandoo primeiro registro em t2 for encontrado.
5.2.7. Como o MySQL Otimiza LEFT JOIN e RIGHT
JOIN
A LEFT JOIN B join_condition no MySQL est implementada como a seguir:
A tabela B configurada para ser dependente da tabela A e de todas as tabelas das quais A de-
pende.
Otimizao do MySQL
399
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 ta-
bela 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.
Todas as otimizaes padres de WHERE so realizadas.
Se existir um registro em A que coincida com a clusula WHERE, mas no existir nenhum regis-
tro 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.
RIGHT JOIN implementado de forma anloga LEFT JOIN.
A ordem de leitura das tabelas forada por LEFT JOIN e STRAIGHT JOIN ir ajudar o otimiza-
dor de joins (que calcula em qual ordem as tabelas devem ser unidas) a fazer seu trabalho mais rapi-
damente, j que havero poucas permutaes de tabelas a serem conferidas.
Perceba que o texto acima significa que se voc fizer uma consulta do tipo:
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key)
WHERE b.key=d.key
A partir do MySQL 4.0.14, o MySQL faz a seguinte otimizao LEFT JOIN:
Se a condio WHERE sempre falsa para a linha NULL gerada, o LEFT JOIN alterado para um
join normal.
Por exemplo, na seguinte consulta a clusula WHERE seria falso se t2.coluna fosse NULL, asssim
seguro converter para uma join normal.
SELECT * FROM t1 LEFT t2 ON (column) WHERE t2.column2 =5;
->
SELECT * FROM t1,t2 WHERE t2.column2=5 AND t1.column=t2.column;
Isto pode ser feito mais rpido j que o MySQL pode agora usar a tabela t2 antes da tabela t1 se
resultasse consulta melhor. Para forar uma ordem de tabela especfica, use STRAIGHT JOIN.
O MySQL ir fazer uma pesquisa completa em b j que o LEFT JOIN ir fora-lo a ser lido antes
de d.
A correo neste caso alterar a consulta para:
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key)
WHERE b.key=d.key
5.2.8. Como o MySQL Otimiza Clusulas ORDER BY
Em alguns casos o MySQL pode utilizar ndices para satisfazer uma requisio de ORDER BY ou
GROUP BY sem fazer uma ordenao extra.
Otimizao do MySQL
400
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 cons-
tantes na clusula WHERE. A seguinte consulta usar o ndice para resolver a parte ORDER BY /
GROUP BY:
SELECT * FROM t1 ORDER BY key_part1,key_part2,...
SELECT * FROM t1 WHERE key_part1=constante ORDER BY key_part2
SELECT * FROM t1 WHERE key_part1=constante GROUP BY key_part2
SELECT * FROM t1 ORDER BY key_part1 DESC,key_part2 DESC
SELECT * FROM t1 WHERE 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):
Voc est fazendo um ORDER BY em diferentes chaves:
SELECT * FROM t1 ORDER BY key1,key2
Voc est fazendo um ORDER BY usando partes de chaves no consecutivas.
SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2
Voc est misturando ASC e DESC.
SELECT * FROM t1 ORDER BY key_part1 DESC,key_part2 ASC
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 pri-
meira tabela na sada do EXPLAIN que no usa um mtodo de busca de registro const).
Voc tem diferentes expresses ORDER BY e GROUP BY.
O ndice da tabela usada um tipo de ndice que no armazena registros em ordem. (Como o n-
dice 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.
Armazena a chave ordenada em um buffer (de tamanho sort_buffer).
Quando o buffer ficar cheio, execute ordeno-o e armazene o resultado em um arquivo temposr-
rio. Salve um ponteiro para o bloco ordenado. (No caso de todos os regitros caberem no buffer
ordenado, nenhum arquivo temporrio criado).
Repete o armazenamento acima at todas as linhas tenham sido lidos.
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.
Repete o seguinte at que restem menos que MERGEBUFF2 (15) blocos.
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 usan-
Otimizao do MySQL
401
do os ponteiros de registro no arquivo resultante. Para otimizao , lemos em um grande bloco
de ponteiros de registros, ordena-os ento lemos o registros ordenadamente de de um buffer de
registro. (read_rnd_buffer_size) .
Voc pode verificar com EXPLAIN SELECT ... ORDER BY se o MySQL pode usar ndices
para resolver a consulta. Se voc obtiver Using filesort na coluna extra, ento o MySQL
no pode usar ndices para resolver o ORDER BY. See Seco 5.2.1, Sintaxe de EXPLAIN (Obter
informaes sobre uma SELECT).
Se voc quiser ter uma velocidade ORDER BY maior, primeiro voc deve ver se voc pode fazer
que o MySQL use ndices em vez de fazer um fase de ordenao extra. Se no for possvel, ento
voc pode fazer:
Aumente o tamanho da varivel sort_buffer_size.
Aumente o temenho da varivel read_rnd_buffer_size.
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 Win-
dows). Eles sero usados de acordo com o mtodo round-robin. Nota: Estes caminho devem es-
tar 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 po-
de suprimir a ordenacao especificando ORDER BY NULL:
INSERT INTO foo SELECT a,COUNT(*) FROM bar GROUP BY a ORDER BY NULL;
5.2.9. Como o MySQL Otimiza Clusulas LIMIT
Em alguns casos o MySQL ir tratar a consulta de maneira diferente quando voc estiver utilizando
LIMIT row_count e no estiver utilizando HAVING:
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 lo-
go 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 clas-
sificao 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 consul-
ta 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.
Otimizao do MySQL
402
5.2.10. Performance das Consultas que Utilizam IN-
SERT
O tempo para inserir um registro consiste aproximadamente de:
Conexo: (3)
Enviar a consulta para o servidor: (2)
Analisar a consulta (2)
Inserir o registro: (1 x tamanho do registro)
Inserir os ndices: (1 x nmero de ndices)
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 execu-
o).
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 ca-
sos) 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 uti-
lizando 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 LO-
AD 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. Execute a instruo FLUSH TABLES ou o comando shell mysqladmin flush-ta-
bles.
3. Utilize myisamchk --keys-used=0 -rq /path/to/db/nome_tabela. Isto
remover o uso de todos os ndices da tabela.
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. Recrie os ndices com myisamchk -r -q /caminho/para/bd/nome_tabela.
Isto criar a rvore de ndices em memria antes de escrev-la para o disco, que muito
Otimizao do MySQL
403
mais rpido porque evita que seja feita muita busca disco. A rvore de ndices resultante
tambm balanceada perfeitamente.
7. Execute uma instruo FLUSH TABLES ou o comando shell mysqladmin flush-
tables.
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 myi-
samchk 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> LOCK TABLES a WRITE;
mysql> INSERT INTO a VALUES (1,23),(2,34),(4,33);
mysql> INSERT INTO a VALUES (8,26),(6,29);
mysql> UNLOCK TABLES;
A principal diferena na velocidade que o buffer de ndices descarregado no disco somente
uma vez, depois de todas instrues INSERT term sido completadas. Normalmente existiria tan-
tas descargas do buffer de ndices quanto instrues INSERT diferentes. O bloqueio no ne-
cessrio se voc pode inserir todos registros com uma simples instruo.
Para tabelas transacionais, voc deve usar BEGIN/COMMIT em vez de LOCK TABLES para
conseguir um aumento na velocidade.
O bloqueio ir tambm diminuir o tempo total de testes de multi-conexes, mas o tempo mxi-
mo de espera para algumas threads ir aumentar (porque eles esperam pelos bloqueios). Por
exemplo:
thread 1 faz 1000 inseres
thread 2, 3 e 4 faz 1 insero
thread 5 faz 1000 inseres
Se voc no estiver usando travas, 2, 3 e 4 iro terminar antes de 1 e 5, Se estiver utilizando tra-
vas, 2, 3 e 4 provavelmente no iro terminar antes de 1 ou 5, mas o tempo total deve ser cerca
de 40% mais rpido.
Como as operaes INSERT, UPDATE e DELETE so muito rpidas no MySQL, voc obter
melhor perfomance geral adicionando travas em tudo que fizer mais que cerca de 5 inseres ou
atualizaes em um registro. Se voc fizer vrias inseres em um registro, voc pode utilizar
LOCK TABLES seguido de um UNLOCK TABLES de vez em quando (em torno de 1000 regis-
tro) para permitr que outras threads acessem a tabela. Isto tambm continua mostrando um bom
ganho de performance.
Com certeza, LOAD DATA INFILE muito mais rpido para carregar dados.
Para obter mais velocidade para LOAD DATA INFILE e INSERT, aumente o tamanho do buffer
de chaves. See Seco 5.5.2, Parmetros de Sintonia do Servidor.
5.2.11. Performance das Consultas que Utilizam UPDA-
TE
Otimizao do MySQL
404
Consultas de atualizao so otimizadas como uma consulta que usa SELECT com a sobrecarga adi-
cional 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 atualiza-
es 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.
5.2.12. Performance das Consultas que Utilizam DELE-
TE
Se voc deseja apagar todos os registros em uma tabela, deve usar TRUNCATE TABLE no-
me_tabela. See Seco 6.4.6, Sintaxe TRUNCATE.
O tempo para apagar um registro exatamente proporcional ao nmero de ndices. Para apagar re-
gistros mais rapidamente, voc pode aumentar o tamanho do cache de ndices. See Seco 5.5.2,
Parmetros de Sintonia do Servidor.
5.2.13. Mais Dicas sobre Otimizaes
Dicas no ordenadas para sistemas rpidos:
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 da-
dos, 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) Ex-
plain.
Tente evitar consultas SELECT complexas em tabelas que so muito atualizadas. Isto evita pro-
blemas 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 dis-
co para encontra o primeiro byte do registro. Depois de encontrar os dados a maioria dos novos
Otimizao do MySQL
405
discos podem ler o registro inteiro rpido o bastante para a maioria das aplicaes. Os nicos ca-
os 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 regis-
tros (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 trava-
mento 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 nes-
te 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 instantane-
amente. 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 ne-
cessrios para relatrios estaisticos so gerados apenas com base nas tabelas resumo que so ge-
radas 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 preci-
sa 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 n-
dices 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.
Otimizao do MySQL
406
Use colunas AUTO_INCREMENT para garantir valores nicos.
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 Ta-
bela do MySQL.
Quando estiver usando uma configurao de servidor Web normal, imagens devem ser armaze-
nadas 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 ca-
che 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 infor-
maes 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 pa-
ra armazenagem de dados que os diferentes servidores SQL suportam! Por exemplo, para aces-
sar tabelas MySQL MyISAM diretamente, voc pode obter um aumento de velocidade de 2-5 ve-
zes 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 elimi-
nados introduzindo comandos MyISAM de baixo nvel no servidor MySQL (isto pode ser a ma-
neira 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 ati-
va) 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 aces-
sos 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 r-
pida, 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 DE-
LAY_KEY_WRITE.
5.3. Detalhes sobre Locks
5.3.1. Como o MySQL Trava as Tabelas
Voc pode encontrar uma discusso sobre diferentes mtodos de bloqueios no apndice. See Sec-
o E.4, Mtodos de Lock.
Todos os bloqueios no MySQL so livres de deadlock, exceto para tipos de tabela InnoDB e BDB.
Isto gerenciado sempre requisitando todos os bloqueios necessrios de uma vez no comeo de uma
consulta e sempre bloqueando as tabelas na mesma ordem.
Otimizao do MySQL
407
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:
Se no existirem travas na tabela, coloque uma bloqueio de escrita na mesma.
Caso contrrio, coloca a requisio de trava na fila de bloqueios para escrita.
O mtodo de bloqueio que o MySQL utilizado para LEITURA funciona da seguinte maneira:
Se no existirem tarvas na tabela, coloca um bloqueio de leitura na mesma.
Caso contrrio, coloca a requisio de trava na fila de bloqueios para leitura.
Quando um bloqueio liberado, a trava fica disponvel para as threads na fila de bloqueios de escri-
ta, 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 SE-
LECT 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> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
Voc pode utilizar as opes LOW_PRIORITY com INSERT, UPDATE ou DELETE ou
HIGH_PRIORITY com SELECT se voc desejar priorizar a recuperao em alguns casos especfi-
cos. Tambm podei-se iniciar o mysqld com --low-priority-updates para obter o mesmo
comportamento.
Utilizar SQL_BUFFER_RESULT pode tambm tornar a criao de locks de tabelas mais curtos.See
Seco 6.4.1, Sintaxe SELECT .
Voc tambm pode alterar o cdigo de bloqueioss no mysys/thr_lock.c para usar uma fila
simples. Neste caso, bloqueios de escrita e leitura devem ter a mesma prioridade, o que pode ajudar
em algumas aplicaes.
5.3.2. Detalhes sobre Lock de Tabelas
O cdigo de bloqueio de tabelas no MySQL livre de deadlock.
O MySQL utiliza bloqueio de tabelas (no lugar de bloqueio de registros ou colnas) em todos os tipos
de tabelas, exceto tabelas BDB, para obter uma alta velocidade nos bloqueios. Para grandes tabelas,
bloqueio de tabelas MUITO melhor que bloqueio de registros para a maioria das aplicaes, mas
existem, claro, algumas desvantagens.
Para tabelas BDB e InnoDB, O MySQL s utiliza bloqueio de tabelas se voc bloquear explicita-
mente a tabela com LOCK TABLES ou executar um comando quer ir modificar todos os registros
na tabela, como ALTER TABLE. Para estes tipos de tabelas ns recomendamos a voc no utilizar
LOCK TABLES.
No MySQL verso 3.23.7 ou superior , voc pode inserir registros em tabelas MyISAM ao mesmo
Otimizao do MySQL
408
tempo que outras threads esto lendo da mesma tabela. Perceba que atualmente isto funciona so-
mente 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 au-
tomaticamente 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 atua-
lizao, 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 recu-
peram 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 pri-
oridade que SELECT, esta SELECT ir esperar pelo trmino da UPDATE. Ela tambm ir espe-
rar 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 es-
pao em disco seja disponvel.
Algumas solues possveis para este problema so:
Tente deixar suas instrues SELECT sempre rpidas. Voc pode ter que criar algumas tabelas
de resumo para fazer isto.
Inicie o mysqld com --low-priority-updates. Isto ir fornecer a todas instrues que
atualizam (modificam) uma tabela prioridade menor que uma instruo SELECT. Neste caso a
ltima instruo SELECT no cenrio anterior deveria executar antes da instruo INSERT.
Voc pode fornecer a uma instruo INSERT, UPDATE ou DELETE especfica menor priorida-
de com o atributo LOW_PRIORITY.
Inicie o mysqld com um valor baixo para max_write_lock_count para fornecer bloqueios de
LEITURA depois de um certo nmero de bloqueios de ESCRITA.
Voc pode especificar que todas as atualizaes de uma thread especfica deve ser feita utilizan-
do 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 MyI-
SAM, pois elas suportam SELECTs e INSERTs concorrentes.
Se voc utiliza principalmente instrues INSERT e SELECT misturadas, o atributo DELAYED
Otimizao do MySQL
409
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.
5.4. Otimizando a Estrutura de Banco de Da-
dos
5.4.1. Opes do Projeto
O MySQL mantem dados de registros e ndices em arquivos separados. Vrios (quase todos) bancos
de dados misturam dados de registros e ndice no mesmo arquivo. Ns acreditamos que a escolha do
MySQL melhor para uma ampla escala de sistemas modernos.
Outra forma de armazenar os dados de registros manter a informao para cada coluna em uma
rea separada (exemplos so o SDBM e o Focus). Isto ir causar um ponto de performance para toda
consulta que acessar mais de uma coluna. Como isto degrada rapidamente quando mais de uma co-
luna acessada, acreditamos que este modelo no bom para propsitos gerais de bancos de dados.
O caso mais comum aquele em que o ndice e dados so armazenados juntos (como no Oracle/Sy-
base). Neste caso voc ir encontrar a informao do registro na folha da pgina de ndice. A coisa
boa com este layout que ele, em vrios casos, dependendo de como o ndice armazenado no ca-
che, salva uma leitura de disco. As desvantagens deste layout so:
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).
mais difcil fazer o cache somente dos dados de ndices.
5.4.2. Deixando os Dados com o Menor Tamanho Pos-
svel
Uma das otimizaes mais bsicas tentar manter seus dados (e ndices) utilizando o menor espao
possvel no disco (e em memria). Isto pode fornecer grandes melhorias porque a leitura de disco
mais rpida e normalmente menos memria principal ser usada. A indexao tambm exige menos
recursos se for feita em colunas menores.
O MySQL suporta vrios diferentes tipos de tabelas e formatos de registros. Voc pode ter um ti-
mo ganho de performance escolhendo o formato certo de tabela a ser usada. See Captulo 7, Tipos
de Tabela do MySQL.
Pode-se obter melhor performance em uma tabela e minimizar espao de armazenagem utilizando as
tcnicas listadas abaixo:
Utilize os tipos mais eficientes (menores) sempre que possvel. O MySQL tem vrios tipos espe-
cializados que economizam espao em disco e memria.
Otimizao do MySQL
410
Utilize tipos inteiros menores se possvel para obter tabelas menores. Por exemplo, MEDIU-
MINT normalmente melhor que INT.
Declare colunas para serem NOT NULL se possvel. Isto deixa tudo mais rpido e voc econo-
miza um bit por coluna. Perceba que se voc realmente precisa de NULL nas suas aplicaes, po-
dem 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 for-
mato de registro de tamanho fixo para utilizado. Isto mais rpido mas infelizmente pode ocu-
par 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 Captu-
lo 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 pes-
quisando 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 inde-
xar somente este prefixo. O MySQL suporta um ndice em uma parte de uma coluna de caracte-
res. 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 aces-
sos 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 uti-
lizar um formato de tabela esttico que possa ser usada para encontrar os registros relevantes
quando se fizer uma varredura da tabela.
5.4.3. Como o MySQL Utiliza ndices
Os ndices so utilizados para encontrar registros com um valor especfico de uma coluna rapida-
mente. Sem um ndice o MySQL tem de iniciar com o primeiro registro e depois ler atravs de toda
a tabela at que ele encontre os registros relevantes. Quanto maior a tabela, maior ser o custo. Se a
tabela possui um ndice para as colunas em questo, o MySQL pode rapidamente obter uma posio
para procurar no meio do arquivo de dados sem ter que varrer todos os registros. Se uma tabela pos-
sui 1000 registros, isto pelo menos 100 vezes mais rpido do que ler todos os registros sequencial-
mente. Note que se voc precisar acessar quase todos os 1000 registros, seria mais rpido acess-los
sequencialmente porque evitaria acessos ao disco.
Todos os ndices do MySQL (PRIMARY, UNIQUE e INDEX) so armazenados em rvores B.
Strings so automaticamente compactadas nos espaos finais e prefixados. See Seco 6.5.7,
Sintaxe CREATE INDEX.
ndices so utilizados nos seguintes modos:
Para encontrar rapidamente os registros que coincidam com uma clusula WHERE.
Para recuperar registros de outras tabelas ao realizar joins.
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 to-
das as partes da chave < N. Neste caso o MySQL ir fazer uma simples procura na chave e tro-
car a expresso MIN() com uma constante. Se todas as expresses forem trocadas por constan-
tes, a consulta retornar imediatamente:
Otimizao do MySQL
411
SELECT MIN(key_part2),MAX(key_part2) FROM nome_tabela where key_part1=10
Para ordenar ou agrupar uma tabela se a ordenao ou agrupamento for feito em um 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 arqui-
vo 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
Suponha que voc utilize a seguinte instruo SELECT:
mysql> SELECT * FROM nome_tabela WHERE col1=val1 AND col2=val2;
Se um ndice de colunas mltiplas existir em col1 e col2, os registros apropriados podem ser re-
cuperados diretamente. Se ndices separados de nicas colunas existirem em col1 e col2, o otimi-
zador tentar encontrar o ndice mais restritivo decidindo qual ndice ir encontrar menos registros e
usar este ndice para recuperar os registros.
Se a tabela possuir um ndice de mltiplas colunas, qualquer prefixo mais esquerda do ndice pode
ser usado pelo otimizador para encontrar registros. Por exemplo, se voc possui um ndice de trs
colunas em (col1, col2, col3), voc tem capacidades de busca indexada em (col1),
(col1, col2) e (col1, col2, col3).
O MySQL no pode utilizar um ndice parcial se as colunas no formarem um prefixo mais es-
querda do ndice. Suponha que voc tenha as instrues SELECT mostradas abaixo:
mysql> SELECT * FROM nome_tabela WHERE col1=val1;
mysql> SELECT * FROM nome_tabela WHERE col2=val2;
mysql> SELECT * FROM nome_tabela WHERE col2=val2 AND col3=val3;
Se um ndice existir em (col1, col2, col3), somente a primeira consulta anteriores utiliza o
ndice. A segunda e terceira consultas involvem colunas indexadas, mas (col2) e (col2,
col3) no so os prefixos mais esquerda de (col1, col2, col3).
O MySQL tambm utiliza ndices para comparaes do tipo LIKE se o argumento para LIKE for
uma string constante que no inicie com um meta caracter Por exemplo as seguintes instrues SE-
LECT utilizam ndices:
mysql> SELECT * FROM nome_tbl WHERE key_col LIKE "Patrick%";
mysql> SELECT * FROM nome_tbl WHERE key_col LIKE "Pat%_ck%";
Na primeira instruo, somente os registros com "Patrick" <= key_col < "Patricl"
so considerados. Na segunda instruo, somente registros com "Pat" <= key_col < "Pau"
so considerados.
As seguintes instrues SELECT no usaro ndices:
mysql> SELECT * FROM nome_tbl WHERE key_col LIKE "%Patrick%";
mysql> SELECT * FROM nome_tbl WHERE key_col LIKE other_col;
Na primeira instruo, o valor LIKE inicia com um meta caracter. Na segunda instruo, o valor
LIKE no uma constante.
Otimizao do MySQL
412
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 oti-
mizar a consulta. Em outras palavras: Para poder usar um ndice, um prefixo do ndice deve ser utili-
zado 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 /* index_part_1 is not used */
... WHERE index=1 OR A=10 /* Index is not used in
both AND parts */
... WHERE index_part1=1 OR index_part2=10 /* No index spans all rows */
Perceba que algumas vezes o MySQL no utilizar um 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 ne-
cessitar 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 en-
contrar os poucos registros mais rapidamente e retornar o resultado.
5.4.4. ndices de Colunas
Todos os tipos de colunas do MySQL podem ser indexadas. O uso de ndices nas colunas relevantes
a melhor forma de melhorar a performance de operaes SELECT.
O nmero mximo de ndices por tabelas e o tamanho mximo de um ndice definido pelo meca-
nismo de armazenamento. See Captulo 7, Tipos de Tabela do MySQL. Todos os mecanismos de ar-
mazenamentos suportam um mnimo de 16 chaves por tabela e um ndice de tamanho total mnimo
de 256 bytes.
Para colunas CHAR e VARCHAR voc pode indexar um prefixo da coluna. Isto muito mais rpido e
necessita de menos espao em disco do que indexar a coluna inteira. A sintaxe para utilizar na ins-
truo CREATE TABLE para indexar um prefixo de uma coluna se parece com o exemplo a seguir:
INDEX nome_indice (nome_campo(tamanho))
O exemplo abaixo cria um ndice para os primeiros 10 caracteres da coluna nome:
mysql> CREATE TABLE teste (
nome CHAR(200) NOT NULL,
INDEX nome_indice (nome(10)));
Para colunas BLOB e TEXT, voc deve indexar um prefixo da coluna. O ndice pode ter at 255 by-
Otimizao do MySQL
413
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.
5.4.5. ndices de Mltiplas Colunas
O MySQL pode criar ndices em mltiplas colunas. Um ndice pode consistir de at 15 colunas. (Em
colunas CHAR e VARCHAR voc tambm pode utilizar um prefixo da coluna como parte de um ndi-
ce).
Um ndice de mltiplas colunas pode ser considerado um array ordenado contendo valores que so
criados concatenando valores de colunas indexadas.
O MySQL utiliza ndices de mltiplas colunas de forma que consultas so rpidas quando voc es-
pecifica uma quantidade conhecida para a primeira coluna do ndice em uma clusula WHERE, mes-
mo se voc no especificar valores para as outras colunas.
Suponha que uma tabela tenha a seguinte especificao:
mysql> CREATE TABLE teste (
id INT NOT NULL,
ultimo_nome CHAR(30) NOT NULL,
primeiro_nome CHAR(30) NOT NULL,
PRIMARY KEY (id),
INDEX nome (ultimo_nome,primeiro_nome));
Ento o ndice nome um ndice com ultimo_nome e primeiro_nome. O ndice ser usado
para consultas que especificarem valores em um limite conhecido para ultimo_nome, ou para
ambos ultimo_nome e primeiro_nome. Desta forma, o ndice nome ser usado nas seguintes
consultas:
mysql> SELECT * FROM teste WHERE ultimo_nome="Widenius";
mysql> SELECT * FROM teste WHERE ultimo_nome="Widenius"
AND primeiro_nome="Michael";
mysql> SELECT * FROM teste WHERE ultimo_nome="Widenius"
AND (primeiro_nome="Michael" OR primeiro_nome="Monty");
mysql> SELECT * FROM teste WHERE ultimo_nome="Widenius"
AND primeiro_nome >="M" AND primeiro_nome < "N";
Entretanto, o ndice nome no ser usado nas seguintes consultas:
mysql> SELECT * FROM teste WHERE primeiro_nome="Michael";
mysql> SELECT * FROM teste WHERE ultimo_nome="Widenius"
OR primeiro_nome="Michael";
Para maiores informaes sobre a maneira que o MySQL utiliza ndices para melhorar o desempe-
nho das consultas, veja Seco 5.4.3, Como o MySQL Utiliza ndices.
5.4.6. Como o MySQL Conta as Tabelas Abertas
Ao executar o comando mysqladmin status, voc ver algo deste tipo:
Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12
O valor Open tables de 12 ode ser bastante estranho se voc s possui 6 tabelas.
O MySQL multithreaded, portanto ele pode haver clientes enviando consultas para uma determi-
Otimizao do MySQL
414
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 des-
critor extra de arquivo necessrio para o arquivo de dados, para cada cliente que tem a tabela aber-
ta. 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.
5.4.7. Como o MySQL Abre e Fecha as Tabelas
As variveis do servidor table_cache, max_connections e max_tmp_tables afetam o
nmero mximo de arquivos que o servidor mantm abertos. Se voc aumentar um ou ambos destes
valores, voc pode ir contra um limite imposto pelo seu sistema operacional no nmero de arquivos
abertos por processo. Voc pode aumentar o limite de arquivos abertos em muitos sistemas operaci-
onais, embora o mtodo varia muito de um sistema para outro. Consulte a documentao de seu Sis-
tema Operacional para saber como faz-lo, porque o mtodo para alterar o limite varia muito de um
sistema para outro.
table_cache relacionado a max_connections. Por exemplo, para 200 conexes concorren-
tes em execuo, voc deve ter um tamanho de cache de tabela de pelo menos 200 * n, onde n
o nmero mximo de tabelas em um join. Voc tambm precisa reservar alguns descritores de arqui-
vos para tabelas e arquivos temporrios.
Esteja certo de que o seu sistema operacional pode tratar o nmero de descritores de arquivos aber-
tos definido pelo valor de table_cache. Se table_cache for muito alto, o MySQL pode esgo-
tar os descritores de arquivo e recusar conexes, falhar na execuo de consultas e ser muito insta-
vel. Voc tambm tm que levar em conta que o mecanismo de armazenamento MyISAM precisa de
dois descritores de arquivos para cada tabela aberta. Voc pode aumentar o nmero de descritores de
arquivo disponveis para o MySQL com a opo de inicializao --open-files-limit=#. See
Seco A.2.17, Arquivo No Encontrado.
A cache de tabelas abertas ser mantido em um nvel de table_cache entradas. O valor padro
64; isto pode ser alterado com a opo -O table_cache=# do mysqld. Note que o MySQL po-
de temporariamente abrir mais tabelas para poder se executar consultas.
Um tabela no usada fechada e removida da cache de tabelas sob as seguintes circuntncias:
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 algum executa mysqladmin refresh ou mysqladmin flush-tables.
Quando algum executa uma instruo FLUSH TABLES.
Quando o cache de tabela encher, o servidor usa o seguinte procedimento para encontrar uma entra-
da de cache para usar:
Tabelas que no estiverem em uso so liberadas, na ordem LRU (least-recently-used), ou seja, a
tabela que foi usada menos rcentemente.
Se o cache estiver cheio e nenhuma tabelas pode ser liberada, mas uma nova tabela precisar ser
aberta, o cache 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.
Otimizao do MySQL
415
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 con-
sulta (por exemplo, fazendo um join da tabela com ela mesma). A primeira abertura de qualquer ta-
bela 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 en-
tre 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 ope-
ned_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.
5.4.8. Desvantagem em Criar um Nmero Grande de
Tabelas no Mesmo Banco de Dados
Se voc possui muitos arquivos em um diretrio, operaes de abrir, fechar e criao ficaro lentos.
Se voc executar instrues SELECT em diversas tabelas, existir uma pequena sobrecarga quando
o cache de tabela estiver cheio, porque para toda tabela que teve que ser aberta, outra deve ser fecha-
da. Voc pode reduzir esta sobrecarga tornando o cache de tabelas maior.
5.5. Otimizando o Servidor MySQL
5.5.1. Sintonia dos Parmetros em Tempo de Sistema/
Compilao e na Inicializao
Ns iniciamos com o fator do nvel do sistema pois algumas destas decises devem ser feitas bem
cedo. Em outros casos uma rpida olhada para esta seo pode satisfazer porque ela no to impor-
tante para os grandes ganhos. Entretanto, sempre bom ter ter noes de como voc pode obter me-
lhorias alterando coisas neste nvel.
Qual sistema operacional a usar realmente importante! Para obter o melhor uso de mquinas com
mltiplas CPUs voc deve utilizar Solaris (porque a sua implemetao das threads funcionam muito
bem) ou Linux (porque o kernel 2.2 tem suporte SMP muito bom). Tambm, em Linux mais antigos
temos o limite de tamanho de arquivo de 2G por padro. Se voc tem tal kernel e precisa desespera-
damente de trabalhar com arquivos maiores que 2G em mquinas intel Linux, voc deve obter o
patch LFS para o sistema de arquivos ext2. Outros sistemas de arquivo como ReiserFS e XFS no
possuem esta limitao de 2G.
Como ainda no temos o MySQL em produo em muitas outras plataformas, ns aconselhamos
que voc teste a plataforma pretendida antes de escolhe-la, se possvel.
Outras dicas:
Se voc possui RAM suficiente, voc pode remover todos os dispositivos de troca. Alguns siste-
mas operacionais iro utilizar um disposotico de troca em alguns contextos, mesmo se voc pos-
suir memria livre.
Utilize a opo do MySQL --skip-external-locking para evitar locks externos. Perce-
Otimizao do MySQL
416
ba que isto no ir afetar a funcionalidade do MySQL se voc estiver executando um nico ser-
vidor. 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 funcio-
nam 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 to-
talmente 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 utili-
zando --skip-external-locking.
5.5.2. Parmetros de Sintonia do Servidor
Voc pode determinar tamanho padro do buffer usados pelo servidor mysqld com este comando:
shell> mysqld --help
Este comando produz uma lista de todas as opes do mysqld e variveis configurveis. A sada
inclui os valores padro das variveis e se parece com isto:
back_log current value: 5
bdb_cache_size current value: 1048540
binlog_cache_size current value: 32768
connect_timeout current value: 5
delayed_insert_timeout current value: 300
delayed_insert_limit current value: 100
delayed_queue_size current value: 1000
flush_time current value: 0
interactive_timeout current value: 28800
join_buffer_size current value: 131072
key_buffer_size current value: 1048540
lower_case_nome_tabelas current value: 0
long_query_time current value: 10
max_allowed_packet current value: 1048576
max_binlog_cache_size current value: 4294967295
max_connections current value: 100
max_connect_errors current value: 10
max_delayed_threads current value: 20
max_heap_table_size current value: 16777216
max_join_size current value: 4294967295
max_sort_length current value: 1024
max_tmp_tables current value: 32
max_write_lock_count current value: 4294967295
myisam_sort_buffer_size current value: 8388608
net_buffer_length current value: 16384
net_retry_count current value: 10
net_read_timeout current value: 30
net_write_timeout current value: 60
read_buffer_size current value: 131072
record_rnd_buffer_size current value: 262144
slow_launch_time current value: 2
sort_buffer current value: 2097116
table_cache current value: 64
thread_concurrency current value: 10
tmp_table_size current value: 1048576
thread_stack current value: 131072
wait_timeout current value: 28800
Otimizao do MySQL
417
Se existir um servidor mysqld em execuo, voc pode ver quais valores ele est usando atualmen-
te 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 este-
jam 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:
Use safe_mysqld em vez de mysqld_safe.
Configure as variveis usando a sintaxe --set-variable=name=value ou -O na-
me=value
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 v-
rias 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 &
Otimizao do MySQL
418
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 acele-
rar 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 op-
o 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.
5.5.3. Como a Compilao e a Ligao Afetam a Velo-
cidade do MySQL
A maioria dos testes seguintes so feitos no Linux com os benchmarks do MySQL, mas eles devem
fornecer alguma indicao para outros sistemas operacionais e workloads.
Voc obtm um executvel mais veloz quando ligado com -static.
No Linux, voc ir obter o cdigo mais rpido quando compilando com pgcc e -03. Para compilar
sql_yacc.cc com estas opes, voc precisa de cerca de 200M de memria porque o gcc/
pgcc precisa de muita memria para criar todas as funes em linha. Tambm deve ser configurado
o parmetro CXX=gcc para evitar que a biblioteca libstdc++ seja incluida (no necessria).
Perceba que com algumas verses do pgcc, o cdigo resultante ir executar somente em verdadei-
ros processadores Pentium, mesmo que voc utilize a opo do compilador para o cdigo resultante
que voc quer, funcionando em todos os processadores do tipo x586 (como AMD).
S pelo fato de utilizar um melhor compilador e/ou melhores opes do compilador voc pode obter
um aumento de desempenho de 10-30% na sua aplicao. Isto particularmente importante se voc
mesmo compila o servidor SQL!
Ns testamos ambos os compiladores Cygnus Codefusion e o Fujitsu, mas quando os testamos, ne-
nhum dos dois era suficientemente livre de erros para que o MySQL compilasse com as otimiza-
es.
Quando voc compila o MySQL deve incluir suporte somente para os conjuntos de caracteres que
deseja usar. (Opo --with-charset=xxx). As distribuies binrias padro do MySQL so
compiladas com suporte para todos os conjuntos de caracteres.
Segue uma lista de algumas medidas que temos feito:
Otimizao do MySQL
419
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 clien-
te. s o servidor que crtico para performance.
Se voc corta seu binrio mysqld com strip libexec/mysqld, o binrio gerado pode fi-
car at 4% mais rpido.
Para uma conexo de um cliente para um servidor em execuo na mesma mquina, se voc co-
necta 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 ou-
tra 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 crptogra-
fados 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 veri-
ficao 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 que gcc 3.2.
Em um Sun UltraSPARC-IIe, Forte 5.0 4% mais rpido em modo de 32 bits que em modo de
64 bits.
Compilando com gcc 2.95.2 para o ultrasparc com a opo -mcpu=v8 -
Wa,-xarch=v8plusa melhora a performance em 4%.
No Solaris 2.5.1, a MIT-pthreads 8-12% mais lenta do que as threads nativas do Solaris em um
nico processador. Com mais carga/CPUs a diferena deve aumentar.
Executar com --log-bin deixa o mysqld 1 % mais lento.
Compilando no Linux-x86 com gcc sem frame pointers -fomit-frame-pointer ou -
fomit-frame-pointer -ffixed-ebp deixa o mysqld 1-4% mais rpido.
A distribuio MySQL-Linux fornecida pela MySQL AB normalmente compilada com pgcc,
mas vamos retornar ao uso do gcc pelo fato de um bug no pgcc que gera o cdigo que no executa
no AMD. Continuaremos a usar o gcc at que o bug seja resolvido. Neste meio tempo, se voc pos-
sui uma mquina que no seja AMD, voc pode ter um binrio mais rpido compilando com o
pgcc. O binrio padro do MySQL para Linux ligado estaticamente para conseguir mais desem-
penho e ser mais portvel.
5.5.4. Como o MySQL Utiliza a Memria
A lista abaixo indica algumas das maneiras inas quais o servidor mysqld utiliza a memria. Onde
aplicvel, o nome da varivel do servidor relevante ao uso de memria fornecido:
O buffer de chave (varivel key_buffer_size) compartilhado por todas as threads; Outros
buffers usados pelo servido so alocados quando necessrios. See Seco 5.5.2, Parmetros de
Sintonia do Servidor.
Otimizao do MySQL
420
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 aumen-
tados dinamicamente para max_allowed_packet quando necessrio. Quando uma consulta
est sendo executada, uma cpia da string da consulta atual tambm alocada.
Todas as threads compartilhas a mesma memria base.
Somente as tabelas ISAM e MyISAM compactadas so mapeadas em memria. Isto porque o
espao de memria de 32-bits de 4GB no grande o bastante para a maioria das grandes tabe-
las. Quando sistemas com endereamento de 64-bits se tornarem comuns poderemos adicionar
um suporte gieral para o mapeamento de memria.
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 re-
ad_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 ta-
manho 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 tempo-
rria 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 Armaze-
na Arquivos Temporrios.
Quase todas as anlises e clculos so feitos em um armazenamento de memria local. Nenhuma
sobrecarga de memria necessrio para tens pequenos e a alocao e liberao normal de me-
mria lenta evitada. A memria alocada somente para grandes strings inesperadas; isto fei-
to com malloc() e free().
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 tama-
nho 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 va-
lores 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.
Um comando mysqladmin flush-tables fecha (ou instrues FLUSH TABLES) todas
tabelas que no esto em uso e marca todas tabelas em uso para serem fechadas quando a thread
Otimizao do MySQL
421
atualmente em execuo terminar. Isto ir liberar efetivamente a maioria da memria em uso.
ps e outros programas de informaes do sistema podem relatar que o mysqld usa muita memria.
Isto pode ser causado pelas pilhas de threads em diferentes endereos de memria. Por exemplo, a
verso do ps do Solaris conta a memria no usada entre as pilhas como memria usada. Voc pode
verificar isto conferindo a memria disponvel com swap -s. Temos testado o mysqld com de-
tectores comerciais de perda de memria, portanto tais perdas no devem existir.
5.5.5. Como o MySQL Utiliza o DNS
Quando um novo cliente conecta ao mysqld, o mysqld extende uma nova thread para lidar com o
pedido. Esta thread primeiro confere se o nome da mquina est no cache de nomes de mquinas. Se
no, a thread tenta resolver o nome da mquina.
Se o sistema operacional suporta as chamadas seguras com thread gethostbyaddr_r() e
gethostbyname_r(), a thread as utiliza para fazer a resoluo do nome mquina.
Se o sistema operacional no suporta as chamadas de threads seguras, a thread trava um mutex e
chama gethostbyaddr() e gethostbyname(). Perceba que neste caso nenhuma outra
thread pode resolver outros nomes de mquinas que no existam no cache de nomes de mquina
at que a primeira thread esteja destrave o mutex.
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 pri-
vilgio 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.
5.5.6. Sintaxe de SET
SET [GLOBAL | SESSION] sql_variable=expression,
[[GLOBAL | SESSION] sql_variable=expression] ...
SET configura vrias opes que afetam a operao do servidor ou seu cliente.
Os seguintes exemplos mostram as diferentes sintaxes que se pode usar para configurar variveis:
Em verses antigas do MySQL permitiamos o uso da sintaxe SET OPTION, mas esta sintaxe agora
est obsoleta.
No MySQL 4.0.3 adicionamos as opes GLOBAL e SESSION e acessamos as variveis de iniciali-
zao mais importantes.
LOCAL pode ser usado como sinniumo de SESSION.
Se voc define diversas variveis na mesma linha de comando, o ltimo modo GLOBAL | SES-
SION utilizado
SET sort_buffer_size=10000;
SET @@local.sort_buffer_size=10000;
Otimizao do MySQL
422
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;
SET @@sort_buffer_size=1000000;
SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;
A sintaxe @@nome_varivel suoprtada para tornar a sintaxe do MySQL compatvel com ou-
tros bancos de dados.
As diferentes variveis de sistema que podem ser configuradas esto descritas na seo de variveis
de sistema deste manual. See Seco 6.1.5, Variveis de Sistema.
Se voc estiver usando SESSION (o padro) a opo que voc definir ter efeito at que o sesso
atual finalize ou at que vec atribua um valor diferente a esta opo. Se voc estiver usando GLO-
BAL, que exige o privilgio SUPER, a opo lembrada e usada pelas novas conexes at que o ser-
vidor reinicie. Se voc quiser tornar uma opo permanente, voc deve defin-la em um arquivo de
opo. See Seco 4.1.2, Arquivo de Opes my.cnf.
Para evitar o uso incorreto, o MySQL exibir um erro se voc usar SET GLOBAL com uma varivel
que s pode ser usada com SET SESSION ou se voc no estiver usando SET GLOBAL com uma
varivel global.
Se voc quiser definir uma varivel SESSION com um valor GLOBAL ou um valor GLOBAL ao va-
lor padro do MySQL, voc pode configur-lo com DEFAULT.
SET max_join_size=DEFAULT;
Isto idntico a:
SET @@session.max_join_size=@@global.max_join_size;
Se voc quiser restringir o valor mximo com o qual uma varivel de servidor pode ser configurado
com o comando SET, voc pode especifica-lo usando a opo de linha de comando -
-maximum-variable-name. See Seco 4.1.1, Opes de Linha de Comando do mysqld.
Voc pode obter uma lista da maioria das variveis com SHOW VARIABLES. See Seco 4.6.8.4,
SHOW VARIABLES. Voc pode obter o valor de uma varivel especfica com a sintaxe
@@[global.|local.]variable_name:
SHOW VARIABLES like "max_join_size";
SHOW GLOBAL VARIABLES like "max_join_size";
SELECT @@max_join_size, @@global.max_join_size;
Segue aqui a descrio das variveis que usam uma sintaxe SET no padro e algumas das outras
variveis. A definio das outras variveis podem ser encontrados na seo variveis de sistema, en-
tre as opes de inicializao ou na descrio de SHOW VARIABLES. See Seco 6.1.5, Variveis
de Sistema. See Seco 4.1.1, Opes de Linha de Comando do mysqld. See Seco 4.6.8.4,
SHOW VARIABLES.
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 COM-
MIT/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-AUTO-
COMMIT para AUTOCOMMIT, o MySQL ir fazer um COMMIT automtico em quaisquer transa-
es abertas.
BIG_TABLES = 0 | 1
Se definido com 1, todas as tabelas temporrias so armazenadas no disco em vez de o ser na
Otimizao do MySQL
423
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 pa-
dro 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 pa-
rmetro j que o MySQL converter automaticamente tabelas em memria para tabelas em disco
se isto for necessrio.
CHARACTER SET nome_conjunto_caracteres | DEFAULT
Mapeia todas as strings do e para o cliente com o mapa especificado. Atualmente a nica opo
para character_set_name cp1251_koi8, mas voc pode adicionar novos mapas edi-
tando o arquivo sql/convert.cc na distribuio fonte do MySQL. O mapeamento padro
pode ser restaurado utilizando o valor DEFAULT para character_set_name.
Perceba que a sintaxe para configurar a opo CHARACTER SET diferente da sintaxe para
configurar as outras opes.
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 dispon-
vel 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 atuali-
zaes 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.
MAX_JOIN_SIZE = value | DEFAULT
No permite que SELECTs que provavelmente necessitem examinar mais que valor combina-
es de registros. Configurando este valor, voc pode obter SELECTs onde chaves no so usa-
das corretamente e que provavelmente gastaro um bom tempo. Configurando-o para um valor
diferente do DEFAULT ir definir o atributo SQL_BIG_SELECTS com o padro. Se voc confi-
gurar o atributo SQL_BIG_SELECTS novamente, a varivel SQL_MAX_JOIN_SIZE ser ig-
norada. Voc pode configurar um valor padro para esta varivel iniciando o mysqld com -O
max_join_size=#. Esta opo era chamada SQL_MAX_JOIN_SIZE
Note que se o resultado da consulta ja estiver na cache de consultas, o verificaio acima no se-
r feita. O MySQL ir enviar o resultado ao cliente. Uma vez que o resultado da consulta j foi
consultado e no ser responsabilidade do servidor enviar o resultado ao cliente.
PASSWORD = PASSWORD('alguma senha')
Configura a senha para o usurio atual. Qualquer usurio que no seja annimo pode alterar sua
Otimizao do MySQL
424
prpria senha!
PASSWORD FOR user = PASSWORD('alguma senha')
Configura a senha para um usurio especfico no servidor atual. Somente um usurio com acesso
ao banco de dados mysql pode fazer isto. O usurio deve ser fornecido no formato usu-
rio@home_maquina, onde usurio e nome_mquina so exatamente o que esto lista-
dos nas colunas User e Host da tabela mysql.user. Por exemplo, se voc possui uma entra-
da com os campos User e Host com 'bob' e '%.loc.gov', voc escreveria:
mysql> SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass');
Que equivalente a:
mysql> UPDATE mysql.user SET Password=PASSWORD('newpass')
-> WHERE User='bob' AND Host='%.loc.gov';
mysql> FLUSH PRIVILEGES;
QUERY_CACHE_TYPE = OFF | ON | DEMAND , QUERY_CACHE_TYPE = 0 | 1 |
2
Define a configurao da cache de consultas para esta thread. Set query cache setting for this th-
read.
Opo Descrio
0 ou OFF No armazena ou recupera resultados.
1 ou ON Armazena todos os resultados, exceto consultas SELECT
SQL_NO_CACHE ....
2 ou DEMAND Armazena apenas consultas SELECT SQL_CACHE ....
SQL_AUTO_IS_NULL = 0 | 1
Se configurado com 1 (padro) o ltimo registro inserido em uma tabela com um regitro au-
to_incremnto pode ser encontrado com a seguinte construo: WHERE au-
to_increment_column IS NULL. Isto usado por alguns programas ODBC como o Ac-
cess.
SQL_BIG_SELECTS = 0 | 1
Se configurado com 0, o MySQL aborta as instrues SELECTs que provavelmente levam mui-
to tempo (isto , instrues para as quais o otimizador estima que o nmero de registros exami-
nados provavelmente ir exceder o valor de MAX_JOIN_SIZE. Isto til quando uma instru-
o WHERE no aconselhada for utilizado. O valor padro para uma nova conexo 1 (que per-
mitir qualquer instruo SELECT).
Se voc definir MAX_JOIN_SIZE com um valor diferente de DEFAULT,
SQL_BIG_SELECTS ser definida com 0.
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 ca-
sos 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
Otimizao do MySQL
425
utilizar uma chave ou LIMIT na clusula WHERE. Desta forma possvel capturar atualizaes
erradas ao criarmos comandos SQL manualmente.
SQL_SELECT_LIMIT = valor | DEFAULT
O nmero mximo de registros para retornar de instrues SELECT. Se uma SELECT tem uma
clusula LIMIT, o LIMIT tem precedencia sobre o valor de SQL_SELECT_LIMIT. O valor
padro para uma nova conexo ``unlimited'' (ilimitado). Se voc alterou o limite, o valor pa-
dro pode ser restaurado atribuindo o valor DEFAULT a SQL_SELECT_LIMIT.
SQL_LOG_OFF = 0 | 1
Se configurado com 1, nenhum registro ser feito no log padro para este cliente, se o cliente ti-
ver 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 cli-
ente 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.
TIMESTAMP = valor_timestamp | DEFAULT
Configura a hora/data para este cliente. usado para obter a hora e data original se voc utiliza o
log de atualizaes para restaurar registros. valor_timestamp deve ser um timestamp UNIX
Epoch, no um timestamp MySQL.
TIME_FORMAT = format_str
Determina como o servidor converte valores TIME para string. Esta varivel est disponvel co-
mo uma opo global, local ou de linha de comando. format_str pode ser especificada con-
venientemente usando a funo GET_FORMAT(). Veja See Seco 6.3.4, Funes de Data e
Hora.
5.6. Detalhes de Disco
Como mencionado acima, pesquisas em disco so o maior gargalo de desempenho. Estes proble-
mas ficam cada vez mais aparentes quando os dados comeam a crescer tanto que efetivo arma-
zenamento 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) li-
gando arquivos simbolicamente em diferentes discos ou utilizando striping de discos.
Usando links simblicos
Significa que, para tabelas MyISAM, voc liga simbolicamente o ndice e/ou arquivos de da-
dos ao local comum no diretrio de dados em outro disco (que pode tambm ser striped). Is-
to torna os tempos de pesquisa e leitura melhor (Se os discos no so usados para outras coi-
Otimizao do MySQL
426
sas). See Seco 5.6.1, Utilizando Links Simblicos.
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 tama-
nho do bloco (ou perfeitamente alinhado) voc ir obter um desempenho muito melhor. Stri-
ping 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. De-
pendendo de como voc configura os parmetros do striping e do nmero de discos voc po-
de obter uma diferena de vrias ordens de grandeza. Note que voc deve escolher a otimiza-
o 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 al-
gum 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 exem-
plo, 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 bac-
kups 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 real-
mente 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.)
5.6.1. Utilizando Links Simblicos
Voc pode mover tabelas e bancos de dados do diretrio de banco de dados para outras localizaes
e troc-los por links simblicas para os novos locais. Voc pode fazer isto, por exemplo, para mover
um banco de dados para um sistema de arquivos com mais espao livre ou aumentar a velocidade de
Otimizao do MySQL
427
seu sistema esipalhando suas tabelas para discos diferentes.
A maneira recomendada de se fazer isto ligar simbolicamente bancos de dados a discos diferentes
e s ligar tabelas como ltimo recurso.
5.6.1.1. Utilizando Links Simblicos para Bancos de Dados
No Unix, a maneira de ligar simbolicamente um banco de dados , primeiramente, criar um diretrio
em algum disco onde voc possui espao livre e ento criar uma ligao simblica para ele a partir
do diretrio do banco de dados do MySQL.
shell> mkdir /dr1/databases/test
shell> ln -s /dr1/databases/test mysqld-datadir
O MySQL no suporta que voc ligue um diretrio a vrios bancos de dados. Trocando um diretrio
de banco de dados com uma ligao simblica ir funcionar bem desde que no sejam feitos links
simblicos entre os bancos de dados. Suponha que voc tenha um banco de dados db1 sob o diret-
rio de dados do MySQL, e ento criar uma ligao simblica db2 que aponte para db1.
shell> cd /caminho/para/diretorio/dados
shell> ln -s db1 db2
Agora, para qualquer tabela tbl_a em db1, tambm aparecer uma tabela tbl_a em db2. Se
uma thread atualizar db1.tbl_a e outra atualizar db2.tbl_a, ocorrero porblemas.
Se voc realmente precisar disto, voc deve alterar o cdigo seguinte em mysys/mf_format.c:
if (flag & 32 || (!lstat(to,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
para
if (1)
No Windows voc pode utilizar links simblicos para diretrios compilando o MySQL com -
DUSE_SYMDIR. Isto lhe permite colocar diferentes bancos de dados em discos diferentes. See Sec-
o 5.6.1.3, Usando Links Simblicos para Bancos de Dados no Windows.
5.6.1.2. Utilizando Links Simblicos para Tabelas
Antes do MySQL 4.0 voc no deve utilizar tabelas com ligaes simblicas, se voc no tiver mui-
to cuidado com as mesmas. O problema que se voc executar ALTER TABLE, REPAIR TABLE
ou OPTIMIZE TABLE em uma tabela ligada simbolicamente, os links simblicos sero removidas
e substituidos pelos arquivos originiais. Isto acontece porque o comando acima funcinoa criando um
arquivo temporrio no diretrio de banco de dados e quando o comando completo, substitui o ar-
quivo original pelo arquivo temporrio.
Voc no deve ligar simbolicamente tabelas em um sistema que no possui uma chamada real-
path() completa. (Pelo menos Linux e Solaris suportam realpath()
No MySQL 4.0 links simblicos s so suportados completamente por tabelas MyISAM. Para outros
tipos de tabelas voc provavelmente obter problemas estranhos ao fazer qualquer um dos coman-
dos mencionados acima.
O tratamento de links simblicos no MySQL 4.0 funciona da seguinte maneira (isto mais relevante
somente para tabelas MyISAM.
No diretrio de dados voc sempre ter o arquivo de definies das tabelas e os arquivos de ndi-
ce e o arquivo de dados. O arquivo de dados e o arquivo de ndice podem ser movidos para qual-
quer lugar e substituidos no diretorio de dados pelos links simblicos. O arquivo de definio
Otimizao do MySQL
428
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.
myisamchk no ir substituir um link simblico pelo ndice/arquivo. Ele funciona diretamente
nos arquivos apontados pelos links simblicos. Qualquer arquivo temporrio ser criado no mes-
mo diretrio que o arquivo de dados/ndice est.
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 dire-
trio de dados.
O que ainda no suportado:
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 instru-
es CREATE TABLE.
BACKUP TABLE e RESTORE TABLE no respeitam links simblicos.
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 diret-
rio db1 que aponmta para tbl1:
shell> cd /path/to/datadir/db1
shell> ln -s tbl1.frm tbl2.frm
shell> ln -s tbl1.MYD tbl2.MYD
shell> ln -s tbl1.MYI tbl2.MYI
Agora se uma thread l db1.tbl1 e outra thread atualiza db1.tbl2, haver problemas: a ca-
che de consultas ser enganada (ela acreditar que tbl1 no foi atualizado e retornar resulta-
dos desatualizados), o comando ALTER em tbl2 tambm ir falhar.
5.6.1.3. Usando Links Simblicos para Bancos de Dados no Win-
dows
A partir do MySQL verso 3.23.16, o mysqld-max e servidores mysql-max-nt na distribuio
MySQL so compilados com a opo -DUSE_SYMDIR. Isto permite que voc coloque um diretrio
Otimizao do MySQL
429
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 tabe-
las 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 ha-
bilitamos esta opo por padro, mesmo se voc compilar o MySQL com suporte a isto. Para habili-
tar 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.
Otimizao do MySQL
430
Captulo 6. Referncia de Linguagem
do MySQL
O MySQL possui uma interface SQL muito complexa mas intuitiva e fcil de aprender. Este captu-
lo descreve os vrios comandos, tipos e funes que voc precisa conhecer para usar o MySQL de
maneira eficiente e efetiva. Este captulo tambm serve como referncia para todas as funcionalida-
des includas no MySQL. Para poder utilizar este captulo eficientemente, voc deve achar til fazer
referncia aos vrios ndices.
6.1. Estrutura da Linguagem
6.1.1. Literais: Como Gravar Strings e Numerais
Esta seo descreve as diversas maneiras para gravar strings e nmeros no MySQL. Ela tambm co-
bre as vrias nuances e ``pegadinhas'' pelas quais voc pode passar ao lidar com estes tipos bsicos
no MySQL.
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 come-
am com uma barra invertida ('\'), conhecida como caracter de escape. O MySQL reconhece a se-
guinte 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 pro-
blema 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 < no-
me_arquivo).
\\
O caracter de barra invertida ('\') character.
\%
Um caracter '%'. Ele pode ser usado para pesquisar por instncias literais de '%' em contextos on-
de '%' 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 '""'.
Voc pode preceder o caracter de aspas com um caracter de escape ('\').
Um ''' dentro de uma string com '"' no precisa de tratamento especial e no precisa ser duplica-
da ou utilizada com caracter de escape. Da mesma maneira, '"' dentro de uma string com ''' no
necessita de tratamento especial.
As instrues SELECT exibidas abaixo demonstram como citaes e escapes funcionam:
mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "This\nIs\nFour\nlines";
+--------------------+
| This
Is
Four
Referncia de Linguagem do MySQL
432
lines |
+--------------------+
Se voc deseja inserir dados binrios em uma coluna BLOB, os caracteres a seguir devem ser repre-
sentados 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() pa-
ra 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 espe-
ciais 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 caracte-
res 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 ne-
gativo.
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.
6.1.1.3. Valores Hexadecimais
Referncia de Linguagem do MySQL
433
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 dgi-
tos 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 he-
xadecimal uma string. Se voc deseja estar certo que a string tratado como um nmero, voc po-
de usar CAST( ... AS UNSIGNED) no valor hexadecimal.
A sintaxe x'stringhexa' (nova na verso 4.0) baseada no padro SQL e a sintaxe 0x basea-
da 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 fun-
o HEX().
6.1.1.4. Valores NULL
O valor NULL significa ``sem dados'' e diferente de valores como 0 para tipos numricos ou
strings vazias para tipos string. See Seco A.5.3, Problemas com Valores NULL.
NULL pode ser representado por \N ao usar o formato de arquivo texto para importao ou exporta-
o (LOAD DATA INFILE, SELECT ... INTO OUTFILE). See Seco 6.4.8, Sintaxe LOAD
DATA INFILE.
6.1.2. Nomes de Banco de dados, Tabela, ndice, Colu-
na e Alias
Nomes de banco de dados, tabela, ndice, coluna e apelidos seguem todos as mesmas regras no
MySQL.
Note que as regras foram alteradas a partir do MySQL verso 3.23.6, quando introduzimos aspas em
identificadores (nomes banco de dados, tabela e coluna) com '`'. '"' funcionar tambm para citar
identificadores se voc executar no modo ANSI. See Seco 1.8.2, Executando o MySQL no modo
ANSI.
Identificador Tamanho
mximo
(bytes)
Caracteres permitidos
Banco de da-
dos
64 Qualquer caractere que permitido em um nome de diretrio exceto
'/' ou '.'.
Tabela 64 Qualquer caractere permitido em um nome de arquivo, exceto '/' ou
'.'.
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;
Referncia de Linguagem do MySQL
434
See Seco 6.1.7, Tratamento de Palavras Reservadas no MySQL.
Se voc estiver executando o MySQL no modo MAXDB ou ANSI_QUOTES, ele tambm pode citar
identificadores com aspas duplas:
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax. (...)
mysql> SET SQL_MODE="ANSI_QUOTES";
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
See Seco 4.1.1, Opes de Linha de Comando do mysqld.
Em verses do MySQL anteriores a 3.23.6, as regras se nomes eram as seguintes:
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 Uti-
lizado 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 amb-
gua. 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 Coluna nome_campo de qualquer tabela usada na consulta
contendo uma coluna com aquele nome.
nome_tabela.nome_campo Coluna nome_campo da tabela nome_tabela do banco de
dados atual.
no-
me_bd.nome_tabela.nome
_campo
Coluna nome_campo da tabela nome_tabela do banco de
dados nome_bd. Esta forma disponvel no MySQL Verso
3.22 ou posterior.
`nome_coluna` Uma coluna que uma palavra chave ou contem caracteres es-
peciais.
Voc no precisa especificar um prefixo de nome_tabela ou nome_bd.nome_tabela para
uma referncia de coluna em uma instruo, a menos que a referncia seja ambgua. Por exemplo,
suponha que cada tabela t1 e t2 contenham uma coluna c, e voc deve recuperar c em uma instru-
o SELECT que utiliza ambas tabelas t1 e t2. Neste caso, c ambguo porque ele no nico en-
tre as tabelas usadas na instruo, portanto deve ser indicado qual a tabela que se deseja escrever,
t1.c ou t2.c. De mesma forma, se voc for recuperar de uma tabela t em um banco de dados
db1 e uma tabela t em um banco de dados db2, voc deve se refererir s colunas nestas tabelas co-
mo db1.t.nome_campo e db2.t.nome_campo.
A sintaxe .nome_tabela indica a tabela nome_tabela no banco de dados atual. Esta sintaxe
aceitada para compatibilidade ODBC, porque alguns programas ODBC prefixam os nomes das tabe-
las com um caracter '.'.
6.1.3. Caso Sensitivo nos Nomes
Referncia de Linguagem do MySQL
435
No MySQL, bancos de dados e tabelas correspondem a diretrios e arquivos em seus diretrios.
Consequentemente, o caso sensitivo no sistema operacional ir determinar o caso sensitivo nos no-
mes de bancos de dados e tabelas. Isto significa que nomes de bancos de dados e tabelas so caso
sensitivo na maioria dos Unix e caso insensitivo no Windows. Uma exceo proeminente aqui o
Mac OS X, quando o o sistema de arquivos padro HPS+ est sendo usado. No entanto o Mac OS X
tambm suporta volumes UFS, esle so caso sensitivo no Mac OS X assim como so no Unix. See
Seco 1.8.3, Extenses do MySQL para o Padro SQL-92.
NOTA: Apesar de nomes de bancos e tabelas serem caso insensitivo no Windows, voc no deve
fazer referncia a um certo banco de dados ou tabela utilizando casos diferentes na mesma consulta.
A consulta a seguir no deve funcionar porque ela chama uma tabela como minha_tabela e ou-
tra como MINHA_TABELA.
mysql> SELECT * FROM minha_tabela WHERE MINHA_TABELA.col=1;
Nomes de colunas no so caso sensitivo em todas as circunstncias.
Aliases nas tabelas so caso sensitivo. A consulta seguinte no deve funcionar porque ela faz refe-
rncia ao alias como a e como A.
mysql> SELECT nome_campo FROM nome_tabela AS a
WHERE a.nome_campo = 1 OR A.nome_campo = 2;
Se voc tem um problema para lembrar o caso usado para os nomes de tabelas, adote uma conven-
o consistente, como sempre criar bancos de dados e tabelas utilizando nomes em minsculas.
Uma maneira para evitar este problema iniciar o mysqld com -O lo-
wer_case_nome_tabelas=1. Por padro esta opo 1 no Windows e 0 no Unix.
Se lower_case_nome_tabelas for 1, o MySQL ir converte todos os nomes de tabelas para
minsculo no armazenamento e pesquisa. (A partir da verso 4.0.2, esta opo tambm se aplica ao
nome do banco de dados. A partir da 4.1.1 isto tambm se aplica a alias de tabelas). Perceba que se
voc alterar esta opo, ser necessrio converter primeiramente seus nomes de tabelas antigos para
minsculo antes de iniciar o mysqld.
Se voc mover os arquivos MyISAM do Windows pare o Unix, voc pode, em alguns casos, precisar
usar a ferramenta mysql_fix_extensions para corrigir o caso ad extenso do arquivo em cada
diretrio de banco de dados especfico (.frm em letra minscula, .MYI e .MYD em letras maiscu-
las). mysql_fix_extensions pode ser encontado no subdiretrio scripts.
6.1.4. Variveis de Usurio
O MySQL suporta variveis especficas da conexo com a sintaxe @nomevarivel. Um nome de
varivel pode consiste de caracteres alfanumricos do conjunto de caracteres atual e tambm '_', '$'
e '.'. O conjunto de caracteres padro ISO-8859-1 Latin1; ele pode ser alterado com a opo -
-default-character-set do mysqld. See Seco 4.7.1, O Conjunto de Caracteres Utiliza-
do para Dados e Ordenao. Os nomes das variveis de usurios so caso insensitivo nas verso >=
5.0 e caso sensitivo nas verses < 5.0.
As variveis no precisam ser inicializadas. Elas contm NULL por padro e podem armazenar um
valor inteiro, real ou uma string. Todas as variveis de uma thread so automaticamente liberadas
quando uma thread termina.
Voc pode configurar uma variavel com a syntaxe SET.
SET @varivel= { expressao inteira | expressao real | expressao string }
[,@varivel= ...].
Voc tambm pode atribuir um valor a uma varivel em outras instrues diferentes de SET. No en-
tanto, neste caso o operador de atribuio := em vez de =, porque = reservado para comparaes
Referncia de Linguagem do MySQL
436
em instrues diferentes de SET:
mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+
Variveis de usurios devem ser utilizadas em expresses onde so permitidas. Isto no inclui utili-
za-las em contextos onde um nmero explicitamente necessrio, assim como na clusula LIMIT
de uma instruo SELECT ou a clausula IGNORE number LINES de uma instruo LOAD DA-
TA.
NOTE: Em uma instruo SELECT , cada expresso s avaliada quando enviada ao cliente. Isto
significa que nas clusula HAVING, GROUP BY, ou ORDER BY, voc no pode fazer referncia a
uma expreeso que envolve variveis que so configuradas na instruo SELECT. Por examplo, a
seguinte instruo NO funcionar como o esperado:
SELECT (@aa:=id) AS a, (@aa+3) AS b FROM nome_tabela HAVING b=5;
A razo que o @aa no ir conter o valor da linha atual, mas o valor da id da linha previamente
aceita.
A regra geral nunca atribuir e usar a mesma varivel na mesma instruo.
Outra questo com configurar uma varivel e us-la na mesma instruo que o tipo do resultado
padro de uma varivel baseada no tipo da varivel no incio da instruo. (Assume-se que uma
varivel no atribuda possui o valor NULL e do tipo STRING). O seguitne exemplo ilustra isto:
mysql> SET @a="test";
mysql> SELECT @a,(@a:=20) FROM table_name;
Neste caso o MySQL relatar ao cliente que a coluna 1 uma string e converte todos os acessos de
@a a strings, mesmo que @a seja configurada com um nmero para a segunda linha. Depois que a
instruo executada @a ser considerado como um nmero.
Se voc tiver qualquer problema com isto, evite tanto configurar e usar a mesma varivel na mesma
instruo ou configurar a varivel com 0, 0.0 ou "" antes de us-la.
6.1.5. Variveis de Sistema
A partir do MySQL 4.0.3 fornecemos melhor acesso a diversas variveis de sistema e conexo. Po-
de-se alterar a maioria dele ser ter de desligar o servidor.
Exite dois tipos de variveis de sistema: Especfica de threads (ou especfica da conexo), variveis
que esto apenas na conexo atual e variveis globais que so usadas para conigurqar eventos glo-
bais. Variveis globais tambm so usadas para configurar os valores iniciais da varivel especfica
da thread correspondente a nova conexo.
Quando o mysqld inicia, todas as variveis globais so inicialisadas a partir dos argumentos de li-
nha de comando e arquivos de opo. Voc pode alterar o valor com o comando SET GLOBAL
command. Quando uma nova thread criada, a varivel especfica da thread iniciada a partir das
variveis globais e no alteram mesmo se voc executar um novo comando SET GLOBAL.
Para definir os valor de uma varivel GLOBAL, voc deve usar uma das seguintes sintaxes: (Aqui
usamos sort_buffer_size como uma varivel exemplo).
SET GLOBAL sort_buffer_size=valor;
SET @@global.sort_buffer_size=valor;
Referncia de Linguagem do MySQL
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 espe-
cificar 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
Referncia de Linguagem do MySQL
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
Referncia de Linguagem do MySQL
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 Alias para last_insert_id (compatibilidade com Sybase)
sql_low_priority_updates Alias para low_priority_updates
sql_max_join_size Alias para max_join_size
version Alias para VERSION() (compatibilidade com Sybase (?))
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 Co-
mando do mysqld. See Seco 4.6.8.4, SHOW VARIABLES. See Seco 5.5.6, Sintaxe de
SET.
6.1.6. Sintaxe de Comentrios
O servidor MySQL suporta os estilos de comentrio # no fim da linha, -- no fim da
linha e /* na linha ou em multiplas linhas */
mysql> select 1+1; # Este comentrio continua at o fim da linha
mysql> select 1+1; -- Este comnetrio continua at o fim da linha
mysql> select 1 /* Este um comentrio de linha */ + 1;
mysql> select 1+
/*
Este um comentrio
de mltiplas linhas
*/
1;
Referncia de Linguagem do MySQL
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 mu-
dana do prompt de mysql> para '> ou ">.
Um ponto e vrgula utilizado para indicar o fim de uma instruo SQL e qualquer coisa que ve-
nha aps ele indica o incio da prxima instruo.
Estas limitaes se aplicam tanto a quando se executa mysql interativamente quanto quando se co-
loca oos comandos em um arquivo e pede para que mysql leia as entradas deste arquivo com o co-
mando mysql < some-file.
MySQL suporta o estilo de comentrio SQL-99 '--' apenas se o segundo trao for seguido de espa-
o See Seco 1.8.4.7, '--' como Incio de Comentrio.
6.1.7. Tratamento de Palavras Reservadas no MySQL
Um problema comum ocorre quando tentamos criar tabelas com nome de campo que usam nomes
de tipos de dados ou funes criadas no MySQL, com TIMESTAMP ou GROUP, Voc poder fazer
isso (por exemplo, ABS um nome de campo permitido). No entanto espaos no so permitidos
entre o nome da funo e o caracter '(', assim a funo pode ser distinguida de uma referncia a um
nome de coluna.
Se voc iniciar o servidor com a opo --ansi ou --sql-mode=IGNORE_SPACE, o servidor
permite que a chamada da funo tenha um espao entre um nome de funo e o caracter '(' seguin-
te. Isto faz com que o nome da funao seja tratado como uma palavra reservada; como um resulta-
dom nomes de coluna que so o mesmo que o nome de uma funo devem ser colocada entre aspas
como descrito em Seco 6.1.2, Nomes de Banco de dados, Tabela, ndice, Coluna e Alias.
As seguintes palavras so explicitamente reservadas em MySQL. Muitas delas so proibidas pelo
ANSI SQL92 como nomes de campos e/ou tabelas. (por examplo, group). Algumas poucas so re-
servadasporque o MySQL precisa delas e est usando (atualmente) um analisador yacc:
Word 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
Referncia de Linguagem do MySQL
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
Referncia de Linguagem do MySQL
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
6.2. Tipos de Campos
MySQL suporta um certo nmeros de tipos de campos que podem ser agrupaos em trs categorias:
tipos numricos, tipos de data e hora, e tipos string (caracteres). Esta seo primeiro lhe d uma vi-
so geral dos tipos disponveis e resume as exigencias de armazenamento em cada tipo de coluna,
tambm fornece uma descrio mais detalhada da propriedade dos tipos em cada categoria. A viso
dada propositalmente breve. As descries mais detalhdas devem ser consultadas para informa-
es adicionais sobre tipos de campo particulares como os formatos permitidos nos quais voc pode
especificar valores.
Os tipos de campos suportados pelo MySQL esto listados abaixo: As seguintes letras so usadas
como cdigo nas descries:
M
Indica o tamanho mximo do display. O tamanho mximo oficial do display 255.
D
Referncia de Linguagem do MySQL
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 de-
les do tipo UNSIGNED, o resultado ser sem sinal! See Seco 6.3.5, Funes de Converso.
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
Um inteiro muito pequeno. A faixa deste inteiro com sinal de -128 at 127. A faixa sem sinal
de 0 at 255.
BIT , BOOL , BOOLEAN
Estes so sinnimos para TINYINT(1).
O sinnimo BOOLEAN foi adicionado na verso 4.1.0.
Um tipo boolean verdadeiro ser introduzido de acordo com o SQL-99.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
Um inteiro pequeno. A faixa do inteiro com sinal de -32768 at 32767. A faixa sem sinal
de 0 a 65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
Um inteiro de tamanho mdio. A faica com sinal de -8388608 a 8388607. A faixa sem si-
nal de 0 to 16777215.
INT[(M)] [UNSIGNED] [ZEROFILL]
Um inteiro de tamanho normal. A faixa com sinal de -2147483648 a 2147483647. A fai-
xa sem sinal de 0 a 4294967295.
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
Este um sinnimo para INT.
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
Um inteiro grande. A faixa com sinal de -9223372036854775808 a
9223372036854775807. A faixa sem sinal de 0 a 18446744073709551615.
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 po-
dem estar errados por causa de erros de arredondamento na converso de BIGINT para
Referncia de Linguagem do MySQL
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).
Quando usar operadores (+, -, *, etc.) onde ambos os operandos so inteiros.
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 inespera-
dos quando o resultado for maior que 9223372036854775807.
FLOAT(preciso) [UNSIGNED] [ZEROFILL]
Um nmero de ponto flutuante. No pode ser sem sinal. preciso pode ser <=24 para um n-
mero de ponto flutuante de preciso simples e entre 25 e 53 para um nmero de ponto flutuante
de dupla-preciso. Estes tipos so como os tipos FLOAT e DOUBLE descritos logo abaixo. FLO-
AT(X) tem o mesma faixa que os tipos correspondentes FLOAT e DOUBLE, mas o tamanho do
display e nmero de casas decimais indefinido.
Na verso 3.23 do MySQL, este um verdadeiro valor de ponto flutuante. Em verses anteriores
, FLOAT(preciso) sempre tem 2 casas decimais.
Note que o uso de FLOAT pode trazer alguns problemas inesperados como nos clculos j que
em MySQL todos so feitos com dupla-preciso. See Seco A.5.6, Resolvendo Problemas
Com Registros No Encontrados.
Esta sintaxe fornecida para comptibilidade com ODBC.
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
Um nmero de ponto flutuante pequeno (preciso simples). Os valores permitidos esto entre -
3.402823466E+38 e -1.175494351E-38, 0 e entre 1.175494351E-38 e
3.402823466E+38. Se UNSIGNED for especificado, valores negativos no so permitidos O
M a largura do display e o D o nmero de casas decimais. FLOAT sem um argumento ou
FLOAT(X) onde X <=24 tende a um nmero de ponto flutuante de preciso simples.
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
Um nmero de ponto flutuante de tamanho normal (dupla-preciso). Valores permitidos esto
entre -1.7976931348623157E+308 e -2.2250738585072014E-308, 0 e entre
2.2250738585072014E-308 e 1.7976931348623157E+308. Se UNSIGNED for es-
pecificado, valores negativos no so permitidos. O M a largura do display e o D nmero de
casa decimais. DOUBLE sem argumento ou FLOAT(X) onde 25 <= X <= 53 so nmeros de
ponto flutuante de dupla-preciso.
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL] , REAL[(M,D)]
[UNSIGNED] [ZEROFILL]
Estes so sinnimos para DOUBLE.
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
Referncia de Linguagem do MySQL
445
Um nmero de ponto flutuante no empacotado. Se comporta como um campo CHAR: ``no em-
pacotado'' 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 con-
tados 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.
DEC[(M[,D])] [UNSIGNED] [ZEROFILL] , NUMERIC[(M[,D])] [UNSIGNED]
[ZEROFILL] , FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]
Este um sinnimo para DECIMAL.
O alias FIXED foi adicionado na verso 4.1.0 para compatibilidade com outros servidores.
DATE
Uma data. A faixa suportada entre '1000-01-01' e '9999-12-31'. MySQL mostra va-
lores 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 'AAAA-
MM-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 UP-
DATE porque automaticamente definido a data e a hora da operao mais recente se voc pr-
prio 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 TI-
MESTAMP 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,
Referncia de Linguagem do MySQL
446
Os Tipos DATETIME, DATE e TIMESTAMP.
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.
[NATIONAL] CHAR(M) [BINARY | ASCII | UNICODE]
Uma string de tamanho fixo que sempre preenchida a direita com espaos at o tamanho espe-
cificado quando armazenado. A faixa de M de 1 a 255 caracteres. Espaos extras so removidos
quando o valor recuperado. Valores CHAR so ordenados e comparados no modo caso insensi-
tivo de acordo com o conjunto de caracteres padro, a menos que a palavra chave BINARY seja
utilizada.
A partir da verso 4.1.0, se o valor M especificado maio que 255, o tipo de coluna convertido
para TEXT. Este um recurso de compatibilidade.
NATIONAL CHAR (ou em sua forma reduzida NCHAR) o modo SQL-99 de definir que um
campo CHAR deve usar o conjunto CHARACTER padro. Este o padro no MySQL.
CHAR uma simplificao para CHARACTER.
A partir da verso 4.1.0, o atributo ASCII pode ser especificado o que atribui o conjunto de ca-
racteres latin1 a coluna CHAR.
A partir da verso 4.1.1, o atributo UNICODE pode ser especificado o que atribui o conjunto de
caracteres ucs2 a coluna CHAR.
O MySQL lhe permite criar um campo do tipo CHAR(0).Isto muito til quando voc precisa
de comptibilidade com aplicativos antigos que dependem da existncia de uma coluna, mas que,
na verdade, no utiliza um valor. Isto tambm muito bom quando voc precisa de uma coluna
que s pode receber 2 valores. Um CHAR(0), que no definido como um NOT NULL, s ir
ocupar um bit e pode assumir 2 valores: NULL or "". See Seco 6.2.3.1, Os Tipos CHAR e
VARCHAR.
BIT , BOOL , CHAR
This is a synonym for CHAR(1).
[NATIONAL] VARCHAR(M) [BINARY]
Uma string de tamanho varivel. NOTA: Espaos extras so removidos quando o caracter ar-
mazenado (o que difere da especificao ANSI SQL). A faixa de M de 1 a 255 characters. Va-
lores VARCHAR so ordenados e comparados no modo caso insensitivo a menos que a palavra
chave BINARY seja utilizada. See Seco 6.5.3.1, Alterao de Especificaes de Colunas.
A partir da verso 4.1.0, se o valor M especificado maio que 255, o tipo de coluna convertido
para TEXT. Este um recurso de compatibilidade.
Referncia de Linguagem do MySQL
447
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 Sec-
o 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 Sec-
o 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 Sec-
o 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 li-
mite de 16M por pacote de transmisso/registro de tabela, a partir da verso 4.x o tamanho mxi-
mo 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 Ti-
pos 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 m-
ximo 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 Sec-
o 6.2.3.4, O Tipo SET.
6.2.1. Tipos Numricos
MySQL suporta todos os tipos numricos da ANSI/ISO SQL92. Estes tipos incluem o tipos de da-
dos numricos exatos (NUMERIC, DECIMAL, INTEGER, e SMALLINT), assim como o tipos de da-
dos numricos aproximados (FLOAT, REAL, e DOUBLE PRECISION). A palavra-chave INT um
sinnimo para INTEGER, e a palavra-chave DEC um sinnimo para DECIMAL.
Os tipos NUMERIC e DECIMAL so implementados como o mesmo tipo pelo MySQL, como permi-
tido pelo padro SQL92. Eles so usados por valores para os quais importante preservar a exatido
como, por exemplo, dados monetrios. Quando declarado um campo de algum desses tipos a pre-
ciso e a escala podem ser (e normalmente ) especificadas; por exemplo:
Referncia de Linguagem do MySQL
448
salario DECIMAL(5,2)
Neste exemplo, 5 (preciso) representa o nmero de digitos decimais significantes que sero ar-
mazenados 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 sa-
lario 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 for-
ma, 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 ponto-
flutuante 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 es-
cala 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 TIN-
YINT, 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 se-
guindo 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) ZERO-
FILL, o valor 4 retornado como 00004. Note que se voc armazenar valores maiores que a lar-
gura do display em um coluna do tipo inteiro, voc pode ter problemas quando o MySQL gerar tabe-
las temporrias para algum join complicado, j que nestes casos o MySQL acredita que os dados ca-
bem 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 con-
trrio 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 pa-
lavra FLOAT e entre parenteses. A implementao MySQL tambm suporta esta especificao opci-
onal 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 con-
tinua a representar a quantidade de bytes necessria para armazenar o valor, e o segundo nmero es-
pecifica 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 arre-
dondado eliminando os digitos extras quando armazenado.
Os tipos REAL e DOUBLE PRECISION no aceitam especificaes de preciso. Como uma exten-
Referncia de Linguagem do MySQL
449
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 aproxi-
mados usam FLOAT ou DOUBLE PRECISION sem especificao de preciso ou de numeros deci-
mais.
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 armaze-
na este valor.
Por exemplo, a faixa de uma coluna INT de -2147483648 a 2147483647. Se voc tentar in-
serir -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 armaze-
nados 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 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807
6.2.2. Tipos de Data e Hora
Os tipos de data e hora so DATETIME, DATE, TIMESTAMP, TIME, e YEAR. Cada um desses tipos
tem uma faixa de valores legais, assim com um valor ``zero'' que usado quando voc especifica um
valor ilegal. Note que o MySQL permite que voc armazene certos valores de datas inexistentes, co-
mo 1999-11-31. A razo para isto que pensamos que responsabilidade do aplicativo tratar das
verificaes de data, no do servidor SQL. Para fazer uma verificao 'rpida' de data, MySQL s
checa se o ms est na faixa de 0-12 e o dia est na faixa de 0-31. As faixas acima so definidas des-
ta forma porque MySQL lhe permite armazenar, em um campo DATE ou DATETIME, datas onde o
dia ou o dia/ms so zero. Isto extremamente til para aplicativos que precisam armazenar uma
data de nascimento na qual voc no sabe a data exata. Nestes casos voc simplesmente armazena a
data como 1999-00-00 ou 1999-01-00. (Voc no pode esperar obter um valor correto para
funes como DATE_SUB() ou DATE_ADD para datas como estas.)
Aqui esto algumas consideraes para ter em mente quando estiver trabalhando com tipos de data e
hora.
MySQL recupera valores para um tipo de data ou hora dado em um formato padro, mas ele ten-
ta 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 permi-
tidos. 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 ano-
ms-dia (por exemplo, '98-09-04'), ao invs das ordens mais usadas ms-dia-ano ou dia-
ms-ano (por exemplo: '09-04-98', '04-09-98').
Referncia de Linguagem do MySQL
450
MySQL converte automaticamente um tipo de data ou hora em um nmero se o valor usado
em um contexto numrico, e vice-versa.
Quando o MySQL encontra um valor para um tipo de data ou hora que est fora da faixa permi-
tida ou ilegal neste tipo (veja o incio desta seo), ele converte o valor para ``zero''. (A exce-
o 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 00000000000000 (tamanho depende do tamanho do display)
TIME '00:00:00'
YEAR 0000
Os valores ``zero'' so especiais, mas voc pode armazenar ou fazer referncia a eles explicita-
mente 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.
6.2.2.1. Assuntos referentes ao ano 2000 (Y2K) e Tipos de Data
O MySQL tem sua prpria segurana para o ano 2000 (see Seco 1.2.5, Compatibilidade Com o
Ano 2000 (Y2K)), mas os dados entrados no MySQL podem no ter. Qualquer entrada contendo
valores de ano de 2 digitos ambguo, porque o sculo desconhecido. Tais valores devem ser in-
terpretados na forma de 4 digitos j que o MySQL armazena anos internamente utilizando 4 digitos.
Para tipos DATETIME, DATE, TIMESTAMP e YEAR, MySQL interpreta datas com valores amb-
guos para o ano usando as seguintes regras:
Valores de ano na faixa 00-69 so convertidos para 2000-2069.
Valores de anos na faixa 70-99 so convertidos para 1970-1999.
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)).
6.2.2.2. Os Tipos DATETIME, DATE e TIMESTAMP
Os tipos DATETIME, DATE, e TIMESTAMP so relacionados. Esta seo descreve suas caractersti-
cas, como eles se assemelham ou como se diferem.
O tipo DATETIME usado quando voc precisa de valores que contm informaes sobre data e a a
hora. MySQL recupera e mostra valores DATETIME no formato 'YYYY-MM-DD HH:MM:SS'. A
faixa suportada de '1000-01-01 00:00:00' at '9999-12-31 23:59:59'.
(``Suportada'' significa que embora valores anteriores possam funcionar, no h nenhura garantia de
Referncia de Linguagem do MySQL
451
disto.)
O tipo DATA usado quando se necessita apenas do valor da data, sem a parte da hora. MySQL re-
cupera 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 segu-
inte. 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 TIMES-
TAMP, s a primeira atualizada automaticamente.
Atualizaes automaticas da primeira coluna TIMESTAMP ocorrem sob qualquer uma das seguintes
condies:
A coluna no explicitamente especificada em uma instruo INSERT ou LOAD DATA IN-
FILE.
A coluna no explicitamente especificada em uma instruo UPDATE e e alguma outra coluna
muda o valor. (Note que um UPDATE que coloca em uma coluna o mesmo valor que ele j pos-
sui no ir causar a atualizao da coluna TIMESTAMP, porque se voc atribui a uma coluna o
seu valor atual, MySQL ignora a atualizao para maior eficincia).
Voc define explicitamente a uma coluna TIMESTAMP o valor NULL.
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 ex-
plicitamente o valor desejado. Isto verdade mesmo para a primeira coluna TIMESTAMP. Voc po-
de 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 atua-
lizado 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 explicita-
mente 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 Co-
mando do mysqld.
Propriedades TIMESTAMP a partir do MySQL 4.1 quando no executado no modo MAXDB
Referncia de Linguagem do MySQL
452
No MySQL 4.1.0, colunas TIMESTAMP so armazenadas e mostradas no mesmo formato que colu-
nas 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), TI-
MESTAMP(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 dis-
play, 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 tama-
nho 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 for-
matos comum:
Como uma string nos formatos 'YYYY-MM-DD HH:MM:SS' ou 'YY-MM-DD HH:MM:SS'.
Uma sintaxe ``relaxada'' permitida---nenhum caracter de pontuao pode ser usado como um
delimitador entre parte de data ou hora. Por exemplo, '98-12-31 11:30:45',
'98.12.31 11+30+45', '98/12/31 11*30*45', e '98@12@31 11^30^45' so
equivalentes.
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 'YYYYMMDDHHMMSS' ou
'YYMMDDHHMMSS', desde que a string faa sentido como data. Por example,
'19970523091528' e '970523091528' so interpretadas com '1997-05-23
09:15:28', mas '971122129015' ilegal (tem uma parte de minutos sem sentido) e se
torna '0000-00-00 00:00:00'.
Como uma string sem delimitadores nos formatos 'YYYYMMDD' ou 'YYMMDD', desde que a
string tenha sentido com data. Por exemplo, '19970523' e '970523' so interpretedas co-
mo '1997-05-23', mas '971332' ilegal (tem uma parte de ms sem sentido) e se torna
'0000-00-00'.
Como um nmero nos formatos YYYYMMDDHHMMSS ou YYMMDDHHMMSS, desde que o nmero
faa sentido como uma data. Por exemplo, 19830905132800 e 830905132800 so inter-
Referncia de Linguagem do MySQL
453
pretedos como '1983-09-05 13:28:00'.
Como um nmero nos formatos YYYYMMDD ou YYMMDD, desde que o nmero faa sentido co-
mo 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 especifi-
car 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 delimitado-
res 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 di-
gitos, 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 ta-
manho 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 ou-
tra 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:
Sempre especifique o ano, ms e dia, mesmo se seus tipos de coluna so TIMESTAMP(4) ou
TIMESTAMP(2). De outra forma, os valores no sero datas legais date e um 0 ser armazena-
do.
Se voc usa ALTER TABLE para aumentar uma coluna TIMESTAMP, informaes sero mos-
tradas como se antes estivessem ``escondidas''.
De forma similar, reduzindo o tamanho de uma coluna TIMESTAMP no causa perda de infor-
mao, 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 ope-
ra 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 forma-
tado. POr exemplo, a parte HH de uma coluna TIMESTAMP no mostrada a menos que o tama-
nho do display seja de pelo menos 10, logo tentar usar HOUR() em um valor TIMESTAMP me-
nor 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
Se voc atribuir um valor de DATE value a um objeto DATETIME ou TIMESTAMP, a parte da
Referncia de Linguagem do MySQL
454
hora do valor resultante definido como '00:00:00', porque o vlaor DATE no contm in-
formaes 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 espe-
cificados 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.
Esteja ciente de certas dificuldades quando especificar valores de data:
A forma ``relaxada'' permitida em valores especificados com strings podem causar certas confu-
ses. 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 co-
mo 2002-04-31. Isto permite a aplicaes web armazenar dados de um formulrio sem verifi-
caes adicionais. Para assegurar que a data valida, faa a checagem em sua aplicao.
Valores de anos especificados com 2 digitos so ambguos, pois o sculo no conhecido.
MySQL interpreta valores de anos com dois digitos usando as seguintes regras:
Valores de ano na faixa de 00-69 so convertidos para 2000-2069.
Valores de ano na faixa de 70-99 so convertidos para 1970-1999.
6.2.2.3. O Tipo TIME
O MySQL recupera e mostra valores TIME no formato 'HH:MM:SS' (ou no formato
'HHH:MM:SS' para valores grandes). Volares TIME podem estar na faixa de '-838:59:59' at
'838:59:59'. A razo para a parte da hora ser to grande que o tipo TIME pode ser usado no
apenas para representar a hora do dia (que deve ser menor que 24 horas), mas tambm para tempo
restante ou intervalos de tempo entre dois eventos(que podem ser maior que 24 horas ou mesmo ne-
gativo).
Voc pode especificar valores TIME de variadas formas:
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' ile-
gal (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 enten-
didos: SS, MMSS, HHMMSS e HHMMSS.frao. Note que o MySQL ainda no armazena fra-
Referncia de Linguagem do MySQL
455
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 neces-
srio 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 in-
tepreta como '00:11:12' (onze minutos e 12 segundos). De forma similar, '12' e 12 so inter-
pretados 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 va-
lor TIME, no temos com dizer, a partir de um valor '00:00:00' armazenado na tabela, se o va-
lor original armazenado foi especificado como '00:00:00' ou se foi ilegal.
6.2.2.4. O Tipo YEAR
O tipo YEAR um tipo de 1 byte usado para representar anos.
O MySQL recupera e mostra valores YEAR no formato YYYY. A faixa de valores de 1901 at
2155.
Voc pode especificar valores YEAR em uma variedade de formatos:
Como uma string de 4 digitos na faixa de '1901' at '2155'.
Como um nmero de 4 dgitos na faixa de 1901 at 2155.
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 um nmero de 2 digitos na faixa de 1 at 99. Valores na faixa de 1 at 69 e 70 at 99
so convertidos para valores YEAR na faixa de 2001 at 2069 e 1970 at 1999. Note que a
faixa para nmeros de dois dgitos um pouco diferente da faixa de strings de dois dgitos, pois
no se pode especificar zero diretamente como um nmero e t-lo interpretado com 2000. Voc
deve especific-lo como uma string '0' ou '00' ou ele ser interpretado com 0000.
Como o resultado de uma funo que retorna um valor que aceitvel em um contexto do tipo
YEAR, tal como NOW().
Valores YEAR ilegais so convertidos para 0000.
6.2.3. Tipos String
Os tipos strings so CHAR, VARCHAR, BLOB, TEXT, ENUM, e SET. Esta seo descreve como este
tipos funcionam, suas exigncias de armazenamento e como us-los em suas consultas.
Tipo Tam.maxmo Bytes
Referncia de Linguagem do MySQL
456
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
6.2.3.1. Os Tipos CHAR e VARCHAR
Os tipos CHAR e VARCHAR so parecidos, mas diferem no modo como so armazenados e recupera-
dos.
O tamanho de um campo CHAR fixado pelo tamanho declarado na criao da tabela. O tamanho
pode ser qualquer valor entre 1 e 255 (Como na verso 3.23 do MySQL, o tamanho pode ser de 0 a
255). Quando valores CHAR so armazenados, eles so preenchidos a direita com espaos at o ta-
manho especificado. Quando valores CHAR so recuperados, espaos extras so removidos.
Valores no campo VARCHAR so strings de tamanho varivel. Voc pode declarar um campo VAR-
CHAR para ter qualquer tamanho entre 1 e 255, assim como para campo CHAR. No entanto, diferente
de CHAR, valores VARCHAR so armazendos usando apenas quantos caracteres forem necessrios,
mais 1 byte para gravar o tamanho. Valores no so preenchidos; ao contrrio, espaos extras so re-
movidos quando valores so armazenados. (Esta remoo de espaos difere das especificaes do
SQL-99). Nenhum caso de converso feito durante um o armazenamento ou recuperao.
Se voc atribuir um valor para uma coluna CHAR ou VARCHAR que exceda o tamanho mximo da
coluna, o valor truncado para este tamanho.
A seguinte tabela ilustra as diferenas entre os dois tipos de colunas, mostrando o resultado de se ar-
mazenar vrios valores de strings em campos CHAR(4) e VARCHAR(4):
Valor CHAR(4) Exigncia p/ armaze-
namento
VARCHAR(4) Exigncia p/ armaze-
namento
'' ' ' 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 sig-
nifica 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.
6.2.3.2. Os Tipos BLOB e TEXT
Um BLOB um objeto binario grande que pode guardar um montante variado de dados. Os quatro
tipos BLOB: TINYBLOB, BLOB, MEDIUMBLOB, e LONGBLOB diferem apenas no tamanho maximo
Referncia de Linguagem do MySQL
457
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 pala-
vras, 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 armazena-
dos, como h em campos VARCHAR.
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.
Referncia de Linguagem do MySQL
464
mysql> SELECT "a" ="A \n";
-> 1
Os seguintes exemplos ilustram a converso de strings para nmeros para operaes de comparao:
mysql> SELECT 1 > '6x';
-> 0
mysql> SELECT 7 > '6x';
-> 1
mysql> SELECT 0 > 'x6';
-> 0
mysql> SELECT 0 = 'x6';
-> 1
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 1 = 0;
-> 0
mysql> SELECT '0' = 0;
-> 1
mysql> SELECT '0.0' = 0;
-> 1
mysql> SELECT '0.01' = 0;
-> 0
mysql> SELECT '.01' = 0.01;
-> 1
<> , !=
Diferente:
mysql> SELECT '.01' <> '0.01';
-> 1
mysql> SELECT .01 <> '0.01';
-> 0
mysql> SELECT 'zapp' <> 'zappp';
-> 1
<=
Menor que ou igual:
mysql> SELECT 0.1 <= 2;
-> 1
<
Referncia de Linguagem do MySQL
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
IS NULL , IS NOT NULL
Teste para saber se um valor ou no NULL:
mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
-> 0 0 1
mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
-> 1 1 0
Para estar apto a funcionar bem com outros programas, MySQL suporta os seguintes recursos
extras quando utiliza-se IS NULL:
Voc pode encontrar o ltimo registro inserido com:
SELECT * FROM nome_tabela WHERE auto_col IS NULL
Isto pode ser desabilitado configurando SQL_AUTO_IS_NULL=0. See Seco 5.5.6,
Sintaxe de SET.
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 su-
porte a data 0000-00-00)
Referncia de Linguagem do MySQL
466
expr BETWEEN min AND max
Se expr maior que ou igual a min e expr menor que ou igual a max, BETWEEN retorna 1,
seno retornado 0. Isto equivalente a expresso (min <= expr AND expr <= max)
se todos os argumentos so do mesmo tipo. Seno os tipos so convertidos, conforme as regras
acima, e aplicadas a todos os trs argumentos. Note que antes da verso 4.0.5 argumentos eram
convertidos para o tipo da expr.
mysql> SELECT 1 BETWEEN 2 AND 3;
-> 0
mysql> SELECT 'b' BETWEEN 'a' AND 'c';
-> 1
mysql> SELECT 2 BETWEEN 2 AND '3';
-> 1
mysql> SELECT 2 BETWEEN 2 AND 'x-3';
-> 0
expr NOT BETWEEN min AND max
O mesmo que NOT (expr BETWEEN min AND max).
expr IN (valor,...)
Retorna 1 se expr 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 compara-
o 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 Sec-
o 6.4.2.3, Subqueries with ANY, IN, and SOME.
expr NOT IN (valor,...)
O mesmo que NOT (expr IN (valor,...)).
ISNULL(expr)
Se expr NULL, ISNULL() retorna 1, seno retorna 0:
mysql> SELECT ISNULL(1+1);
-> 0
mysql> SELECT ISNULL(1/0);
-> 1
Referncia de Linguagem do MySQL
467
Note que a comprao de valores NULL usando = sempre ser falso!
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 funci-
one 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
6.3.1.3. Operadores Logicos
Em SQL, todos os operadores logicos avaliam TRUE (VERDADEIRO), FALSE (FALSO) ou
NULL (DESCONHECIDO). No MySQL, esta implementao como 1 (TRUE), 0 (FALSE), e
NULL. A maioria deles comum entre diferentes bancos de dados SQL. no entanto alguns podem
retonar qualquer valor diferente de zero para TRUE.
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
Referncia de Linguagem do MySQL
468
mysql> SELECT 1 && 0;
-> 0
mysql> SELECT 1 && NULL;
-> NULL
mysql> SELECT 0 && NULL;
-> 0
mysql> SELECT NULL && 0;
-> 0
Por favor note que as verses do MySQL anteriores a verso 4.0.5 param a 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 ope-
rando for NULL, seno 0 retornado.
mysql> SELECT 1 || 1;
-> 1
mysql> SELECT 1 || 0;
-> 1
mysql> SELECT 0 || 0;
-> 0
mysql> SELECT 0 || NULL;
-> NULL
mysql> SELECT 1 || NULL;
-> 1
XOR
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 XOR 1;
-> 0
mysql> SELECT 1 XOR 0;
-> 1
mysql> SELECT 1 XOR NULL;
-> NULL
mysql> SELECT 1 XOR 1 XOR 1;
-> 1
a XOR b matematicamente igual a (a AND (NOT b)) OR ((NOT a) and b).
XOR foi adicionado na verso 4.0.2.
6.3.1.4. Funes de Fluxo de Controle
CASE valor WHEN [valor comparado] THEN resultado [WHEN [valor
comparado] THEN resultado ...] [ELSE resultado] END , CASE WHEN
[condio] THEN result [WHEN [condio] THEN resultado ...]
[ELSE resultado] END
A primeira expresso retorna o resultado onde valor=valor comparado. A segunda
expresso retorna o o resultado da primeira condio, a qual verdadeira. Se no existe nenhum
Referncia de Linguagem do MySQL
469
resultado correspondente, ento o resultado depois do ELSE retornado. Se no existe parte
ELSE ento retornado NULL is returned:
mysql> SELECT CASE 1 WHEN 1 THEN "um"
WHEN 2 THEN "dois" ELSE "mais" END;
-> "one"
mysql> SELECT CASE WHEN 1>0 THEN "verdadeiro" ELSE "falso" END;
-> "true"
mysql> SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END;
-> NULL
O tipo do valor de retorno (INTEGER, DOUBLE ou STRING) do mesmo tipo do primeiro va-
lor retornado (a expresso depois do primeiro THEN).
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, re-
sultando um um teste IF(0). Isto pode no ser o que voc esperava. No segundo caso, a com-
parao testa se o valor de ponto flutuante no zero. O resultado da comparao converte o ter-
mo 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
expr2 ou expr3 retorna string string
expr2 ou expr3 retorna um valor de ponto flutuante ponto flutuante
expr2 ou expr3 retorna um inteiro inteiro
Se expr2 e expr3 so strings, ento o resultado caso-insensitivo se ambas strings so caso in-
sensitivo. (A patir da verso 3.23.51)
IFNULL(expr1,expr2)
Referncia de Linguagem do MySQL
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.
6.3.2. Funes String
Funes string retornam NULL se o tamanho do resultado for maior que o parmetro do servidor
max_allowed_packet. See Seco 5.5.2, Parmetros de Sintonia do Servidor.
Para funes que operam com as posies de uma string, a primeira posio numerada como 1.
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().
Referncia de Linguagem do MySQL
471
BIN(N)
Retorna um representao string do valor binrio de N, onde N um nmero muito grande (BI-
GINT). 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 ar-
gumentos 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'
CONCAT_WS(separador, str1, str2,...)
CONCAT_WS() significa CONCAT With Separator (CONCAT com separador) e uma forma
especial do CONCAT(). O primeiro argumento o separador para os outros argumentos. O se-
parador adicionado entre as strings a serem concatenadas: O separador pode ser uma string as-
sim como os outros argumentos. Se o separador NULL, o resultado ser NULL. A funo ir
desconsiderar qualquer NULL depois do argumento do separador.
mysql> SELECT CONCAT_WS(",","First name","Second name","Last Name");
-> 'First name,Second name,Last Name'
mysql> SELECT CONCAT_WS(",","First name",NULL,"Last Name");
-> 'First name,Last Name'
Antes do MySQL 4.1.1, CONCAT_WS() desconsiderava strings vazias assim como valores
Referncia de Linguagem do MySQL
472
NULL.
CONV(N,da_base,para_base)
Converte nmeros entre diferentes bases. Retorna uma representao string do nmero N, con-
vertido 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 in-
teiro ou uma string. A base mnima 2 e a mxima 36. Se para_base um nmero negati-
vo, 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 vo-
c obtem uma string 'off', Cada string separada com 'separador' (padro,',') e s 'nme-
ro_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 encontra-
da. 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
Referncia de Linguagem do MySQL
473
string constante e o segundo uma coluna do tipo SET, a funo FIND_IN_SET() otimiza-
da 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 ade-
quadamente 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 con-
junto de caracteres atual (o padro ISO-8859-1 Latin1):
mysql> SELECT LCASE('MYSQL');
-> 'mysql'
Referncia de Linguagem do MySQL
474
Esta uma funo multi-byte.
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 servi-
dor, voc deve especificar o caminho completo para o arquivo, e voc deve ter o privilgio FI-
LE. 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 retor-
nar 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 informa-
o 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'
Referncia de Linguagem do MySQL
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 uti-
zando-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) , CHAR_LENGTH(str) , CHARAC-
TER_LENGTH(str)
Retorna o tamanho da string str:
mysql> SELECT LENGTH('text');
-> 4
mysql> SELECT OCTET_LENGTH('text');
-> 4
LENGTH() e OCTET_LENGTH() so sinnimos e medem o tamanho da length em bytes
(octets). Um caracter multi-byte conta considerado vrios bytes. CHAR_LENGTH() e CHA-
RACTER_LENGTH() so sinnimos e medem o tamanho da string em caracteres. Um caracter
multi-byte conta como um nico caracter. Isto significa que para uma string contendo cinco ca-
racteres de dois bytes, LENGTH() retorna 10, enquanto CHAR_LENGTH() retorna 5.
MID(str,pos,len)
MID(str,pos,len) um sinnimo para SUBSTRING(str,pos,len).
Referncia de Linguagem do MySQL
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, retorna-
do 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 pa-
ra_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'
Referncia de Linguagem do MySQL
477
Esta funo multi-byte.
RPAD(str,tam,strpreech)
Retorna a string str, preenchida a direita com a string strpreench para um tamanho de tam
caracteres. Se str 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'
Esta funo multi-byte.
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 SOUN-
DEX() 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) , SUBS-
TRING(str,pos,tam) , SUBSTRING(str FROM pos FOR tam)
A forma sem um argumento tam retorna uma substring da string str iniciando na posio
pos. A forma com um argumento tam retorna a substring com tam 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);
Referncia de Linguagem do MySQL
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.
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
Retorna a string str com todos prefixos e/ou sufixos remstr removidos. Se nenhum dos espe-
cificadores BOTH, LEADING ou TRAILING so dados, considerado BOTH. Se remstr no
especificada, espaos so removidos:
mysql> SELECT TRIM(' bar ');
-> 'bar'
mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx'
mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar'
mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx'
Esta funo multi-byte.
UCASE(str) , UPPER(str)
Retorna a string str com todos caracteres alterados para letra maisculas de acordo com o con-
junto de caracteres atual (o padro ISO-8859-1 Latin1):
mysql> SELECT UCASE('Hej');
-> 'HEJ'
Esta uma funo multi-byte.
6.3.2.1. Funes de Comparao de Strings
MySQL automaticamente converte nmeros para quando necessrio, e vice-versa:
mysql> SELECT 1+"1";
-> 2
mysql> SELECT CONCAT(2,' test');
-> '2 test'
Referncia de Linguagem do MySQL
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.
expr LIKE pad [ESCAPE 'car-escape']
Correspondncia de padres usando uma simples expresso de comparaes SQL. Retorna 1
(VERDADEIRO) ou 0 (FALSO). Com LIKE voc pode usar os seguintes meta-caracteres no
padrao:
Car Descrio
% Corresponde a qualquer nmero de caracteres, at zero caracteres
_ Corresponde a exatamente um caracter
mysql> SELECT 'David!' LIKE 'David_';
-> 1
mysql> SELECT 'David!' LIKE '%D%v%';
-> 1
Para testar instncias literais de um meta caracter, preceda o caracter com o carcter de escape. Se
voc no especificar o caracter de ESCAPE, assume-se '\':
String Description
\% Correponde a um caracter %
\_ Correponde a um caracter _
mysql> SELECT 'David!' LIKE 'David\_';
-> 0
mysql> SELECT 'David_' LIKE 'David\_';
-> 1
Para especificar um caracter de escape diferebte, use a clusula ESCAPE:
mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|';
-> 1
As seguintes instrues mostram que a comparao de strings so caso-insensitivo, a menos que
um dos operandos seja uma string binria:
mysql> SELECT 'abc' LIKE 'ABC';
-> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
-> 0
LIKE permitido em uma expresso numrica! (Esta uma extenso MySQL para o LIKE do
SQL-99.)
Referncia de Linguagem do MySQL
480
mysql> SELECT 10 LIKE '1%';
-> 1
Nota: Como MySQL usa sintaxe de escape do C em strings (por exemplo, '\n'), voc deve do-
brar qualquer '\' que voc usar em sua string LIKE. Por exemplo, para pesquisar por '\n', espe-
cifique-o como '\\n'. Para buscar por '\', especifique-o como '\\\\' (as barras invertidas so
eliminadas uma vez pelo analizador e outra vez quando a correspondncia de padres feita,
deixando uma nicas barra invertida para ser verificada).
Note: O LIKE atual no um caracter multi-byte. Comparaoes so feitas caracter
por caracter.
expr NOT LIKE pad [ESCAPE 'car-escape']
O mesmo que NOT (expr LIKE pad [ESCAPE 'car-escape']).
expr SOUNDS LIKE expr
O mesmo que SOUNDEX(expr)=SOUNDEX(expr) (disponvel apenas na verso 4.1 ou pos-
terior).
expr REGEXP pad , expr RLIKE pad
Realiza a busca de padres em uma express string com base no padro pad. O padro pode ser
uma expresso regular extendida. See Apndice G, Sintaxe de Expresses Regulares do MySQL.
Retorna 1 se expr conincide com pad, seno retorna 0. RLIKE um sinnimo para REGEXP,
fornecido para compatibilidade com mSQL. Nota: Como MySQL usa a sintaxe de escape do C
em strings (por exemplo, '\n'), voc deve dobrar qualquer '\' que voc use em sua string RE-
GEXP. Como na verso 3.23.4 do MySQL, REGEXP caso- insensitivo para strings normais
(no binrias).
mysql> SELECT 'Monty!' REGEXP 'm%y%%';
-> 0
mysql> SELECT 'Monty!' REGEXP '.*';
-> 1
mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';
-> 1
mysql> SELECT "a" REGEXP "A", "a" REGEXP BINARY "A";
-> 1 0
mysql> SELECT "a" REGEXP "^[a-d]";
-> 1
REGEXP e RLIKE usam o conjunto de caracteres atual (ISO-8859-1 Latin1 por padro) para de-
cidir o tipo de caracter.
expr NOT REGEXP pad , expr NOT RLIKE pad
O mesmo que NOT (expr REGEXP pad).
STRCMP(expr1,expr2)
STRCMP() retorna 0 se as string so a mesma, -1 se o primeiro argumento menor que o se-
gundo de acordo com a ordenao atual e 1 em caso contrrio:
mysql> SELECT STRCMP('texto', 'texto2');
Referncia de Linguagem do MySQL
481
-> -1
mysql> SELECT STRCMP('texto2', 'texto');
-> 1
mysql> SELECT STRCMP('texto', 'texto');
-> 0
MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH
QUERY EXPANSION] )
MATCH ... AGAINST() usado para busca de textos completos e retorna a relvncia - simi-
laridade medidad entre o texto nas colunas (col1,col2,...) e a consulta expr. Relevn-
cia um nmero de ponto flutuante. Relevncia zero significa que no houve nenhuma similari-
dade. 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.
6.3.2.2. Caso Sensitivo
BINARY
O operador BINARY transforma uma string em uma string binria. Este um modo fcil de for-
ar 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 mais-
culas 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.
6.3.3. Funes Numricas
6.3.3.1. Operaes Aritimticas
Os operadores aritimticos usuais esto disponveis. '-', '+', e '*', o resultado calculado com preci-
so de BIGINT (64-bit) se ambos os argumentos so inteiros! Se um dos argumentos for um inteiro
sem sinal, e o outro argumento um inteiro tambm, o resultado ser um inteiro sem sinal. See Sec-
o 6.3.5, Funes de Converso.
+
Referncia de Linguagem do MySQL
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 exce-
de 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!
6.3.3.2. Funes Matematicas
Todas as funes matematicas retornam NULL no caso de um erro.
-
Menos unario. Muda o sinal do argumento:
mysql> SELECT - 2;
-> -2
Note que se este operador utilizando com um BIGINT, o valor retornado um BIGINT! Isto
Referncia de Linguagem do MySQL
483
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 MOD(234, 10);
-> 4
mysql> SELECT 253 % 7;
-> 1
mysql> SELECT MOD(29,9);
-> 2
mysql> SELECT 29 MOD 9;
-> 2
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
Referncia de Linguagem do MySQL
484
mysql> SELECT CEIL(-1.23);
-> -1
O alias CEIL() foi adicionado verso 4.0.6.
Note que o valor retornado convertido para um BIGINT!
ROUND(X) , ROUND(X,D)
Retorna o argumeto X, arredondado para o inteiro mais prximo. Com dois argumentos o arre-
dandamento 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 nme-
ro 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
Referncia de Linguagem do MySQL
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)
Referncia de Linguagem do MySQL
486
Retorna o a raiz quadrada no negativa de X:
mysql> SELECT SQRT(4);
-> 2.000000
mysql> SELECT SQRT(20);
-> 4.472136
PI()
Retorna o valor de PI. A quantidade de nmeros decimais padro 5, mas o MySQL usa inter-
namente 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:
Referncia de Linguagem do MySQL
487
mysql> SELECT ASIN(0.2);
-> 0.201358
mysql> SELECT ASIN('foo');
-> 0.000000
ATAN(X)
Retorna o arco tangente X, isto , o valor cuja tangente X. X:
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 resulta-
do:
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 co-
mo tal se no for.
mysql> SELECT CRC32('MySQL');
-> 3259397556
CRC32() est disponvel a partir do MySQL 4.1.0.
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
Referncia de Linguagem do MySQL
488
mysql> SELECT RAND(20);
-> 0.15888261251047
mysql> SELECT RAND();
-> 0.63553050033332
mysql> SELECT RAND();
-> 0.70100469486881
Voc no pode usar uma coluna com valores RAND() em uma clusula ORDER BY, pois OR-
DER BY avaliaria a coluna mltiplas vezes. Na verso 3.23 voc pode fazer: SELECT * FROM
nome_tabela ORDER BY RAND()
Isto til para obter um amostra aleatria de um conjunto SELECT * FROM tabe-
la1,tabela2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000.
Note que um RAND() em uma clusula WHERE ser reavliado toda vez que WHERE executa-
do.
RAND() no um gerador de nmeros aletatrios perfeito, mas um modo rpido de se gerar
nmeros aleatrios ad hoc que sero portveis entre plataformas para a mesma verso do
MySQL.
LEAST(X,Y,...)
Com dois ou mais argumentos, retorna o menor (valor-mnimo) argumento. Os argumentos so
comparados usando as seguintes regras:
Se o valor de retorno usado em um contexto INTEGER, ou todos argumentos so valores
inteiro, eles so comparados como inteiros.
Se o valor de retorno usado em um contexto REAL, ou todos argumentos so valores reais,
eles so comparados como inteiros.
Se qualquer um dos argumento for uma string caso-sensitivo, os argumentos so comparados
como strings caso-sensitivo.
Nos outros casos, os argumentos so comparados como strings caso-insensitivo:
mysql> SELECT LEAST(2,0);
-> 0
mysql> SELECT LEAST(34.0,3.0,5.0,767.0);
-> 3.0
mysql> SELECT LEAST("B","A","C");
-> "A"
Em verses do MySQL anteriores a verso 3.22.5, voc pode usar MIN() no lugar de LEAST.
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 GRA-
TEST.
Referncia de Linguagem do MySQL
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 deci-
aml 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 porque 10.28 , na verdade, armazenado como
10.2799999999999999.
6.3.4. Funes de Data e Hora
Esta seo descreve as funes que podem ser usadas para manipular valores temporais.
Veja Seco 6.2.2, Tipos de Data e Hora para uma descrio da faixa de valores que cada tipo tem
e os formatos vlidos nos quais valores de data e hora podes ser especificados.
Aqui est um exemplo que usa funes de data. A consulta seguinte seleciona todos os registros
com um valores em uma coluna col_data dentro dos ltimos 30 dias:
Referncia de Linguagem do MySQL
490
mysql> SELECT algo FROM nome_tabela
WHERE TO_DAYS(NOW()) - TO_DAYS(col_data) <= 30;
(Note que a consulta tambm selecionar registros com datas futuras.)
Funes que esperam valores de data normaemente aceitaram valores datetime e ignoram a parte da
hora. Funes que esperam valores de hora normalmente aceitaro valores datetime e ignoram a par-
te da data.
Funes que retornam a data ou hora atual so avaliadas apenas uma vez por consulta, no inicio da
sua execuo. Isto significa que vrias referncias a uma funo com NOW() dentro de uma mesma
consulta sempre produzir o memo resultado. Este princpio tambm se aplica a CURDATE(),
CURTIME(), UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP(), e qualquer um dos seus sin-
nimos.
A faixa do valor retornado na seguinte descrio da funo se aplica a datas completas. Se uma data
um valor ``zero'' ou uma data incompleta tal como '2001-11-00', funes que extraem parte
de uma data podem retornam 0. Por exemplo, DAYOFMONTH('2001-11-00') retorna 0.
DATE(expr)
Extrai a parte da data da expresso date ou datetime em expr.
mysql> SELECT DATE('2003-12-31 01:02:03');
-> '2003-12-31'
DATE() est disponvel a partir do MySQL 4.1.1.
TIME(expr)
Extrai a parte da hora da expresso time ou datetime em expr.
mysql> SELECT TIME('2003-12-31 01:02:03');
-> '01:02:03'
mysql> SELECT TIME('2003-12-31 01:02:03.000123');
-> '01:02:03.000123'
TIME() est disponvel a partir do MySQL 4.1.1.
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.
mysql> SELECT TIMESTAMP('2003-12-31');
-> '2003-12-31 00:00:00'
mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
-> '2004-01-01 00:00:00'
Referncia de Linguagem do MySQL
491
TIMESTAMP() est disponvel a partir do MySQL 4.1.1.
DAYOFWEEK(data)
Retorna o ndice do dia da semana para data (1 = Domingo, 2 = Segunda, ... 7 = Sbado). Es-
tes 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:
Referncia de Linguagem do MySQL
492
mysql> SELECT DAYNAME('1998-02-05');
-> 'Thurday'
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() per-
mite que voc especifique se a semana comea no Domingo ou na Segunda e se o valor de retor-
no deve estar na faixa de 0-53 ou 1-5. Quando o argumento modo omitido, o valor de uma va-
rivel 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
0 Semana comea no Domingo; retorna o valor na faixa de 0 a 53; semana 1 a pri-
meira semana neste ano.
1 Semana comea na Segunda; retorna o valor na faixa de 0 a 53; semana 1 a pri-
meira semana com mais de 3 dias neste ano
2 Semana comea no Domingo; retorna o valor na faixa de 1 a 53; semana 1 a pri-
meira semana neste ano.
3 Semana comea na Segunda; retorna o valor na faixa de 1 a 53; semana 1 a pri-
meira semana com mais de 3 dias neste ano.
4 Semana comea no Domingo; retorna o valor na faixa de 0 a 53; semana 1 a pri-
meira semana com mais de 3 dias neste ano.
5 Semana comea na Segunda; retorna o valor na faixa de 0 a 53; semana 1 a pri-
meira semana neste ano.
6 Semana comea no Domingo; retorna o valor na faixa de 0 a 53; semana 1 a pri-
meira semana que tenha mais de 3 dias neste ano.
7 Semana comea na Segunda; retorna o valor na faixa de 1 a 53; semana 1 a pri-
meira 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
Referncia de Linguagem do MySQL
493
mysql> SELECT WEEK('1998-02-20',0);
-> 7
mysql> SELECT WEEK('1998-02-20',1);
-> 8
mysql> SELECT WEEK('1998-12-31',1);
-> 53
Nota: Na verso 4.0, WEEK(#,0) foi alterado para corresponder ao calendrio americano. An-
tes WEEK() era calculada de forma errada para data no EUA. (Na verdade WEEK(#) e WE-
EK(#,0) era errado para todos os casos).
Note que se a data for a ltima semana do ano anterior, o MySQL retornar 0 se voc no usar 2,
3, 6 ou 7 como argumento opcional modo:
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
-> 2000, 0
Pode-se questionar que o MySQL deveria retornar 52 para a funo WEEK() ja que a data dada
ocorre, na verdade, ma 52a. semana de 1999. Ns decidimos retornar 0 j que queremos que fun-
o retorne ``o nmero da semana do ano dado''. Isto faz com que o uso da funo WEEK() seja
seguro quando combinado com outras funes que extraiam um parte de uma data.
Se voc prefere que o resultado seja avaliado em relaco ao ano que aontm o primeiro dia da
semana de uma data dada, ento voc deve usar o 2, 3, 6 ou 7 como argumento opcional modo:
mysql> SELECT WEEK('2000-01-01',2);
-> 52
Alternativamente voc pode usar a funo YEARWEEK():
mysql> SELECT YEARWEEK('2000-01-01');
-> 199952
mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
-> '52'
WEEKOFYEAR(data)
Retorna a semana da data como um nmero na faixa de 1 a 53.
mysql> SELECT WEEKOFYEAR('1998-02-20');
-> 8
WEEKOFYEAR() esta disponvel a partir do MySQL 4.1.1.
YEAR(data)
Retorna o ano para data na faixa de 1000 a 9999:
mysql> SELECT YEAR('98-02-03');
-> 1998
Referncia de Linguagem do MySQL
494
YEARWEEK(data) , YEARWEEK(data,inicio)
Retorna o ano e a semana para a data. O argumento inicio funciona exatamente como o argu-
mento 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.
mysql> SELECT MICROSECOND('12:00:00.123456');
-> 123456
mysql> SELECT MICROSECOND('1997-12-31 23:59:59.000010');
-> 10
MICROSECOND() est disponvel a partir do MySQL 4.1.1.
Referncia de Linguagem do MySQL
495
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 tipo expr) , DATE_SUB(data,INTERVAL tipo
expr)
Estas funes realizam operaes aritmticas em datas.
A partir do MySQL 3.23, INTERVAL expr tipo permitido nos dois lados do operador +
se a expressao em ambos os lados um valor date ou datetime. Para o operador -, INTERVAL
expr tipoe permitido apenas no lado direito, porque no faz sentido subtrair um valor date
ou datetime de um intervalo. (Veja exemplo abaixo.)
data um valor DATETIME ou DATE especificando a data de incio. expr is an expresso es-
pecificando o intervala a ser adicionado ou subtraido da data de incio. expr uma string; ela
pode iniciar com um '-' para intervalos negativos. type uma palavra chave indicando como a
expresso deve ser interpretada.
A seguinte tabela mostra como os argumentos tipo e expr se relacionam:
tipo do valor Formarto esperado da expr
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'
Referncia de Linguagem do MySQL
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 cl-
culos 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 es-
querda 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 interpreta-
do 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'
Referncia de Linguagem do MySQL
497
Se voc utilizar datas mal formadas, o valor retornado NULL. S voc adicionar MONTH, YE-
AR_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 ca-
so sensitivo.
ADDDATE(data,INTERVAL expr type) , ADDDATE(expr,dias)
Quando chamada com a forma INTERVAL do segundo argumento, ADDDATE() um sinnimo
para DATE_ADD(). A funo relcionada SUBDATE() um sinnimo para DATE_SUB().
mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);
-> '1998-02-02'
mysql> SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY);
-> '1998-02-02'
A partir do MySQL 4.1.1, a segunda sintaxe permitida, onde expr uma expreso date ou da-
tetime e dias o nmero de dias a ser adicionado a expr.
mysql> SELECT ADDDATE('1998-01-02', 31);
-> '1998-02-02'
ADDTIME(expr,expr2)
ADDTIME() adiciona expr2 a expr e retorna o resultado. expr uma expresso date ou da-
tetime, e expr2 uma expresso time.
mysql> SELECT ADDTIME("1997-12-31 23:59:59.999999", "1 1:1:1.000002");
-> '1998-01-02 01:01:01.000001'
mysql> SELECT ADDTIME("01:00:00.999999", "02:00:00.999998");
-> '03:00:01.999997'
ADDTIME() foi adicionado no MySQL 4.1.1.
EXTRACT(tipo FROM data)
A funo EXTRACT() usa o mesmo tipo de intervalo especificado como DATE_ADD() ou
DATE_SUB(), mas extrai partes da da data em vez de realizar aritimtica de data.
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
-> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
-> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
-> 20102
Referncia de Linguagem do MySQL
498
mysql> SELECT EXTRACT(MICROSECOND FROM "2003-01-02 10:30:00.00123");
-> 123
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.
mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
-> 1
mysql> SELECT DATEDIFF('1997-11-31 23:59:59','1997-12-31');
-> -30
mysql> SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001');
-> '-00:00:00.000001'
mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001','1997-12-30 01:01:01.000002');
-> '46:58:57.999999'
DATEDIFF() e TIMEDIFF() foram adicionados no MySQL 4.1.1.
TO_DAYS(data)
Dada uma data data, retorna o nmero do dia (o nmero de dias desde o ano 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 Gregoria-
no (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 Grego-
riano (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
Referncia de Linguagem do MySQL
499
er
%M Nome do ms (January..December)
%W Nome da semana (Sunday..Saturday)
%D Dia do ms com sufixo Ingls (0th, 1st, 2nd, 3rd, etc.)
%Y Ano, numerico, 4 digitos
%y Ano, numerico, 2 digitos
%X Ano para a semana onde o Domingo o primeiro dia da semana, numerico, 4 di-
gitos; usado com %V
%x Ano para a semana onde a segunda o primeiro dia da semana, numerico, 4 digi-
tos; usado com %v
%a Nome da semana abreviado (Sun..Sat)
%d Dia do ms, numerico (00..31)
%e Dia do ms, numerico (0..31)
%m Ms, numerico (00..12)
%c Ms, numerico (0..12)
%b Nome do ms abreviado (Jan..Dec)
%j Dia do ano (001..366)
%H Hora (00..23)
%k Hora (0..23)
%h Hora (01..12)
%I Hora (01..12)
%l Hora (1..12)
%i Minutos, numerico (00..59)
%r Tempo, 12-horas (hh:mm:ss seguido por AM ou PM)
%T Tempo, 24-horas (hh:mm:ss)
%S Segundos (00..59)
%s Segundos (00..59)
%f Microsegundos (000000..999999)
%p AM ou PM
%w Dia da semana (0=Domingo..6=Sabado)
%U Semana(00..53), onde o Domingo o primeiro dia da semana.
%u Semana(00..53), onde a Segunda o primeiro dia da semana.
%V Semana(01..53), onde o Domingo o primeiro dia da semana; usado com %X
%v Semana(01..53), onde a Segunda o primeiro dia da semana; usado com %x
%% Um literal '%'.
Todos os outros caracteres so apenas copiados para o resultado, sem interpretao.
O especificador dr formato %f est disponvel a partir do MySQL 4.1.1.
Como na verso 3.23 do MySQL, o caracter '%' exigido antes dos caracteres de especificao
de formato. Em verses anteriores do MySQL '%' era opcional.
A razo para a faixa de valores do ms e do dia comearem com zero que o MySQL permite
datas incompletas tais como '2004-00-00' serem armazenadas no MySQL 3.23.
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
Referncia de Linguagem do MySQL
500
-> 'Saturday October 1997'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'
STR_TO_DATE(str,format)
Esta 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 in-
terpretados. Se str contm um valor date, time, ou datetime ilegal, STR_TO_DATE() retorna
NULL.
mysql> SELECT STR_TO_DATE('03.10.2003 09.20', '%d.%m.%Y %H.%i')
-> 2003-10-03 09:20:00
mysql> SELECT STR_TO_DATE('10rap', '%crap')
-> 0000-10-00 00:00:00
mysql> SELECT STR_TO_DATE('2003-15-10 00:00:00', '%Y-%m-%d %H:%i:%s')
-> NULL
STR_TO_DATE() est disponvel a partir do MySQL 4.1.1.
GET_FORMAT(DATE | TIME | TIMESTAMP, 'EUR' | 'USA' | 'JIS' |
'ISO' | 'INTERNAL')
Retorna uma string de formato. Esta funo til combinado com as funes DA-
TE_FORMAT() e STR_TO_DATE(), e quando configurarmos as variveis do servidor DA-
TE_FORMAT, TIME_FORMAT e DATETIME_FORMAT. Os trs valores possveis para o primei-
ro argumento e os cinco valores possveis para o segundo argumento resultam em 15 strings de
formato possveis (para o especificador usado, veja a tabela na descrio da funo DA-
TE_FORMAT()):
Chamada da Funo 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'
Referncia de Linguagem do MySQL
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'
Formato ISO do ISO ISO 9075, no do ISO 8601.
mysql> SELECT DATE_FORMAT('2003-10-03', GET_FORMAT(DATE, 'EUR')
-> '03.10.2003'
mysql> SELECT STR_TO_DATE('10.31.2003', GET_FORMAT(DATE, 'USA'))
-> 2003-10-31
mysql> SET DATE_FORMAT=GET_FORMAT(DATE, 'USA'); SELECT '2003-10-31';
-> 10-31-2003
GET_FORMAT() est disponvel a partir do MySQL 4.1.1. Veja See Seco 5.5.6, Sintaxe de
SET.
SUBDATE(date,INTERVAL expr type) , SUBDATE(expr,days)
Quando chamado com a forma INTERVAL do segunto argumento, SUBDATE() um sinonimo
para DATE_SUB().
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
-> '1997-12-02'
mysql> SELECT SUBDATE('1998-01-02', INTERVAL 31 DAY);
-> '1997-12-02'
A partir do MySQL 4.1.1, a segunda sintaxe permitida, onde expr uma 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 da-
tetime, e expr2 uma expresso time.
Referncia de Linguagem do MySQL
502
mysql> SELECT SUBTIME("1997-12-31 23:59:59.999999", "1 1:1:1.000002");
-> '1997-12-30 22:58:58.999997'
mysql> SELECT SUBTIME("01:00:00.999999", "02:00:00.999998");
-> '-00:59:59.999999'
SUBTIME() foi adicionado no MySQL 4.1.1.
TIME_FORMAT(hora,formato)
usado como a funo DATE_FORMAT() acima, mas a string de formato pode conter ape-
nas os especificadores de formato que tratam de horas, minutos e segundos. Outros especificado-
res 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 for-
mato 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. Re-
torna NULL se o argumento invalido.
mysql> SELECT LAST_DAY('2003-02-05'), LAST_DAY('2004-02-05');
-> '2003-02-28', '2004-02-29'
mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
-> '2004-01-31'
mysql> SELECT LAST_DAY('2003-03-32');
-> NULL
LAST_DAY() est disponvel a partir do MySQL 4.1.1.
MAKEDATE(ano,diadoano)
Retorna uma data, dado os valores da ano e dia do ano. diadoano deve ser maior que 0 ou o
resultado ser NULL.
mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32);
-> '2001-01-31', '2001-02-01'
mysql> SELECT MAKEDATE(2001,365), MAKEDATE(2004,365);
-> '2001-12-31', '2004-12-30'
mysql> SELECT MAKEDATE(2001,0);
-> NULL
MAKEDATE() est disponvel a partir do MySQL 4.1.1.
Referncia de Linguagem do MySQL
503
MAKETIME(hora,minuto,segundo)
Retorna um valor time calculado a partir dos argmentos hora, minuto e segundo.
mysql> SELECT MAKETIME(12,15,30);
-> '12:15:30'
MAKETIME() est disponvel a partir do MySQL 4.1.1.
CURDATE() , CURRENT_DATE , CURRENT_DATE()
Retorna a data atual como um valor no formato 'YYYY-MM-DD' ou YYYYMMDD, dependendo
se a funo usada num contexto numrico ou de string.
mysql> SELECT CURDATE();
-> '1997-12-15'
mysql> SELECT CURDATE() + 0;
-> 19971215
CURTIME() , CURRENT_TIME , CURRENT_TIME()
Retorna a hora atual como um valor no formato 'HH:MM:SS' ou HHMMSS, dependo se a fun-
o usada em um contexto numrico ou como string:
mysql> SELECT CURTIME();
-> '23:50:26'
mysql> SELECT CURTIME() + 0;
-> 235026
NOW() , SYSDATE() , CURRENT_TIMESTAMP , CURRENT_TIMESTAMP() , LOCALTIME
, LOCALTIME() , LOCALTIMESTAMP , LOCALTIMESTAMP()
Retorna a data e hora atual como um valor no formato 'YYYY-MM-DD HH:MM:SS' ou
YYYYMMDDHHMMSS, dependendo se a funo utilizada num contexto numrico ou de string.
mysql> SELECT NOW();
-> '1997-12-15 23:50:26'
mysql> SELECT NOW() + 0;
-> 19971215235026
UNIX_TIMESTAMP() , UNIX_TIMESTAMP(data)
Se chamado sem argumento, retorna um tipo timestamp do Unix (segundos desde
'1970-01-01 00:00:00' GMT) como um inteiro sem sinal. Se UNIX_TIMESTAMP()
chamada com um argumento data, retornado o valor do 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');
Referncia de Linguagem do MySQL
504
-> 875996580
Qaundo UNIX_TIMESTAMP usado em uma coluna TIMESTAMP, a funo retorna o valor ti-
mestamp 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 intei-
ro 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 'YYYY-
MM-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, depen-
Referncia de Linguagem do MySQL
505
dendo se a funo usada emum contexto string ou numrico:
mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
-> '2003-08-14', 20030814
UTC_DATE() est disponvel a partir do MySQL 4.1.1.
UTC_TIME , UTC_TIME()
Retorna a hora UTC atual como um valor no formato 'HH:MM:SS' ou HHMMSS, dependendo
se a funo usada em um contexto string ou numrico:
mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
-> '18:07:53', 180753
UTC_TIME() est disponvel a partir do MySQL 4.1.1.
UTC_TIMESTAMP , UTC_TIMESTAMP()
Retorna a data e hora UTC atual como um valor no formato 'YYYY-MM-DD HH:MM:SS' ou
YYYYMMDDHHMMSS, dependendo se a funo usada em um contexto string ou numrico:
mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
-> '2003-08-14 18:08:04', 20030814180804
UTC_TIMESTAMP() est disponvel a partir do MySQL 4.1.1.
6.3.5. Funes de Converso
As funes CAST() e CONVERT() devem ser usada para tomar um valor de um tipo e produzir um
valor de outro tipo. As suas sintaxes so as seguintes:
CAST(expresso AS tipo)
CONVERT(expresso,tipo)
CONVERT(expr USING transcoding_name)
O valor tipo pode ser um dos seguintes:
BINARY
CHAR
DATE
DATETIME
SIGNED {INTEGER}
Referncia de Linguagem do MySQL
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 ver-
so 4.1.0.
CAST() e CONVERT(... USING ...) so da sintaxe SQL-99. A forma no-USING de CON-
VERT() 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. Normal-
mente 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 cli-
ente):
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 CON-
CAT("Data: ",CAST(NOW() AS DATE)).
Voc no deve utilizar CAST() para extrair dados em formatos diferentes, mas sim para usar fun-
es 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 con-
Referncia de Linguagem do MySQL
507
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 flu-
tuante 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 apro-
priadamente. 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 ocor-
rer.
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 consegu-
ir 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 corresponden-
tes. Por exemplo, esta instruo converte a string 'abc' no conjunto de caracteres padro do servi-
dor na string correspondente no conjunto de caracteres utf8:
SELECT CONVERT('abc' USING utf8);
6.3.6. Outras Funes
6.3.6.1. Funes Binrias
O MySQL utiliza aritimtica BIGINT (64bits) para operaes binrias, assim estes operadores pos-
suem uma faixa mxima de 64 bits.
|
Operador binrio OR
mysql> SELECT 29 | 15;
-> 31
O resultado um inteiro sem sinal de 64 bits.
&
Referncia de Linguagem do MySQL
508
Operado binrio AND
mysql> SELECT 29 & 15;
-> 13
O resultado um inteiro sem sinal de 64 bits.
^
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
Referncia de Linguagem do MySQL
509
6.3.6.2. Funes Diversas
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.
USER() , SYSTEM_USER() , SESSION_USER()
Retorna o nome do usurio MySQL e nome de mquina atual:
mysql> SELECT USER();
-> 'davida@localhost'
O valor indica o nome do usurio que voc especificou ao conectar ao servidor e a mquina cli-
ente da qual voc se conectou. (Antes do MySQL verso 3.22.11, o valor da funo no inclui o
nome da mquina cliente.)
Voc pode extrair apenas a parte do nome do usurio, desconsiderando se o valor inclui a parte
do nome de mquina, desta forma:
mysql> SELECT SUBSTRING_INDEX(USER(),"@",1);
-> 'davida'
CURRENT_USER()
Retorna o nome do usurio e o nome de mquina com os quais a sesso atual foi autenticada. Es-
te valor corresponde a conta que usada para acessar seu privilgio de acessos. Ela pode ser di-
ferente do valor de USER().
mysql> SELECT USER();
-> 'davida@localhost'
mysql> SELECT * FROM mysql.user;
-> ERROR 1044: Access denied for user: '@localhost' to database 'mysql'
mysql> SELECT CURRENT_USER();
-> '@localhost'
O exemplo ilustra que embora o cliente tenha especificado um nome de usurio davida (como
indicado pelo valor da funo USER()), o servidor autenticou o cliente usando uma conta de
usurio annimo (como visto pela parte vazia no nome de usurio do valor
CURRENT_USER()). Um modos de isto ocorrer que no haja uma conta listada na tabela de
permisses para davida.
PASSWORD(str) , OLD_PASSWORD(str)
Calcula a senha a partir de senha str em texto puro. Est a funo que utilizada para cripto-
Referncia de Linguagem do MySQL
510
grafar a senha do MySQL para armazenamento na coluna Password da tabela de permisses
user
mysql> SELECT PASSWORD('badpwd');
-> '7f84554057dd964b'
A criptografia de PASSWORD() no e reversvel.
PASSWORD() no realiza a criptografia da senha da mesa maneira que as senhas Unix so crip-
tografadas. Veja ENCRYPT().
Note: A funo PASSWORD() usada pelo sistema de autentificao no servidor MySQL, voc
NO deve uitliz-las em suas prprias aplicaes. Para este propsito utilize MD5() ou
SHA1(). Veja tambm RFC-2195 para maiores informaes sobre o tratamento de senha e au-
tenticao segura em suas aplicaes.
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 sis-
temas. 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 platafor-
ma.
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 he-
xadecimal 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".
Referncia de Linguagem do MySQL
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)
Estas funes permitem criptografia/descriptografia de dados usando o algoritmo oficial AES
(Padro Avanado de Criptografia), antes conhecido como Rijndael. Criptgrafia com uma chave
de 128 bits podem ser usadas, mas voc pode extend-la para 256 bits atravs da fonte. Ns es-
colhemos 128 bits porque muito mais rpido e bastante seguro.
Os argumentos de entrada podem ser de qualquer tamanho. Se ambos argumentos so NULL, o
resultado desta funo tam bm ser NULL.
Como o AES um algortimo de nvel de bloco, padding usado para codificar strings de tama-
nho mpares e ento a string resultante pode ser calculada como
16*(trunc(tamanho_string/16)+1).
Se AES_DECRYPT() detectar dados invlidos ou padding incorreto, ela retorna NULL. No en-
tanto, possvel para o AES_DECRYPT() retornar um valor no-NULL (possivelmente lixo) se
os dados de entrada ou a chave eram invlidos
Voc pode usar as funes AES para armazenar dados de forma criptografada modificando as
suas consultas:
INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));
Voc pode obter mais segurana no transferindo a chave em suas conexes a cada consulta, o
que pode ser conseguido armazenando-o em varveis do lado do servidor na hora das conexo.
SELECT @password:='my password';
INSERT INTO t VALUES (1,AES_ENCRYPT('text',@password));
AES_ENCRYPT() e AES_DECRYPT() foram adicionados na verso 4.0.2, e podem ser consi-
derados a funo de criptografia mais segura atualmente disponvel no MySQL.
DES_ENCRYPT(string_para_ciptografar [, (numero_chave | cha-
ve_string) ] )
Criptografa a string com a chave dada utilizando o algortimo Triplo-DES.
Note que esta funo s funciona se o MySQL tiver sido configurado com suporte a SSL. See
Seco 4.4.10, Usando Conexes Seguras.
A chave de criptografia utilizada escolhida da seguinte forma:
Argumento Descrio
Referncia de Linguagem do MySQL
512
Somente um argumen-
to
A primeira chave de des-key-file utilizada.
Nmero da chave A chave dada (0-9) de des-key-file utilizada.
string A chave_string dada ser utilizada para criptografar
string_para_criptografar.
O string retornada ser uma string binria onde o primeiro caracter ser CHAR(128 | nme-
ro_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= tamanho_orig +
(8-(tamanho_orig % 8))+1.
O des-key-file ter o seguinte formato:
numero_chave chave_string_des
numero_chave chave_string_des
Cada numero_chave deve ser um nero na faixa de 0 a 9. As linhas do arquivo podem estar
em qualquer ordem. chave_string_des a string que ser usada para criptografar a mensa-
gem. Entre o nmero e a chave deve haver pelo menos um espao. A primeira chave a chave
padro que ser utilizada se no for especificada nenhuma chave como argumento para
DES_ENCRYPT()
Voc pode dizer ao MySQL para ler novos valores de arquivos de chave com o comando
FLUSH DES_KEY_FILE. Isto exige o privilgio Reload_priv.
Um benefcio de ter um conjunto de chaves padres que ele d a aplicao um modo de verifi-
car a existncia de valores criptografados em colunas, sem dar ao usurio final o direito de des-
criptografar estes valores.
mysql> SELECT endereco_clientes FROM tabela_clientes WHERE
cartao_credito_criptografado = DES_ENCRYPT("numero_cartao_credito");
DES_DECRYPT(string_para_descriptografar [, chave_string])
Derscritogra uma string criptografada com DES_ENCRYPT().
Note que esta 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.
Referncia de Linguagem do MySQL
513
Havendo erro, esta funo retorna NULL.
COMPRESS(string_para_compactar)
Compacta uma string
mysql> SELECT LENGTH(COMPRESS(REPEAT("a",1000)));
-> 21
1 row in set (0.00 sec)
mysql> SELECT LENGTH(COMPRESS(""));
-> 0
1 row in set (0.00 sec)
mysql> SELECT LENGTH(COMPRESS("a"));
-> 13
1 row in set (0.00 sec)
mysql> SELECT LENGTH(COMPRESS(REPEAT("a",16)));
-> 15
1 row in set (0.00 sec)
COMPRESS() foi adicionado no MySQL 4.1.1. Se exigido, o MySQL tem que ser compilado
com uma biblioteca de compactao como zlib. Seno , o valor de retorno sempre NULL.
O contedo da string compactada armazenada da seguinte forma:
Strings vazias so armazenadas como strings vazias
Strings que no esto vazias so armazenadas como um string descompacatada de 4 byte de
tamanho (low-byte-first) seguida pela string compactada com gzip. Se a string finaliza com
espao, adicionamos um '.' extra para evitar problemas com o corte do espao final o resul-
tado deve ser armazenado em um campo CHAR ou VARCHAR. O uso de CHAR ou VARCHAR
para armazenar strings compactadas no recomendado. melhor usar uma coluna BLOB.
UNCOMPRESS(string_para_descompactar)
Descompacta uma string compactado pela funo COMPRESS()
mysql> select UNCOMPRESS(COMPRESS("any string"));
-> 'any string'
1 row in set (0.00 sec)
UNCOMPRESS() foi adicionado no MySQL 4.1.1 Se exigido, o MySQL tem que ser compilado
com uma biblioteca de compactao como zlib. Seno , o valor de retorno sempre NULL.
UNCOMPRESSED_LENGTH(string_compactada)
Retorna o tamanho da string compactada antes da compactao
mysql> select UNCOMPRESSED_LENGTH(COMPRESS(REPEAT("a",30)));
-> 30
1 row in set (0.00 sec)
UNCOMPRESSED_LENGTH() foi adicionado no MySQL 4.1.1
Referncia de Linguagem do MySQL
514
LAST_INSERT_ID([expr])
Retorna o ltimo valor gerado automaticamente que tenha sido inserido em um coluna AU-
TO_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 re-
centemente 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 preci-
sar de locks ou transaes.
O valor de LAST_INSERT_ID() no alterado se voc atualizar uma coluna AU-
TO_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 automati-
camente (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 UP-
DATE, 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 deci-
mais, 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);
Referncia de Linguagem do MySQL
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 time-
out 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 es-
touro de memria ou a threado tiver sido finalizada com mysqladmin kill). Uma trava li-
berada quando voc executa RELEASE_LOCK(), executa uma nova GET_LOCK(), ou a thre-
ad termina. (tanto de forma normal quanto anormal) Esta funo pode ser usada para implemen-
tar bloqueio de aplicao ou para simular registros travados. Nomes so bloqueados em uma ba-
se 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 concor-
dam com um dado nome da trava possam usar a string para realizar travamento de consultas co-
operativas:
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
Referncia de Linguagem do MySQL
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 sem-
pre 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 pe-
so 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 enderea-
mento:
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.
MASTER_POS_WAIT(nome_log, log_pos [, tempo_limite])
Envia blocos o slave alcanar (ex.: ter lido e aplicado todas as atualizaes) a posio especfica
no log master. Se a informao master no est inicializada, ou se os argumentos esto incorre-
tos, retorna NULL. Se o slave no est em execuo, enviar blocos e ir esperar at que ele seja
Referncia de Linguagem do MySQL
517
iniciado e v para (ou passe por) a posio especificada. Se o slave j passou pela posio espe-
cificada, retorna imediatamente.
Se tempo_limite (novo na verso 4.0.10) especificado, ir esperar at que tem-
po_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 even-
tos 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 ins-
truo 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 dife-
rente 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 n-
mero 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 ou-
tras sees de um resultado de busca. Usar FOUND_ROWS() lhe permite determinar quantos ou-
tras 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:
A palavra chave SQL_CALC_FOUND_ROWS deve aparecer na primeira SELECT do
UNION.
O valor de FOUND_ROWS() exato apenas se UNION ALL for usado. Se UNION 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 retor-
na o nmero de linhas na tabela temporria que criada para processar o UNION.
SQL_CALC_FOUND_ROWS e FOUND_ROWS() esto disponveis a partir da verso 4.0.0 do
MySQL.
Referncia de Linguagem do MySQL
518
6.3.7. Funes e Modificadores para Usar com Clusu-
las GROUP BY
6.3.7.1. Funes GROUP BY
Se voc utiliza um funo de agrupamento em uma instruo que no contenha um clusula GROUP
BY, equivale a fazer um agrupamento com todos os registros.
COUNT(expr)
Retorna a quantidade de valores no-NULL nos registros recuperados por uma instrucao SE-
LECT:
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 ta-
bela, 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 re-
gistros armazenada para estes tipos de tabelas e podem ser acessadas muito rapidamente. Para
mecanismos de armazenamentos transacionais (InnodB, BDB), armazenar um contagem de re-
gistros 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 ex-
presso 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 ar-
Referncia de Linguagem do MySQL
519
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 con-
junto. 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:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {inteiro_sem_sinal | nome_coluna | formula} [ASC | DESC] [,col ...]]
[SEPARATOR valor_str])
Esta funo foi adicionada na verso 4.1 do MySQL. Ele retorna a string resultante contendo va-
lores de um grupo:
mysql> SELECT nome_estudante,
-> GROUP_CONCAT(note_teste)
-> FROM estudante
-> GROUP BY nome_estudante;
ou
mysql> SELECT nome_estudante,
-> GROUP_CONCAT(DISTINCT nota_teste
-> ORDER BY nota_teste DESC SEPARATOR " ")
-> FROM estudante
-> GROUP BY nome_estudante;
No MySQL voc pode obter valores de combinaes de expresses concatenados. Voc pode
eliminar valores duplicados utilizando DISTINCT. Se voc quiser ordenar valores no resultado
voc deve utilizar a clusula ORDER BY. Para ordenar inversamente, adicione a palavra chave
DESC (descendente) ao nome da coluna que voc est ordenando na clusula ORDER BY. O pa-
dro a ordem crescente; pode-se tambm especificla explicitamente usando a palavra chave
ASC. SEPARATOR o valor string que deve ser inserido entre os valores no resultado. O padro
um virgula ('","'). Voc pode remover o separador especificando SEPARATOR "".
Voc pode definir um tamanho mximo permitido com a varivel group_concat_max_len
em sua configurao. A sintaxe para se fazer isto em tempo de execuo :
SET [SESSION | GLOBAL] group_concat_max_len = unsigned_integer;
Se um tamanho mximo tiver sido atribuido, o resultado truncado no seu tamanho mximo.
A funo GROUP_CONCAT() uma implementao aprimorada da funo bsica LIST() su-
portada pelo Sybase SQL Anywhere. GROUP_CONCAT() compatvel com a funcionalidade
extrwemamente limitada de de LIST(), se utilizada em apenas uma coluna e nenhuma outra
opo especificada. LIST() no tem uma ordem de classificao padro.
VARIANCE(expr)
Referncia de Linguagem do MySQL
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.
6.3.7.2. Modificadores GROUP BY
No MySQL 4.1.1, a clusula GROUP BY permite um modificador WITH ROLLUP que faz com que
uma linha extra seja adicionada saida resumo. Estas linhas representam operaes de resumo de
nvel mais alto (ou super agregadas). Assim, o ROLLUP permite que voc responda questes em
multiplos nveis de anlise com uma nica consulta. Ele pode ser usado, por exemplo, para fornecer
suporte para operaes OLAP (Online Analytical Processing - Processamento Analtico OnLine).
Como ilustrao, suponha que uma tabela chamada sales tenha as colunas year, country,
product e profit para registrar as vendas lucrativas:
CREATE TABLE sales
(
year INT NOT NULL,
country VARCHAR(20) NOT NULL,
product VARCHAR(32) NOT NULL,
profit INT
);
O contedo da tabela pode ser resumido pode ano com um simples GROUP BY como este:
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year;
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 | 4525 |
Referncia de Linguagem do MySQL
521
| 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 adici-
onal.
Ou voc pode usar o ROLLUP, que fornece os dois nveis de anlise com uma nica consulta. Adici-
onando um modificador WITH ROLLUP a clusula GROUP BY faz com que a consulta produza ou-
tra 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 ROL-
LUP 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 |
Referncia de Linguagem do MySQL
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 produ-
zida 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 mos-
trando o total para todos os pases e produtos. Estas linhas tm as colunas country e pro-
ducts atribudas com NULL.
Finalmente, seguindo todas as outras linhas, um linha resumo extra produzida mostrando o to-
tal geral para todos os anos, pases e produtos. Esta linha tem as colunas year, country e
products atribudas com NULL.
Outras Consideraes ao Usar ROLLUP
O seguinte item lista alguns comportamentos especficaos para a implementao do ROLLUP no
MySQL:
Quando voc usa ROLLUP, voc no pode usar uma clusula ORDER BY para ordenar os resulta-
dos. (Em outras palavras, ROLLUP e ORDER BY so exclusivos mutualmente.) No entanto, voc
ainda tem algum controle sobre a ordem de ordenao. O GROUP BY no MySQL ordena os resulta-
dos, e voc pode usar as palavras chaves ASC e DESC explicitamente com colunas chamadas na lis-
ta GROUP BY para especificar a ordem de classificao para colunas individuais. (A linha resumo
de nvel mais alto adicionado por ROLLUP ainda aparece depois da linha para as quais elas so cal-
culadas, considerando a ordenao.)
LIMIT pode ser usado para restringir o nmerod e linhas retornadas para o cliente. LIMIT aplica-
do depois do ROLLUP, assim o limite se aplica contra as linhas extras adicionadas por ROLLUP. Por
exemplo:
mysql> SELECT year, country, product, SUM(profit)
-> FROM sales
-> GROUP BY year, country, product WITH ROLLUP
-> LIMIT 5;
+------+---------+------------+-------------+
| year | country | product | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer | 1500 |
| 2000 | Finland | Phone | 100 |
| 2000 | Finland | NULL | 1600 |
| 2000 | India | Calculator | 150 |
| 2000 | India | Computer | 1200 |
+------+---------+------------+-------------+
Note que usar LIMIT com ROLLUP pode produzir resultados mais difceis de interpretar, porque
voc tm menos contexto para entender as linhas super agrupadas.
O indicador NULL em cada linha super-agrupadas so produzidas quando a linha enviada para o
Referncia de Linguagem do MySQL
523
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 combi-
nao 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 est-
gio 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 qual-
quer interface de programao do cliente MySQL.
6.3.7.3. GROUP BY com Campos Escondidos
O MySQL tem extendido o uso de GROUP BY. Voc pode utilizar colunas ou clculos na expresso
SELECT que no aparecem na parte GROUP BY. Ele espera por qalquer valor possvel para este
grupo. Voc pode utilizar isto para conseguir um melhor desempenho evitando ordenao e agrupa-
mento em itens desnecessrios. Por exemplo, voc no precisa fazer um agrupamento em clien-
te.nome na consulta seguinte:
mysql> SELECT pedido.idcliente,cliente.nome,MAX(pagamento)
-> FROM pedido, cliente
-> WHERE pedido.idcliente = cliente.idcliente
-> GROUP BY pedido.idcliente;
No padro SQL, voc teria que adicionar cliente.nome a clusula GROUP BY. No MySQL, o
nom redundante se voc no o executa em modo ANSI.
No utilize este recurso se as colunas omitidas na parte GROUP BY no so nicas no grupo! Voc
obter resultados inexperados.
Em alguns casos, voc pode utilizar MIN e MAX para obter o valor de uma coluna especfica, mesmo
que ele no seja nico. O exemplo seguinte fornece o valor de coluna do registro contendo o me-
nor valor na coluna ordem:
SUBSTR(MIN(CONCAT(RPAD(ordem,6,' '),coluna)),7)
See Seco 3.6.4, As Linhas Armazenando o Group-wise Mximo de um Certo Campo.
Note que se voc estiver usando a verso 3.22 do MySQL (ou anterior) ou se estiver tentando seguir
o SQL-99, voc no pode utilizar expresses nas clusulas GROUP BY or ORDER BY. Voc pode
contornar esta limitao utilizando um alias para a expresso:
mysql> SELECT id,FLOOR(value/100) AS val FROM nome_tabela
-> GROUP BY id,val ORDER BY val;
Na verso 3.23 do MySQL voc pode fazer:
mysql> SELECT id,FLOOR(value/100) FROM nome_tabela ORDER BY RAND();
6.4. Manipulao de Dados: SELECT, INSERT,
UPDATE e DELETE
6.4.1. Sintaxe SELECT
SELECT [STRAIGHT_JOIN]
Referncia de Linguagem do MySQL
524
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
expresso_select,...
[INTO {OUTFILE | DUMPFILE} 'nome_arquivo' opes_exportao]
[FROM tabelas_ref
[WHERE definio_where]
[GROUP BY {inteiro_sem_sinal | nome_col | formula} [ASC | DESC], ...
[WITH ROLLUP]]
[HAVING where_definition]
[ORDER BY {inteiro_sem_sinal | nome_coluna | formula} [ASC | DESC], ...]
[LIMIT [offset,] row_count | row_count OFFSET offset]
[PROCEDURE nome_procedimento(lista_argumentos)]
[FOR UPDATE | LOCK IN SHARE MODE]]
SELECT utilizado para retornar registros selecionados de uma ou mais tabelas. Cada expres-
so_select indica as colunas que voc deseja recuperar. SELECT tanbm pode ser utilizado para
retornar registros calculados sem referncia a nenhuma tabela. Por exemplo:
mysql> SELECT 1 + 1;
-> 2
Todas as clusulas usada devem ser fornecidas exatamente na ordem mostrada na descrio da sinta-
xe. Por exemplo, uma clusula HAVING deve vir depois de qualquer clusula GROUP BY e antes de
qualquer clusula ORDER BY.
Uma expresso SELECT pode utilizar um alias usando AS nome_alias. O alias usado co-
mo 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 expres-
ses SELECT: O MySQL interpretar o segundo como um nome de alias. Por exemplo, na segu-
inte 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 po-
de ainda no ter sido determinado quando a clusula WHERE for executada. See Seco A.5.4,
Problemas com alias.
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 co-
meam 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 es-
pecificada 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 SE-
Referncia de Linguagem do MySQL
526
LECT e WHERE.
A clusula HAVING pode se referir a qualquer coluna ou alias definido na expres-
so_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;
As opes DISTINCT, DISTINCTROW e ALL especificam quando registros duplicados devem
ser retornados. O padro (ALL), todos os registros coincidentes so retornados. DISTINCT e
DISTINCTROW so sinnimos e espcificam que registros duplicados no conjunto de resultados
devem ser remopvidos.
STRAIGHT_JOIN, HIGH_PRIORITY e opes comeando com SQL_ so extenses do
MySQL para SQL-99.
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 ex-
pandido 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 es-
to 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 Sec-
o 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; # Recupera linhas 6-15
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 96-ultima.
Se um dos argumentos dado, ele indica o nmero mximo de linhas a retornar:
mysql> SELECT * FROM tabela LIMIT 5; # Recupera as primeiras 5 linhas
Em outras palavras, LIMIT n equivalente a LIMIT 0,n.
STRAIGHT_JOIN identico a JOIN, exceto pelo fato de que a tabela de esquerda sempre li-
da 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 utilizan-
do 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 n-
dices 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 co-
mo 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> SELECT * FROM tabela1,tabela2 WHERE tabela1.id=tabela2.id;
mysql> SELECT * FROM tabela1 LEFT JOIN tabela2 ON tabela1.id=tabela2.id;
mysql> SELECT * FROM tabela1 LEFT JOIN tabela2 USING (id);
mysql> SELECT * FROM tabela1 LEFT JOIN tabela2 ON tabela1.id=tabela2.id
-> LEFT JOIN tabela3 ON tabela2.id=tabela3.id;
mysql> SELECT * FROM tabela1 USE INDEX (chave1,chave2)
-> WHERE chave1=1 AND chave2=2 AND chave3=3;
mysql> SELECT * FROM tabela1 IGNORE INDEX (chave3)
-> WHERE chave1=1 AND chave2=2 AND chave3=3;
See Seco 5.2.7, Como o MySQL Otimiza LEFT JOIN e RIGHT JOIN.
6.4.1.2. Sintaxe UNION
SELECT ...
UNION [ALL]
SELECT ...
[UNION
SELECT ...]
UNION foi implementado no MySQL 4.0.0.
UNION usado para combinar o resultado de muitas instrues SELECT em um nico conjunto de
resultados.
As colunas listadas na poro expresso_select de SELECT devem ter o mesmo tipo. Os nomes das
colunas usadas na primeira consulta SELECT sero usadas como nomes de colunas para o resultado
retornado.
Os comandos SELECT so comandos selects normais, mas com a seguinte restrio:
Referncia de Linguagem do MySQL
531
Somente o ltimo comando SELECT pode ter INTO OUTFILE.
Se voc no utilzar a palavra-chave ALL para o UNION, todas as linhas retornadas sero nicas, co-
mo 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;
6.4.2. Sintaxe de Subquery
Uma subquery uma instruo SELECT dentro de outra instruo. Por exemplo:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
No exemplo acima, SELECT * FROM t1 ... a consulta principal (ou instruo principal), e
(SELECT column1 FROM t2) a subquery. Dizemos que a subquery est aninhada na consul-
ta principal, e de fato possvel aninhar subqueries dentro de outras subqueries, a uma grande pro-
fundidade. uma subquery deve estar sempres dentro de parenteses.
A partir da verso 4.1. o MySQL suporta todas as formas de subqueries e operaes que o padro
SQL exige, assim como alguns recursos que so especificos do MySQL. A principal vantagem das
subqueries so:
elas permitem consultas que esto estruturadas assim possvel isolar cada parte de uma instru-
o,
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 paco-
te de ferramentas.
Aqui est uma instruo exemplo que mostra o ponto principal sobre a sintaxe de subquery como es-
pecificado 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 su-
cesso usando join e outros mtodos. See Seco 6.4.2.11, Rewriting Subqueries for Earlier MySQL
Versions.
6.4.2.1. A Subquery como um Operando Escalar
Referncia de Linguagem do MySQL
532
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 caractersti-
cas 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 colla-
tion 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 TABLE t1 (s1 INT);
INSERT INTO t1 VALUES (1);
CREATE TABLE t2 (s1 INT);
INSERT INTO t2 VALUES (2);
Then perform a SELECT:
SELECT (SELECT s1 FROM t2) FROM t1;
The result will be 2 because there is a row in t2, with a column s1, with a value of 2.
The subquery may be part of an expression. If it is an operand for a function, don't forget the pa-
rentheses. For example:
SELECT UPPER((SELECT s1 FROM t1)) FROM t2;
6.4.2.2. Comparaes Usando Subquery
The most common use of a subquery is in the form:
<non-subquery operand> <comparison operator> (<subquery>)
Where <comparison operator> is one of:
= > < >= <= <>
For example:
... 'a' = (SELECT column1 FROM t1)
Referncia de Linguagem do MySQL
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);
6.4.2.3. Subqueries with ANY, IN, and SOME
Syntax:
<operand> <comparison operator> ANY (<subquery>)
<operand> IN (<subquery>)
<operand> <comparison operator> SOME (<subquery>)
The word ANY, which must follow a comparison operator, means ``return TRUE if the comparison is
TRUE for ANY of the rows that the subquery returns.'' For example,
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
Suppose that there is a row in table t1 containing {10}. The expression is TRUE if table t2 conta-
ins {21,14,7} because there is a value in t2 -- 7 -- which is less than 10. The expression is FALSE if
table t2 contains {20,10}, or if table t2 is empty. The expression is UNKNOWN if table t2 contains
{NULL,NULL,NULL}.
The word IN is an alias for = ANY. Thus these two statements are the same:
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);
The word SOME is an alias for ANY. Thus these two statements are the same:
SELECT s1 FROM t1 WHERE s1 <> ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);
Use of the word SOME is rare, but the above example shows why it might be useful. The English ph-
rase ``a is not equal to any b'' means, to most people's ears, ``there is no b which is equal to a'' --
which isn't what is meant by the SQL syntax. By using <> SOME instead, you ensure that everyone
understands the true meaning of the query.
6.4.2.4. Subqueries with ALL
Syntax:
<operand> <comparison operator> ALL (<subquery>)
The word ALL, which must follow a comparison operator, means ``return TRUE if the comparison is
TRUE for ALL of the rows that the subquery returns''. For example,
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
Referncia de Linguagem do MySQL
534
Suppose that there is a row in table t1 containing {10}. The expression is TRUE if table t2 conta-
ins {-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 ca-
ses -- when writing subquery code, always consider whether you have taken those two possibilities
into account.
6.4.2.5. Correlated Subqueries
A correlated subquery is a subquery which contains a reference to a column which is also in the ou-
ter query. For example:
SELECT * FROM t1 WHERE column1 = ANY
(SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);
Notice, in the example, that the subquery contains a reference to a column of t1, even though the
subquery's FROM clause doesn't mention a table t1. So MySQL looks outside the subquery, and
finds t1 in the outer query.
Suppose that table t1 contains a row where column1 = 5 and column2 = 6; meanwhile table
t2 contains a row where column1 = 5 and column2 = 7. The simple expression ... WHE-
RE column1 = ANY (SELECT column1 FROM t2) would be TRUE, but in this example
the WHERE clause within the subquery is FALSE (because 7 <> 5), so the subquery as a whole is
FALSE.
Scoping rule: MySQL evaluates from inside to outside. For example:
SELECT column1 FROM t1 AS x
WHERE x.column1 = (SELECT column1 FROM t2 AS x
WHERE x.column1 = (SELECT column1 FROM t3 WHERE x.column2 = t3.column1));
In the above, x.column2 must be a column in table t2 because SELECT column1 FROM t2
AS x ... renames t2. It is not a column in table t1 because SELECT column1 FROM t1
... is an outer query which is further out.
For subqueries in HAVING or ORDER BY clauses, MySQL also looks for column names in the ou-
ter select list.
MySQL's unofficial recommendation is: avoid correlation because it makes your queries look more
complex, and run more slowly.
6.4.2.6. EXISTS and NOT EXISTS
Referncia de Linguagem do MySQL
535
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?''.
6.4.2.7. Row Subqueries
The discussion to this point has been of column (or scalar) subqueries -- subqueries which return a
single column value. A row subquery is a subquery variant that returns a single row value -- and
may thus return more than one column value. Here are two examples:
SELECT * FROM t1 WHERE (1,2) = (SELECT column1, column2 FROM t2);
SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);
The queries above are both TRUE if table t2 has a row where column1 = 1 and column2 =
2.
The expression (1,2) is sometimes called a row constructor and is legal in other contexts too. For
example
SELECT * FROM t1 WHERE (column1,column2) = (1,1);
is equivalent to
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
Referncia de Linguagem do MySQL
536
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 du-
plicated in table t2'':
SELECT column1,column2,column3
FROM t1
WHERE (column1,column2,column3) IN
(SELECT column1,column2,column3 FROM t2);
6.4.2.8. Subqueries in the FROM clause
Subqueries are legal in a SELECT statement's FROM clause. The syntax that you'll actually see is:
SELECT ... FROM (<subquery>) AS <name> ...
The AS <name> clause is mandatory, because any table in a FROM clause must have a name. Any
columns in the <subquery> select list must have unique names. You may find this syntax descri-
bed elsewhere in this manual, where the term used is ``derived tables''.
For illustration, assume you have this table:
CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);
Here's how to use the Subqueries in the FROM clause feature, using the example table:
INSERT INTO t1 VALUES (1,'1',1.0);
INSERT INTO t1 VALUES (2,'2',2.0);
SELECT sb1,sb2,sb3
FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb
WHERE sb1 > 1;
Result: 2, '2', 4.0.
Here's another example: Suppose you want to know the average of the sum for a grouped table. This
won't work:
SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1;
But this query will provide the desired information:
SELECT AVG(sum_column1)
FROM (SELECT SUM(column1) AS sum_column1
FROM t1 GROUP BY column1) AS t1;
Notice that the column name used within the subquery (sum_column1) is recognized in the outer
query.
At the moment, subqueries in the FROM clause cannot be correlated subqueries.
6.4.2.9. Subquery Errors
There are some new error returns which apply only to subqueries. This section groups them together
because reviewing them will help remind you of some points.
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 defini-
do 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 atri-
buem valor a apenas algumas colunas porque ele permite que voc evite escrever uma lista VA-
LUES() incompleta (uma lista que no inclu um valor para cada coluna da tabela). De outa for-
ma, 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 inse-
ridas 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 in-
serir 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 LOW_PRIORITY, a execuo do INSERT atrasada at
que nenhum outro cliente esteja lendo a tabela. Isto inclui outros clientes que comeam a ler en-
quanto clientes existentes j esto lendo e enquanto a instruo INSERT LOW_PRIORITY est
esperando. possvel, consequentemente, para um cliente que envia uma instruo INSERT
LOW_PRIORITY esperar por um tempo muito longo (ou mesmo para sempre) em um ambiente
de muita leitura. ( diferente de INSERT DELAYED, que deixa o cliente continuar de uma vez.
See Seco 6.4.3.2, Sintaxe INSERT DELAYED. Note que LOW_PRIORITY no deve nor-
malmente ser usado com tabelas MyISAM ja que elas disabilitam inseres concorrentes. See
Seco 7.1, Tabelas MyISAM.
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;
Referncia de Linguagem do MySQL
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 se-
ria 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 coman-
do 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> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=3;
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
-> ON DUPLICATE KEY UPDATE c=9;
A utilizar ON DUPLICATE KEY UPDATE, a opo DELAYED ignorada.
Se MySQL foi configurado usando a opo DONT_USE_DEFAULT_FIELDS, instrues IN-
SERT 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 valo-
res 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 reverti-
do para final apropriado da faixa.
Referncia de Linguagem do MySQL
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.
6.4.3.1. Sintaxe INSERT ... SELECT
INSERT [LOW_PRIORITY] [IGNORE] [INTO] nome_tabela [(column list)] SELECT ...
Com a instruo INSERT ... SELECT voc pode inserir muitas linhas rapidamente em uma ta-
bela a partir de outras tabelas
INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE
tblTemp1.fldOrder_ID > 100;
As seguintes condies servem para uma instruo INSERT ... SELECT:
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.
Colunas AUTO_INCREMENT funcionam da mesma forma.
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 per-
mitir inseres concorrentes em um INSERT ... SELECT.
Voc tambm pode utilizar REPLACE em vez de INSERT para sobrescrever linhas antigas. RE-
PLACE 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 anti-
gas em vez de descart-las.
6.4.3.2. Sintaxe INSERT DELAYED
INSERT DELAYED ...
A opo DELAYED para a instruo INSERT um opo especfica do MySQL que muito til se
voc tiver clientes que no possam esperar que o INSERT se complete. Este um problema comum
quando voc utiliza o MySQL para fazer log e voc tambm execute periodicamente instrues SE-
LECT e UPDATE que levem muito tempo para completar. DELAYED foi intriduzido no MySQL ver-
so 3.22.15. Ela uma extenso do MySQL ao SQL-92.
INSERT DELAYED s funciona com tabelas ISAM e MyISAM. Note que como tabelas MyISAM
suportam SELECT e INSERT concorrentes, se no houver blocos livres no meio do arquivo de da-
dos, voc raramente precisar utilizar INSERT DELAYED com MyISAM. See Seco 7.1, Tabelas
MyISAM.
Quando voc utiliza INSERT DELAYED, o cliente ir obter um OK de uma vez e a linha ser inse-
Referncia de Linguagem do MySQL
544
rida quando a tabela no estiver sendo usada por outra thread.
Outro grande benefcio do uso de INSERT DELAYED e que inseres de muitos clientes so empa-
cotados juntos e escritos em um bloco. Isto muito mais rpido que se fazer muitas inseres sepe-
radas.
Note que atualmente as linhas enfileirdas s so armazenadas em memria at que elas sejam inseri-
das na tabela. Isto significa que se voc matar o mysqld com kill -9 ou se o mysqld finalizar
inesperadamente, as linhas enfileiradas que no forma escritas em disco so perdidas.
A seguir temos uma descrio em detalhes do que acontece quando voc utiliza a opo DELAYED
com INSERT ou REPLACE. Nesta descrio, a ``thread'' e a thread que recebe um comando IN-
SERT DELAYED e ``handler'' a thread que trata todas as instrues INSERT DELAYED de uma
tabela particular.
Quando uma thread executa uma instruo DELAYED em uma tabela, uma thread handler cria-
da 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 cliente no pode relatar o nmero de duplicatas ou o valor AUTO_INCREMENT para a linha
resultante; ele no pode obt-los do servidor, pois o INSERT retorna antes da operao de inser-
o ser completada. Se voc utiliza a API C, a funo mysql_info() no ir retornar nada
significante, pela mesma razo.
O log binrio atualizado pela thread handler quando a linha inserida na tabela. No caso de in-
sero de mltiplas linhas, o log binrio atualizado quando a primeira linha inserida.
Depois que todas as linhas delayed_insert_limit so escrita, o handle verifica se alguma
instruo SELECT est pendente. Se estiver, ele permite que ela seja executada antes de continu-
ar.
Quando o handler no tiver mais linhas na fila, a tabela destravada. Se nunhum comando IN-
SERT DELAYED novo recebido dentro de delayed_insert_timeout segundos, o hand-
ler 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 dela-
yed_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 li-
nhas 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 TA-
BLES.
As seguintes variveis de estado fornecem informo sobre comandos INSERT DELAYED:
Varivel Significado
Referncia de Linguagem do MySQL
545
Dela-
yed_insert_threads
Nmero de threads handler
Delayed_writes Nmeros de linhas escrita com INSERT DELAYED
Not_flushed_delayed_
rows
Nmero de linhas esperando para serem escritas
Voc pode visualizar estas variveis com a instruo SHOW STATUS ou executando um coman-
do 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!
6.4.4. Sintaxe UPDATE
UPDATE [LOW_PRIORITY] [IGNORE] nome_tabela
SET nome_coluna1=expr1 [, nome_coluna2=expr2 ...]
[WHERE definio_where]
[ORDER BY ...]
[LIMIT row_count]
ou
UPDATE [LOW_PRIORITY] [IGNORE] nome_tabela [, nome_tabela ...]
SET nome_coluna1=expr1 [, nome_coluna2=expr2 ...]
[WHERE definio_where]
UPDATE atualiza uma coluna em registros de tabelas existentes com novos valores. A clusula SET
indica quais colunas modificar e os valores que devem ser dados. A clusula WHEREi, se dada, espe-
cifica quais linhas devem ser atualizadas. Seno todas as linhas so atualizadas. Se a clusula OR-
DER BY especificada, as linhas sero atualizada na ordem especificada.
Se voc especificar a palavra-chave LOW_PRIORITY, a execuo de UPDATE e atrasada at que
nenhum outro cliente esteja lendo da tabela.
Se voc especificar a palavra-chave IGNORE, a instruo no ser abortada memso se ns obtermos
erros de chaves duplicadas durante a atualizao. Linhas que causem conflitos no sero atualizadas.
Se voc acessa um coluna de nome_tabela em uma expresso, UPDATE utiliza o valor atual da
coluna. Por exemplo, a seguinte instruo define a coluna age com o valor atual mais um:
mysql> UPDATE persondata SET age=age+1;
Atribuioes UPDATE so avaliadas da esquerda para a direitat. Por exemplo, a seguinte instruo
dobra a coluna age e ento a incrementa:
mysql> UPDATE persondata SET age=age*2, age=age+1;
Se voc define uma coluna ao valor que ela possui atualmente, o MySQL notar isto no ir atuali-
z-la.
UPDATE retorna o nmero de linhas que forma realmente alteradas. No MySQL Verso 3.22 ou
posterior, a funo mysql_info() da API C retorna o nmero de linhas encontradas e atualizadas
e o nmero de avisos que ocorreram durante o UPDATE.
A partir do MySQL verso 3.23, voc pode utilizar LIMIT row_count para restringir o escopo
do UPDATE. Uma clusula LIMIT funciona da seguinte forma:
Referncia de Linguagem do MySQL
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 mlti-
plas 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-ta-
belas 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.
6.4.5. Sintaxe DELETE
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name
[WHERE definio_where]
[ORDER BY ...]
[LIMIT row_count]
ou
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] table_name[.*] [, table_name[.*] ...]
FROM tabelas-referentes
[WHERE definio_where]
ou
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM nome_tabela[.*] [, nome_tabela[.*] ...]
USING tabelas-referentes
[WHERE definio_where]
DELETE deleta linhas de nome_tabela que satisfaam a condio dada por defini-
o_where, e retorna o nmero de registros deletados.
Se voc exeecutar um DELETE sem clusula WHERE, todas as linhas so deletadas. Se voc o fizer
no modo AUTOCOMMIT, isto ir funcionar como TRUNCATE. See Seco 6.4.6, Sintaxe TRUNCA-
TE. No MySQL 3.23, DELETE sem uma clusula WHERE retornar zero como o nmero de regis-
tros afetados.
Se voc realmente quiser saber quantos registros so deletados quando voc deletar todas as linhas
mesmo sofrendo uma com a queda da velocidade, voc pode utilizar uma instruo DELETE desta
forma:
mysql> DELETE FROM nome_tabela WHERE 1>0;
Note que isto muito mais lento que DELETE FROM nome_tabela sem clusula WHERE, pois
ele deleta uma linha de cada vez.
Se voc especificar a palavra-chave LOW_PRIORITY, a execuo do DELETE atrasda at que ne-
nhum outro cliente esteja lendo da tabela.
Para tabelas MyISAM, Se voc especificar a palavra QUICK, o mecanismo de armazenamento no
ir fundir os ndices excludos durante a deleo, o que pode aumentar a velocidade de certos tipos
de deleo.
Referncia de Linguagem do MySQL
547
A velocidade das operaes de deleo tambm pode ser afetadas pelos fatores discutidos em Sec-
o 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 redu-
zir 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 Sec-
o 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 for-
mato 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-ta-
belas 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 na-
quela 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 mxi-
mo de linhas a serem deletadas antes do controle retornar ao cliente. Isto pode ser usado para asse-
gurar que uma comando DELETE especfico mo tomar muito tempo, Voc pode simplesmente re-
petir 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.
6.4.6. Sintaxe TRUNCATE
TRUNCATE TABLE nome_tabela
Na verso 3.23 TRUNCATE TABLE mapeada para COMMIT; DELETE FROM table_name.
See Seco 6.4.5, Sintaxe DELETE.
TRUNCATE TABLE difere de DELETE FROM ... do seguinte modo:
Referncia de Linguagem do MySQL
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 transa-
o ativa ou ativar um travamento de tabela.
O nmero de linhas apagadas no retornado.
Uma vez que o arquivo de definio nome_tabela.frm deja vlido, a tabela pode ser recria-
da 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.
6.4.7. Sintaxe REPLACE
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] nome_tabela [(nome_coluna,...)]
VALUES (expresso,...),(...),...
ou REPLACE [LOW_PRIORITY | DELAYED]
[INTO] nome_tabela [(nome_coluna,...)]
SELECT ...
ou REPLACE [LOW_PRIORITY | DELAYED]
[INTO] nome_tabela
SET nome_coluna=expresso, nome_coluna=expresso,...
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 REPLA-
CE. 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 va-
lor 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
6.4.8. Sintaxe LOAD DATA INFILE
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
Referncia de Linguagem do MySQL
549
INTO TABLE nome_tabela
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
]
[LINES
[STARTING BY '']
[TERMINATED BY '\n']
]
[IGNORE nmero LINES]
[(nome_coluna,...)]
A instruo LOAD DATA INFILE l linhas de uma arquivo texto para uma tabela em uma veloci-
dade muito alta. Se a palavra-chave LOCAL especificada, ela interpretada com respeito ao fim da
conexo do cliente. Quando LOCAL especificado, o arquivo lido pelo programa cliente na m-
quina cliente e enviada ao servidor. Se LOCAL no especificada, o arquivo deve estar localizado
na mquina servidora e lida diretamente pelo servidor (LOCAL est disponvel no MySQL Verso
3.22.6 ou posterior).
Por razes de segurana, ao ler arquivos textos no servidor, os arquivos devem tambm estar no di-
retrio de banco de dados ou serem lidos por todos. Tambm, para utilizar LOAD DATA INFILE
em arquivos do servidor, voc deve ter privilgio FILE na mquina servidora. See Seco 4.3.7,
Privilgios Fornecidos pelo MySQL.
A partir do MySQL 3.23.49 e MySQL 4.0.2 (4.0.13 no Windows) LOCAL s funcionar se o seu
servidor e o seu cliente forem habilitados para permitir isto. Por exemplo so o mysqld foi iniciado
com --local-infile=0, LOCAL no ir funcionar. See Seco 4.3.4, Detalhes de Segurana
com LOAD DATA LOCAL.
Se voc especificar a palavra-chave LOW_PRIORITY, a execuo da instruo LOAD DATA atra-
sada at nenhum outro cliente estar lendo a tabela.
Se voc especificar a palavra-chave CONCURRENT com uma tabela MyISAM, outras threads podem
retornar dados da tabela enquanto LOAD DATA est executando. Utilizar esta opo ir afetar o de-
sempenho de LOAD DATA um pouco, mesmo se nenhuma outra thread utilizar a tabela ao mesmo
tempo.
Utilizar LOCAL ser um pouco mais lento que deixar o servidor acessar os arquivos diretamente,
pois o contedo do arquivo deve ser enviado pela conexo da mquina cliente at a mquina servi-
dora. Por outro lado, voc no precisa de ter o privilgio FILE para carregar arquivos locais.
Se voc estiver utilizando uma verso do MySQL anterior a 3.23.24, voc no poder ler de um FI-
FO com LOAD DATA INFILE. Se voc precisar ler de um FIFO (por exemplo a sada de gunzip),
utilize LOAD DATA LOCAL INFILE.
Voc tambm pode carregar arquivo de dados utilizado o utilitrio mysqlimport; ele opera envi-
ando um comando LOAD DATA INFILE para o servidor. A opo --local faz com que mysq-
limport leia ao arquivo de dados a partir da mquina cliente. Voc pode especificar a opo -
-compress para conseguir melhor desempenho sobre redes lentas se o cliente e o servidor supor-
tar protocolos compactados.
Ao localizar arquivos na mquina servidora, o servidor utiliza as segintes regras:
Se um caminho absoluto dado, o servidor utiliza o caminho desta forma.
Se um caminho relativo com um ou mais componentes dados, o servidor busca o arquivo em
relao ao diretrio de dados do servidor.
Se um nome de arquivo sem nenhum componente dado, o servidor procura pelo arquivo no di-
retorio de banco de dados do banco de dados atual.
Referncia de Linguagem do MySQL
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 dupli-
cam linhas existentes em valores de chave nica.
Se voc especificar REPLACE, as linhas inseridas substituiro as linhas existentes (em outras pala-
vras, 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 depen-
de de se a palavra chave LOCAL especificada ou no. Sem LOCAL, um erro ocorre quando um va-
lor de chave duplicada encontrado, e o resto do arquivo texto ignorado. Com LOCAL o compor-
tamento 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 IN-
FILE 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 Fa-
lhas.
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 opicio-
nais, 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 li-
nha. 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:
Referncia de Linguagem do MySQL
551
Procure pelo limite da linha em linhas novas.
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.
Quebre a linha em campos na tabulaes.
No espere que os campos estejam entre aspas.
Interprete a ocorrncia de tabulaes, novas linhas ou '\' precedidos por '\' como caracteres lite-
rias que so parte dos valores dos campos.
Inversamente, os padres fazem SELECT ... INTO OUTFILE funcionar da seguinte forma ao
escrever as sadas:
Escreva tabulaes entre os campos.
No coloque campos entre aspas.
Utilize '\' para considerar como parte dos campos instncias de tabulao, nova linha ou '\' que
estejam dentro dos valores dos campos.
Escreva novas linhas no fim de cada linha.
Note que para escrever FIELDS ESCAPED BY '\\', voc deve especificar duas barras inverti-
das 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 no-
mes 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 de-
vem 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,
Referncia de Linguagem do MySQL
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 LI-
NES TERMINATED BY podem ser mais de uma caracter. Por exemplo, para escrever linhas termi-
nadas 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 string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"
Se voc especificar OPTIONALLY, o caracter ENCLOSED BY s usados para delimitar campos
CHAR e VARCHAR:
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a 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 IN-
FILE. 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 string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20
Para entrada, o caracter ENCLOSED BY, se presente, ser eliminado do fim dos valores dos cam-
pos. (Isto verdade se OPTIONALLY for especificado; OPTIONALLY no tem efeito na interpreta-
o 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 TER-
MINATED BY. Para evitar ambiguidade, ocorrncias do caracter ENCLOSED BY dentro de um va-
Referncia de Linguagem do MySQL
553
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 -> 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:
O caracter FIELDS ESCAPED BY
O caracter FIELDS [OPTIONALLY] ENCLOSED BY
O primeiro caracter dos valores FIELDS TERMINATED BY e LINES TERMINATED BY
ASCII 0 (o que escrito seguido de um caracter de escape ASCII '0', no o byte de valor ze-
ro).
Se o caracter FIELDS ESCAPED BY estiver vazio, nenhum caracter ser ``escapado''. Provavel-
mente 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 ca-
racter 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 trata-
mento 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:
Se LINES TERMINATED BY uma string vazia e FIELDS TERMINATED BY no vazio,
as linhas tambm sero terminadas com FIELDS TERMINATED BY.
Se os valores FIELDS TERMINATED BY e FIELDS ENCLOSED BY so ambos vazios
(''), um formato de linha de tamanhos fixos (sem delimitadores) utilizada. Com formato de
linhas de tamanho fixo, nenhum deliitador usado entre os campos (mas voc ainda pode ter um
terminador de linha). Valores de colunas so escritos e lidos usando o tamanho definido das co-
lunas. Por exemplo, se uma coluna declarada como INT(7), os valores das colunas so escri-
tos utilizando campos de 7 caracteres. Na sada, os valores das colunas so obtidos lendo 7 ca-
racteres.
LINES TERMINATED BY ainda usado para separar linhas. Se uma linha no contm todos
os campos, o resto dos campos sero configurados com o seu valor padro. Se voc no tiver um
terminador de linha, voc deve defini-lo com ''. Neste caso o arquivo texto deve conter todos
os campos para cada linha.
O formato de linhas de tamanho fixo tambm afetam o tratamento de valores NULL; veja abixo.
Note que este formato no funciona se voc estiver utilizando um conjunto de caracteres mulyi-
byte.
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 co-
mo NULL para as entradas (assumindo que o caracter ESCAPED BY '\').
Referncia de Linguagem do MySQL
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').
Se FIELDS ESCAPED BY for vazio, NULL escrito como a palavra NULL.
Com os formatos de tamanho fixos (que acontecem quando FIELDS TERMINATED BY e FI-
ELDS 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.
Alguns casos no so suportados por LOAD DATA INFILE:
Linhas de tamanho fixo (FIELDS TERMINATED BY e FIELDS ENCLOSED BY vazios) e
colunas BLOB ou TEXT.
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 cau-
saria 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 TER-
MINATED BY far com que LOAD DATA INFILE pare de ler um campo ou linha antes do es-
perado. Isto ocorre porque LOAD DATA INFILE no pode determinar apropriadamente onde o
valor de campo ou linha acaba.
A oseguinte exemplo carrega todas as colunas da tablea persondata:
mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
Nenhuma lista de campo especificada, assim LOAD DATA INFILE espera linhas de entradas
que contenha um campo para cada coluna da tabela. Os valores padres de FIELDS e LINES so
usados.
Se voc deseja carregar somente algumas das colunas das tabelas, especifique uma lista de campos:
mysql> LOAD DATA INFILE 'persondata.txt'
-> INTO TABLE persondata (col1,col2,...);
Voc deve especificar uma lista de campos se a ordem dos campos no arquivo de entrada diferem da
ordem das colunas na tabela. Seno o MySQL no poder dizer como combinar os campos da entra-
da nas colunas da tabela.
Se uma linha tiver poucos campos, as colunas para os quais o campo de entrada no estiverem pre-
sentes sero definidas com o valor padro. Atribuio de valor padro descrito em Seco 6.5.3,
Sintaxe CREATE TABLE.
Um valor de campo vazio interpretado de forma diferente de que se o valor do campo estiiver fal-
tando:
Para tipos string, a coluna definida com uma string vazia.
Para tipos numricos, a coluna definida com 0.
Para tipos de data e hora, a coluna definida com o valor ``zero'' apropriado para o tipo. See
Referncia de Linguagem do MySQL
555
Seco 6.2.2, Tipos de Data e Hora.
Note que estes so os mesmos valores que resultam se voc atribuir uma string vazia explicitamente
a um tipo string, numrico, de data ou de hora em uma instruo INSERT ou UPDATE.
Colunas TIMESTAMP s so definidas com a hora e data atual se houver um valor NULL para a co-
luna (isto , \N), ou (apenas para a primeira coluna TIMESTAMP) se a coluna TIMESTAMP esta a
esquerda da lista de campos quando esta for especificada.
Se uma linha de entrada tiver muitos campos, os campos extras sero ignorados e o nmero de avi-
sos incrementado. Note que antes do MySQL 4.1.1 o aviso apenas um nmero que indica que al-
guma coisa deu errado. No MySQL 4.1.1 voc pode fazer SHOW WARNINGS para obter mais infor-
maes sobre o que deu errado.
LOAD DATA INFILE considera todas as entradas como strings, assim voc no pode utiliar valo-
res numricos para colunas ENUM ou SET do mesmo modo que voc pode com instrues INSERT.
Todos os valores ENUM e SET devem ser especficados como strings!
Se voc estiver usando a API C, voc pode obter informaes sobre a consulta chamando a funo
mysql_info() da API C quando a consulta LOAD DATA INFILE terminar. O formato da
string de informao mostrado aqui:
Records: 1 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 ori-
ginal.
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 Utili-
zam INSERT.
6.4.9. Sintaxe HANDLER
HANDLER nome_tabela OPEN [ AS alias ]
HANDLER nome_tabela READ nome_indice { = | >= | <= | < } (valor1,valor2,...)
[ WHERE ... ] [LIMIT ... ]
HANDLER nome_tabela READ nome_indice { FIRST | NEXT | PREV | LAST }
[ WHERE ... ] [LIMIT ... ]
HANDLER nome_tabela READ { FIRST | NEXT }
[ WHERE ... ] [LIMIT ... ]
HANDLER nome_tabela CLOSE
Referncia de Linguagem do MySQL
556
A instruo HANDLER fornece acesso direto a interface do mecanismo de armazenamento de tabelas
MyISAM.
A primeira forma da instruo HANDLER abre uma tabela, tornando a acessvel atravs de subse-
quentes instrues HANDLER ... READ. Este objeto de tabela no copartilhada com outras th-
reads e no sero fechadas at que as chamadas de thread HANDLER nome_tabela CLOSE ou a
thread termine.
A segunda forma busca um registro (ou mais, especificado pela clusula LIMIT) onde o ndice es-
pecificado satisfaz os valores dados e a condio WHERE encontrada. Se voc tiver um ndice mul-
ti-coluna, especifique as colunas do ndice como uma lista separadas por vrgulas. Especifique o va-
lor de todas as colunas no ndice, ou especifique valores para o prefixo mais a esquerda das colunas
ndices. Suponha que um ndice inclui trs colunas chamadas col_a, col_b, e col_c, nesta or-
dem. A instruo HANDLER pode especificar valores para todas as trs colunas no ndice, ou para as
colunas no prefixo mais a esquerda. Por exemplo:
HANDLER ... index_name = (col_a_val,col_b_val,col_c_val) ...
HANDLER ... index_name = (col_a_val,col_b_val) ...
HANDLER ... index_name = (col_a_val) ...
A terceira forma busca uma linha (ou mais, especificado pela clusula LIMIT) da tabela na ordem
do ndice, correspondendo a condio WHERE.
A quarta forma (sem especificao de ndice) busca um registro (ou mais, especificado pela clusula
LIMIT) da tabela na ordem natural da linhas (como armazenado no arquivo de dados) de acordo
com a condio WHERE mais rpido que HANDLER nome_tabela READ nome_indice
quando necessria uma varredura completa da tabela.
HANDLER ... CLOSE fecha uma tabela que foi aberta com HANDLER ... OPEN.
Nota: Se voc estiver utilizando a interface HANDLER para PRIMARY KEY voc deve se lembrar
de colocar o nome entre aspas: HANDLER tbl READ `PRIMARY` > (...)
HANDLER uma instruo de baixo nvel. Por exemplo, ela no fornece consitncia. Isto , HAND-
LER ... OPEN NO pega uma imagem instntanea da tabela, e NO trava a tabela. Isto signifi-
ca que depois que um HANDLER ... OPEN feito, os dados da tabela podem ser modificados
(por esta ou outra thread) e estas modificaes podem aparecer apenas parcialmente nas buscas
HANDLER ... NEXT ou HANDLER ... PREV.
As razes para se utilizar esta interface em vez do SQL normal so:
Ela mais rpida que SELECT porque:
Um mecanismo de armazenamento designado alocado pela thread em HANDLER OPEN.
Existe menos anlise envolvida.
No existe sobrecaga de otimizao e verificao de consultas.
A tabela utilizada no precisa estar travada em pedidos de dois handlers.
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.
Referncia de Linguagem do MySQL
557
6.4.10. Sintaxe DO
DO expresso, [expresso, ...]
Executa a expresso mas no retorna nenhum resultado. Este um modo curto de SELECT ex-
presso, 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.
6.5. Definio de Dados: CREATE, DROP e AL-
TER
6.5.1. Sintaxe CREATE DATABASE
CREATE DATABASE [IF NOT EXISTS] nome_bd
CREATE DATABASE cria um banco de dados com o nome dados.
As regras para os nomes de banco de daddos permitidos so daods em Seco 6.1.2, Nomes de
Banco de dados, Tabela, ndice, Coluna e Alias. Um erro ocorre se o banco de dados j existir e
voc no especificou IF NOT EXISTS.
Banco de dados no MySQL so implementados como diretrios contendo arquivos que correspon-
dem a tabelas no banco de dados. Por no haver tabelas em um banco de dados quando ele criado,
a instruo CREATE DATABASE apenas cria um diretrio sob o diretrio de dados do MySQL.
Voc tambm pode criar banco de dados com mysqladmin. See Seco 4.9, Utilitrios e Scripts
do Lado do Cliente MySQL.
6.5.2. Sintaxe DROP DATABASE
DROP DATABASE [IF EXISTS] nome_bd
DROP DATABASE deleta todos as tabelas no banco de dados e deleta o banco de dados. Se voc fi-
zer um DROP DATABASE em um banco de dados ligado simbolicamente, o link e o banco de dados
original so deletados. Tenha cuidado com este comando!
DROP DATABASE retorna o nmero de arquivos que foram removidos do diretorio de banco de da-
dos. Para tabelas MyISAM, isto trs vezes o nmero de tabelas, pois cada tabela corresponde a um
arquivo .MYD, um arquivo .MYI e um arquivo .frm.
O comando DROP DATABASE remove do diretrio de banco de dados dado todos os arquivos com
a seguinte extenso:
Ext Ext Ext Ext
.BAK .DAT .HSH .ISD
.ISM .ISM .MRG .MYD
.MYI .db .frm
Todos os subdiretrios que consistem de 2 digitos (diretrios RAID) tambm so removidos.
No MySQL Verso 3.22 ou posterior, voc pode utilizar a palavra chave IF EXISTS para prevenir
da ocorrncia de um erro se o banco de dados no existir.
Referncia de Linguagem do MySQL
558
Voc tambm pode deletar um banco de dados com mysqladmin. See Seco 4.9, Utilitrios e
Scripts do Lado do Cliente MySQL.
6.5.3. Sintaxe CREATE TABLE
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nome_tabela [(definio_create,...)]
[table_options] [select_statement]
ou
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nome_tabela [(]LIKE nome_antigo_tabela[)];
definio_create:
nome_coluna tipo [NOT NULL | NULL] [DEFAULT valor_padro] [AUTO_INCREMENT]
[[PRIMARY] KEY] [COMMENT 'string'] [definio_referncia]
| [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
| KEY [nome_indice] (index_nome_coluna,...)
| INDEX [nome_indice] (index_nome_coluna,...)
| [CONSTRAINT [symbol]] UNIQUE [INDEX] [index_name] (index_col_name,...)
| FULLTEXT [INDEX] [nome_indice] (index_nome_coluna,...)
| [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)
[definio_referncia]
| CHECK (expr)
tipo:
TINYINT[(tamanho)] [UNSIGNED] [ZEROFILL]
| SMALLINT[(tamanho)] [UNSIGNED] [ZEROFILL]
| MEDIUMINT[(tamanho)] [UNSIGNED] [ZEROFILL]
| INT[(tamanho)] [UNSIGNED] [ZEROFILL]
| INTEGER[(tamanho)] [UNSIGNED] [ZEROFILL]
| BIGINT[(tamanho)] [UNSIGNED] [ZEROFILL]
| REAL[(tamanho,decimais)] [UNSIGNED] [ZEROFILL]
| DOUBLE[(tamanho,decimais)] [UNSIGNED] [ZEROFILL]
| FLOAT[(tamanho,decimais)] [UNSIGNED] [ZEROFILL]
| DECIMAL(tamanho,decimais) [UNSIGNED] [ZEROFILL]
| NUMERIC(tamanho,decimais) [UNSIGNED] [ZEROFILL]
| CHAR(tamanho) [BINARY | ASCII | UNICODE]
| VARCHAR(tamanho) [BINARY]
| DATE
| TIME
| TIMESTAMP
| DATETIME
| TINYBLOB
| BLOB
| MEDIUMBLOB
| LONGBLOB
| TINYTEXT
| TEXT
| MEDIUMTEXT
| LONGTEXT
| ENUM(value1,value2,value3,...)
| SET(value1,value2,value3,...)
index_nome_coluna:
nome_coluna [(tamanho)] [ASC | DESC]
definio_referncia:
REFERENCES nome_tabela [(index_nome_coluna,...)]
[MATCH FULL | MATCH PARTIAL]
[ON DELETE opo_referncia]
[ON UPDATE opo_referncia]
opo_referncia:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
opes_tabela: table_option [table_option] ...
opes_tabela:
TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM }
| AUTO_INCREMENT = #
| AVG_ROW_LENGTH = #
| CHECKSUM = {0 | 1}
| COMMENT = 'string'
| MAX_ROWS = #
| MIN_ROWS = #
| PACK_KEYS = {0 | 1 | DEFAULT}
| PASSWORD = 'string'
Referncia de Linguagem do MySQL
559
| 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 ocor-
re 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 no-
me_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 de-
letada 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 po-
dem 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 re-
sultar 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;
Referncia de Linguagem do MySQL
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 Arquivo de formato (definio) da tabela.
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 Cam-
pos:
Se nem NULL nem NOT NULL for especificado, a coluna tratada como se NULL fosse especi-
ficado.
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 co-
mea 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 op-
o do servidor --sql-mode ou a varivel do servidor sql_mode permite que voc aramze-
ne 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 WHE-
RE) 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 funci-
onar corretamente apenas se conter apenas valores positivos. Inserir um nmero negativo con-
siderado como a insero de um nmero positivo muito grande. Isto ocorre para evitar proble-
maa 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 AU-
TO_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 colu-
nas. Voc no pode armazenar um NULL literal em uma coluna TIMESTAMP; definindo a colu-
na com NULL lhe atribui a a data e a hora atual. Como colunas TIMESTAMP se comportam des-
ta 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 servi-
dor relata que tal coluna pode ter o valor NULL atribudo (a que verdade), mesmo que TIMES-
Referncia de Linguagem do MySQL
561
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, por-
que 0 um valor TIMESTAMP vlido.
Um valor padro (DEFAULT) tem que ser constante, ele no pode ser uma funo ou uma ex-
presso.
Se nenhum valor DEFAULT especificado para uma coluna, o MySQL atribuir um automatica-
mente, 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 numricos no declarados com o atributo AUTO_INCREMENT, o padro 0. Para
uma coluna AUTO_INCREMENT, o valor padro o prximo valor na sequncia.
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 Sec-
o 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 PRI-
MARY KEY tambm pode ser especificado apenas como KEY. Isto foi implementado para com-
patibilidade com outros bancos de dados.
No MySQL,uam chave UNIQUE s pode ter valores distintos. Um erro ocorre se voc tantar adi-
cionar 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 co-
mo 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 per-
guntar 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. Fa-
zendo 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 mlti-
plos 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
Referncia de Linguagem do MySQL
562
da prmeira index_nome_coluna, com um sufixo opicional (_2, _3, ...) para torn-lo ni-
co. 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, Tabe-
las, 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.
Com a sintaxe nome_coluna(length) em uma especificao de ndice, voc pode criar um
ndice que utiliza apenas os primeiros length() bytes de uma coluna CHAR ou VARCHAR. Is-
to pode tornar o arquivo de ndices muito menor. See Seco 5.4.4, ndices de Colunas.
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 DE-
VE 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 ar-
dena 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 FULL-
TEXT. 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 Full-
text no MySQL para detalhes de operao.
No MySQL Verso 3.23.44 ou posterior, tabelas InnoDB suportam verificao de chaves es-
trangeiras. 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 nomea-
das 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 pa-
ra a sintaxe precisa. See Seco 7.5.5.2, Restries FOREIGN KEY. Para outros tipos de tabe-
las, 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 tabe-
las 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.
A opao opo_tabela e SELECT s so implmentadas no MySQL Verso 3.23 e acima.
Referncia de Linguagem do MySQL
563
A opo TYPE para especificar o tipo de tabela possui os seguintes valores:
Tipo de tabela Descrio
BDB ou Berke-
leyDB
Tabelas de transao segura com bloqueio de pgina. See Seco 7.6,
Tabelas BDB ou BerkeleyDB.
HEAP Os dados desta tabela so armazenados apenas na memria. See Sec-
o 7.4, Tabelas HEAP.
ISAM O mecanismo de armazenamento original. See Seco 7.3, Tabelas
ISAM.
InnoDB Tabelas com transaes eguras com bloqueio de linha. See Sec-
o 7.5, Tabelas InnoDB.
MERGE Uma coleo de tabelas MyISAM usadas como uma tabela. See Sec-
o 7.2, Tabelas MERGE.
MRG_MyISAM Um apelido para tabelas MERGE
MyISAM O novo mecanismo de armazenamento portvel binrio que substitui
o ISAM. See Seco 7.1, Tabelas MyISAM.
See Captulo 7, Tipos de Tabela do MySQL.
Se um tipo de tabela especificado, e este tipo no est disponvel, MySQL ir usar MyISAM.
Por exemplo, se uma definio de tabela inclui a opo TYPE=BDB mas o MySQL no suporta
tabelas BDB, a tabela ser criada como uma tabela MyISAM. Isto torna possvel de se ter uma
configurao de replicao onde voc tem tabelas transacionaisno master mas as tabelas criadas
no slave so no transacionais (para obter mais velocidade). No MySQL 4.1.1 voc obtm um
aviso se o tipo de tabela especificado no aceito.
Os outros tipos de tabelas so utilizados para otimizar o comportamento da tabela. Na maioria
dos casos, voc no precisa especificar nenhuma delas. As opes funcionam com todos os ti-
pos, a menos que haja indicao:
Opo Descrio
AUTO_INCREMENT O prximo valor AUTO_INCREMENT que voc quer definir em sua
tabela (apenas MyISAM; para definir o primeiro valor auto incremen-
teem uma tabela InnoDB insira uma linha com um valor de menos
um e delete esta linha).
AVG_ROW_LENGTH Uma aproximao do tamanho mdio de linha em sua tabela. Voc
s precisa defin-la para tabelas grnades com tamanho de registros
variveis.
CHECKSUM Defina com 1 se voc quiser manter um checksum para todas as li-
nha (deixa a tabela um pouco mais lenta para atualizaes, mas fica
mais fcil encontrar tabelas corrompidas) (apenas MyISAM).
COMMENT Um comentrio de 60 caracteres para a sua tabela.
MAX_ROWS Nmero mximo de linhas que voc deseja armazenar na tabela.
MIN_ROWS Nmero mnimo de linha que voc planeja armazenar na tabela.
PACK_KEYS Defina com 1 se voc quiser um ndice menor, Normalmente torna a
atualizao mais lenta e a leitura mais rpida (apenas MyISAM e
ISAM). Definr com 0 ir desabilitar empacotamento das chaves. De-
finir com DEFAULT (MySQL 4.0) dir ao mecanismo de armazena-
mento para empacotar apenas colunas CHAR/VARCHAR longas.
PASSWORD Criptografa o arquivo .frm com uma senha. Esta opo no fa nada
na verso padro do MySQL.
DE-
LAY_KEY_WRITE
Defina com 1 se quiser atrasar a atualizao das chaves da tabela at
que a tabela seja fechada (apenas MyISAM).
ROW_FORMAT Define como as linhas devem ser armazenadas. Atualmente esta op-
Referncia de Linguagem do MySQL
564
o s funciona com tabelas MyISAM, as quais suportam os formatos
de linha DYNAMIC e FIXED. See Seco 7.1.2, Formatos de Tabe-
las MyISAM.
Quando voc utiliza uma tabela MyISAM, MySQL usa o produto de MAX_ROWS *
AVG_ROW_LENGTH para decidir o tamanho da tabela resultante. Se voc no especificar qual-
quer uma das opes acima, o tamanho mximo de uma tabela ser 4G (ou 2G se o seu sistema
operacional s suporta tabelas de 2G). A razo para isto apenas manter o tamanho dos pontei-
ros baixo para tornar o ndice menor e mais rpido se voc realmente no precisa de tabelas
grandes.
Se voc no utilizar PACK_KEYS, o padro s empacotar strings, no nmeros. Se voc utili-
zar PACK_KEYS=1, nmeros tambm sero empacotados.
Ao empacotar chaves numricas binrias, o MySQL usar a compactao prefixada. Isto signifi-
ca que voc s ter grandes benefcios disto se voc tiver muitos nmeros iguais. Compactao
prefixada significa que toda a chave precisa de um byte extra para indicar quantos bytes das ca-
ves anteriores so o mesmo da prxima chave (note que o ponteiro para a linha armazenado na
ordem do byte mais alto em primeiro diretamente depois da chave, para aumentar compactao).
Isto significa que se voc tiver muitas chaves iguais em duas linhas consecutivas, todas os cha-
ves ``iguais'' seguintes iro normalmente ter apenas 2 bytes (incluindo o ponteiro para a linha).
Compare isto isto ao caso comum onde as chaves seguintes iro levar tama-
nho_armazenamento_chave + tamanho_ponteiro (nomralmente 4). Por outro lado, se todas as
chaves so totalmente diferente, voc usar 1 byte por chave, se a chave no puder ter valores
NULL. (Neste caso o tamanho da chave empacotada ser armazenado no mesmo byte que usa-
do para marcar se a chave NULL.)
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 ndi-
ces em uma tabela criada, voc deve especific-lo antes da instruo SELECT:
Referncia de Linguagem do MySQL
565
mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
Se ocorrer qualquer erro durante enquanto os dados so copiados para a tabela, ele ser automa-
ticamente deletado.
Voc pode preceder o SELECT por IGNORE ou REPLACE para indicar como tratar registros
que duplicam valores de chave nica. Com IGNORE, novos registros que duplicam um registro
existente em um valor de chave nica so descartados. Com REPLACE, novos registros substitu-
em registros que tem o mesmo valor de chave nica. Se nem IGNORE nem REPLACE so espe-
cificados, valir de chave unica duplicados resultam em erro.
Para assegurar que o log binrio/atualizao pode ser usado para recriar a tabela original,
MySQL no permitir inseres concorrentes durante um CREATE TABLE ... SELECT.
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 gran-
des. 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 subdiretri-
os RAID_CHUNKS chamados 00, 01, 02 no diretrio de banco de dados. Em cada um destes di-
retrios 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 ar-
quivo 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 IN-
SERT_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 cha-
ve utilizar e tambm a detectaa mais rapidamente chaves nicas (UNIQUE) duplicadas.
Utilizando DATA DIRECTORY='directorio' ou INDEX DIREC-
TORY='directorio' voc pode especificar onde o mecanismo de armazenamento deve co-
locar 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.
6.5.3.1. Alterao de Especificaes de Colunas
Em alguns casos, MySQL altera sem aviso uma especificao de coluna dada em uma instruo
CREATE TABLE. (Isto tambm pode ocorrer com ALTER TABLE.):
Referncia de Linguagem do MySQL
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 vari-
vel (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 ti-
pos 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 myi-
sampack. See Seco 7.1.2.3, Caractersticas de Tabelas Compactadas.
6.5.4. Sintaxe ALTER TABLE
ALTER [IGNORE] TABLE nome_tbl especificao_alter [, especificao_alter ...]
especificao_alter:
ADD [COLUMN] definio_create [FIRST | AFTER nome_coluna ]
| ADD [COLUMN] (definio_create, definio_create,...)
| ADD INDEX [nome_indice] (index_nome_col,...)
| ADD [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
| ADD [CONSTRAINT [symbol]] UNIQUE [index_name] (index_col_name,...)
| ADD FULLTEXT [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)
[definio_referncia]
| ALTER [COLUMN] nome_col {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] nome_col_antigo definio_create
[FIRST | AFTER nome_coluna]
| MODIFY [COLUMN] definio_create [FIRST | AFTER nome_coluna]
| DROP [COLUMN] nome_col
| DROP PRIMARY KEY
| DROP INDEX nome_indice
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] nome_nova_tbl
| ORDER BY col
| CHARACTER SET character_set_name [COLLATE collation_name]
| table_options
ALTER TABLE lhe permite alterar a estrutura da tabela existente. Por exemplo, voc pode adicio-
nar ou deletar colunas, criar ou remover ndices, alterar o tipo de coluna existentes, ou renomear co-
luna ou tabelas. Voc tambm pode alterar o comentrio para a tabela e tipo de tabela. See Sec-
o 6.5.3, Sintaxe CREATE TABLE.
Referncia de Linguagem do MySQL
567
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 usa-
r 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 ne-
nhuma 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 ta-
belas 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 myi-
sam_sort_buffer_size.
Para utilizar ALTER TABLE, voc precisa dos privilgios ALTER, INSERT e CREATE na tabe-
la.
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.
CHANGE col_name, DROP col_name, e DROP INDEX so extenses do MySQL ao SQL-
92.
MODIFY uma extenso do Oracle para 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 defi-
nies_create. Para tal, especifique o nome das colunas antiga e da nome e o tipo que a co-
luna 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:
Referncia de Linguagem do MySQL
568
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
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 caracte-
res 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 no-
me_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 pala-
vras-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 Sec-
o 6.5.8, Sintaxe DROP INDEX.
Se colunas forem removidas de uma tabela, as colunas tambm so removidas de qualquer ndi-
ce 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 preten-
de 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 an-
tes 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 esco-
lheu. Esta opo til principalmente quando voc sabe qeu na maioria das vezes voc ir inse-
rir os registros em certa ordem; utilizando esta opo depois de grandes mudanas na tabela, vo-
c 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 MyI-
SAM. ALTER TABLE ... ENABLE KEYS deve ser usado para recriar ndices perdidos. Co-
mo 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 inser-
es 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.
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 PASS-
WORD():
mysql> UPDATE user SET password=PASSWORD('your password')
-> WHERE user='XXX';
A.2.15. Erro: Table 'xxx' doesn't exist
Se voc obter o erro Table 'xxx' doesn't exist ou Can't find file: 'xxx'
(errno: 2), significa que no existem tabelas no banco de dados atual com o nome xxx.
Note que como o MySQL utiliza diretrios e arquivos para armazenar banco de dados e tabelas, o
nome de banco de dados e tabelas so caso-sensitive! (No Windows o nome de banco de dados e ta-
belas no so caso-sensitivo mas todas as referncias a uma dada tabela dentro de uma consulta de-
vem utilizar o mesmo caso!)
Voc pode verificar quais tabelas existem no banco de dados atual com SHOW TABLES. See Sec-
o 4.6.8, Sintaxe de SHOW.
A.2.16. Erro: Can't initialize character set
xxx
Se voc obtr um erro do tipo:
MySQL Connection Failed: Can't initialize character set xxx
significa que um dos seguintes problemas:
O conjunto de caracter multi-byte e voc no tem suporte para o conjunto de caracteres no cli-
ente.
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 .
Problemas e Erros Comuns
844
Todos os bionrios MySQL padres so compilados com -
-with-extra-character-sets=complex que habilita o suporte para todos os conjun-
tos de caracteres multi-byte. See Seco 4.7.1, O Conjunto de Caracteres Utilizado para Dados
e Ordenao.
O conjunto de caracteres simples e no foi compilado no mysqld e os arquivos de definio
do conjunto de caracteres no esto localizados onde o cliente esperava encontr-los.
Neste caso voc precisa:
Recompilar o cliente com suporte ao conjunto de caracteres. See Seco 2.3.3, Opes tpi-
cas 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 este-
jam.
A.2.17. Arquivo No Encontrado
Se voc obter ERROR '...' not found (errno: 23), Can't open file: ...
(errno: 24), ou qualquer outro erro com errno 23 ou errno 24 no MySQL, significa que
voc no alocou descritores de arquivo suficiente para o MySQL. Voc pode usar o utilitrio per-
ror para obter uma descrio sobre o que o nmero de erro significa:
shell> perror 23
File table overflow
shell> perror 24
Too many open files
shell> perror 11
Resource temporarily unavailable
O problema aqui que mysqld est tentando manter aberto muitos arquivos simultanemanete. Vo-
c pode tambm dizer para o mysqld no abrir muitos arquivos de uma vez ou aumentar o nmero
de descritores de arquivos disponveis para o mysqld.
Para dizer para o mysqld manter aberto poucos arquivos por vez, voc pode tornar a cache de tabe-
la menor usando a opo -O table_cache=32 para mysqld_safe (o valor padro 64). Re-
duzindo o valor de max_connections tambm reduzir o nmero de arquivos abertos (o valor
padro 90).
Para alterar o nmero de descritores de arquivos disponveis para mysqld, voc pode usar a opo
--open-files-limit=# para mysqld_safe ou -O open-files-limit=# para
mysqld. See Seco 4.6.8.4, SHOW VARIABLES. O modo mais fcil de fazer isto adicioar a
opo ao seu arquivo de opo. See Seco 4.1.2, Arquivo de Opes my.cnf. Se voc tiver um
verso antiga do mysqld que no suporte isto, voc pode editar o script mysqld_safe. Existe
uma linha ulimit -n 256 comentada no script. Voc pode remover o caracter '#' para
``descomentar'' esta linha, e altere o nmero 256 para afetar o nmero de descritores de arquivos dis-
ponveis para mysqld.
ulimit (e open-files-limit) podem aumentar o nmero de descritorese de arquivo, mas
apenas at o limite imposto pelo sistema operacional. Tambm h um limite 'maior' que s pode ser
sobrescrito se voc iniciar o mysqld_safe ou mysqld como root (apenas se lembre que voc
tambm precisa usar a opo --user=... neste caso). Se voc precisa aumentar o limite do SO
no nmero dos descritores de arquivo disponveis para cada processo, cosulte a documentaco para
ser sistema operacional.
Note que se voc rodar o shell tcsh, ulimit no funcioar! tcsh tambm relatar o valor incor-
Problemas e Erros Comuns
845
reto quando voc pergunta pelo limite atual! Neste caso voc deve iniciar mysqld_safe com sh!
A.3. Assuntos Relacionados a Instalao
A.3.1. Problemas de Ligao com a Biblioteca do Cli-
ente MySQL
Se voc estiver ligando o seu programa e obter o erro de smbolos sem referncia que iniciam com
mysql_, como os seguintes:
/tmp/ccFKsdPa.o: In function `main':
/tmp/ccFKsdPa.o(.text+0xb): undefined reference to `mysql_init'
/tmp/ccFKsdPa.o(.text+0x31): undefined reference to `mysql_real_connect'
/tmp/ccFKsdPa.o(.text+0x57): undefined reference to `mysql_real_connect'
/tmp/ccFKsdPa.o(.text+0x69): undefined reference to `mysql_error'
/tmp/ccFKsdPa.o(.text+0x9a): undefined reference to `mysql_close'
voc deve estar apto a resolv-los adicionando -Lpath-to-the-mysql-library -
lmysqlclient no final da sua linha de ligao.
Se voc obter erros de undefined reference (referncia indefinida) para as fun-
es 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 compil-
la 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 usan-
do um dos seguintes mtodos:
Adicione o caminho ao diretrio onde est o libmysqlclient.so varivel de ambiente
LD_LIBRARY_PATH.
Adicione o caminho ao diretrio onde est o libmysqlclient.so varivel de ambiente
LD_LIBRARY.
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 re-
movendo as bibliotecas dinmicas do MySQL antes de ligar o seu cdigo. Na prxima vez voc de-
ve estar certo que nenhum outro programa esta usando bibliotecas dinmicas!
A.3.2. Como Executar o MySQL Como Um Usurio
Problemas e Erros Comuns
846
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. Pare o servidor se ele estiver em execuo (use mysqladmin shutdown).
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 siste-
ma, adicione um linha user que especifica o nome do usurio ao grupo [mysqld] do arqui-
vo de opes /etc/my.cnf ou o arquivo de opes my.cnf no diretrio de dados do servi-
dor. Por exemplo:
[mysqld]
user=nome_usuario
Neste ponto, seu processo mysqld deve estar executando bem e redondo como usurio no-
me_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 loga-
do como outro usurio Unix deiferente de root; apenas especifique a opo -u root ao progra-
ma 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.
A.3.3. Problemas com Permisses de Arquivos
Se voc tiver problemas com permisses de arquivo, por exemplo, se o mysql enviar a seguinte
mensagem de erro quando voc criar uma tabela:
ERROR: Can't find file: 'path/with/filename.frm' (Errcode: 13)
ento a varivel de ambiente UMASK pode estar configurada incorretamente quando o mysqld ini-
cia. O valor umask padro 0660. Voc pode alterar este comportamento iniciando o
mysqld_safe como a seguir:
Problemas e Erros Comuns
847
shell> UMASK=384 # = 600 em octal
shell> export UMASK
shell> /path/to/mysqld_safe &
Por padro o MySQL criar o banco de dados e diretrios RAID com permisso tipo 0700. Voc po-
de modificar este comportamento configurando a varivel UMASK_DIR. Se voc definir isto, novos
diretrios so criados com a combinao de UMASK e UMASK_DIR. Por exemplo, se voc quiser ao
grupo a todos os novos diretrios, voc pode fazer:
shell> UMASK_DIR=504 # = 770 em octal
shell> export UMASK_DIR
shell> /path/to/mysqld_safe &
No MySQL Verso 3.23.25 e acima, o MySQL assume que o valor para UMASK e UMASK_DIR est
em octal se ele iniciar com um zero.
See Apndice F, Variveis de Ambientes do MySQL.
A.4. Assuntos Relacionados a Administrao
A.4.1. O Que Fazer Se o MySQL Continua Falhando
Todas as verses do MySQL so testadas em muitas plataformas antes de serem distribudas. Isto
no significa que no existe nenhum erro no MySQL, mas significa que se houver erros, eles so
poucos e podem ser difceis de encontrar. Se voc tiver u problema, sempre ajudar se voc tentar
encontrar exatamente o que falhou em seu sistema e assim voc ter uma chance muito maior de t-
lo corrigido rapidamente.
Primeiro, voc deve tentar descobrir o problema que o daemon do mysqld morre ou se o seu pro-
blema relativo ao seu cliente. Voc pode verificar o quanto tempo o seu servidor mysqld est em
execuo utilizando o mysqladmin version. Se o mysqld morrer, voc pode encontrar a cau-
sa disto no arquivo mysql-data-directory/`nome_maquina`.err. See Seco 4.10.1,
O Log de Erros.
Em alguns sistemas voc pode encontrar neste arquivo um stack trace de onde o mysqld finalizou
e assim voc pode resolver com resolve_back_stack. See Seco E.1.4, Usando Stack Tra-
ce. Note qte os valores da varivel escrita no arquivo .err no podem sempre estar 100% corre-
tas.
Muitas falhas do MySQL so causadas por arquivos de ndices/dados corrompidos. O MySQL atua-
lizar os dados em disco, com a chamada de sistema write(), depois de todas as intrues SQL e
antes do ser notificado sobre o resultado. (Isto no verdade se voc estiver executando com de-
lay_key_write, caso no qual apenas o dado escrito.) Insto significa que o dado salvo mesmo
se o mysqld falhar, j que o SO se certificar de que o dado no descarregado esta escrito em dis-
co. Voc pode forar o MySQL a sincronizar tudo para o disco depois de todo comando SQL inican-
do o mysqld com --flush.
O exposto acimo significa que normalmente voc no deve ter tabelas corrompidas a menos que:
Algum/algo finalize o mysqld ou a mquina no meio de uma atualizao.
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 ta-
bela 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
Problemas e Erros Comuns
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 poss-
vel. Neste caso voc ode tentar alterar o tipo de arquivo para outro mecanismo de armazenamen-
to 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 pa-
ra 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 espe-
cfica 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 Sec-
o 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 dire-
trio bench na distribuio fonte ou, em uma distribuio binria, no diretrio sql-bench
sob o diretrio de instalao do seu MySQL.
Experimente fork_test.pl e fork2_test.pl.
Se voc configurar o MySQL para depurao, ser muito mais fcil para obter informaes so-
bre 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 Sec-
o 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.
Voc aplicou todas as ltimas correes para o seu sistema operacional?
Use a opo --skip-external-locking com o mysqld. Em alguns sistemas, o gerenci-
ador de bloqueios lockd no funciona de forma apropriada; a opo -
-skip-external-locking faz com que mysqld no utilize bloqueio externo. (Isto signi-
fica 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 ro-
dando 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 al-
gum problema interno de bloqueio. mysqladmin processlist normalmente estar apto a
fazer uma conexo mesmo nestes casos e pode fornecer informao til sobre o nmero cone-
xes atuais e os seus estados.
Execute o comando mysqladmin -i 5 status ou mysqladmin -i 5 -r status
ou em uma janela separada para produzir estatsticas enquanto voc executa outras consultas.
Problemas e Erros Comuns
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. Execute o seu script de testes.
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 fa-
lhas resultem de algo que exista apenas em seu computador (por exemplo, um erro que relacio-
nado a suas bibliotecas de sistemas em particular).
Se voc tiver um problema em tabelas com registros do tamanho dinmico e voc no est usan-
do colunas BLOB/TEXT (mas apenas colunas VARCHAR, voc pode tentar alterar todas as colu-
nas 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 tole-
rante a corrompimento.
O cdigo de registro dinmico atual foi usado pela MySQL AB por pelo menos 3 anos em qual-
quer 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.
A.4.2. Como Recuperar uma Senha de Root Esquecida
Se voc nunca definiu um senha de root para o MySQL, ento o servidor no ir exigir uma senha
para a conexo como root. recomendado que sempre seja definida uma senha para cada usurio.
See Seco 4.3.2, Como Tornar o MySQL Seguro contra Crackers.
Se voc tiver definido um senha de root, mas a esqueceu, voc pode definir uma nova senha com
o seguinte procedimento:
1. 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 execu-
tando para fazer isto.
2. Reinicie o mysqld com a opo --skip-grant-tables.
3. Defina uma nova senha com o comando mysqladmin password:
shell> mysqladmin -u root password 'mynewpassword'
Problemas e Erros Comuns
850
4. Agora voc tambm pode parar o mysqld e reinici-lo normalmente, ou apenas carregue a ta-
bela 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. Finalize e reinicie o mysqld com a opo --skip-grant-tables com descrito acima.
2. Conecte ao servidor mysqld com:
shell> mysql -u root mysql
3. Dispare os seguintes comandos no cliente mysql:
mysql> UPDATE user SET Password=PASSWORD('minhanovasenha')
-> WHERE User='root';
mysql> FLUSH PRIVILEGES;
4. Depois disto, voc deve estar apto a conectar usando a nova senha.
5. Voc agora pode parar o mysqld e reinici-lo normalmente.
A.4.3. Como o MySQL Trata de Discos Sem Espao
Quando o ocorre uma condio de disco sem espao, o MySQL faz seguinte:
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 aliviar o problema, voc pode realizar as seguintes aes:
Para continuar, voc s tem que liberar espao suficiente em disco para inserir todos os regis-
tros.
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 ndi-
ces so criados em um grupo antes de um LOAD DATA INFILE ou depois de uma instruo AL-
TER TABLE.
Todos os comandos acima podem usar arquivos temporrios grandes que por si prprios poderiam
Problemas e Erros Comuns
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).
A.4.4. Onde o MySQL Armazena Arquivos Temporri-
os
O MySQL usa o valor da varivel de ambiente TMPDIR como caminho para o diretria que aramze-
na os arquivos temporrios. Se voc no tiver definido TMPDIR, o MySQL usa o padro do sistema,
que normalmente /tmp ou /usr/tmp. Se o sistema de arquivo contendo o seu diretrio de ar-
quivo temporrio muito pequeno, voc deve editar o mysqld_safe para configurar TMPDIR pa-
ra apontar para um diretrio onde voc tenha espao suficiente! Voc tambm pode definir o diret-
rio temporrio usando a opo --tmpdir com mysqld.
O MySQL cria todos os arquivos temporrios como arquivos ocultos. Isto assegura que os arquivos
temporrios sero removidos se o mysqld for terminado. A desvantagem de usar arquivos ocultos
que voc no ver um arquivo temporrio grande que enche o sistema de arquivos no qual o dire-
trio de arquivos temporrios est localizado.
Ao ordenar (ORDER BY ou GROUP BY), o MySQL normalmente usa um ou dois arquivos tempo-
rrios. O espao em disco mximo que voc precisa :
(tamanho do que ordenado + sizeof(apontador do banco de dados))
* nmeros de linhas encontradas
* 2
sizeof(apontados do banco de dados) normalmene 4, mas pode crescer no futuro
para tabelas realmente grandes.
Para algumas consultas SELECT, o MySQL tambm cria tabelas SQL temporrias. Elas no so
ocultas e tm nomes da forma SQL_*.
ALTER TABLE cria uam tabela temporria no mesmo diretrio da tabela original.
Se voc est usando o MySQL 4.1 ou posterior voc pode espalhar a carga entre vrios discos fsi-
cos definindo --tmpdir com uma lista de caminhos separados por dois pontos : (ponto e vrgula
; no Windows). Eles sero feitos atravs de escalonamento round-robin. Nota: Estes caminhos de-
vem ser de diferentes discos fsicos, e no parties diferentes do mesmo disco.
A.4.5. Como Proteger ou AlterarHow to Protect or
Change the MySQL Socket File /tmp/mysql.sock
Se voc tiver problemas com o fato que de que qualquer um pode deletar o socket de comunicao /
tmp/mysql.sock do MySQL, voc pode, na maioria das verses Unix, protejer o seu sistema de
arquivos /tmp definindo o bit sticky. Conecte como root e faa o seguinte:
shell> chmod +t /tmp
Isto protejer o seu sistema de arquivos /tmp para que os arquivos s possam ser deletados pelo
seus donos ou pelo superusurio (root).
Voc pode verificar se o bit sticky est setado executando ls -ld /tmp. Se o ltimo bit de
permisso t, o bit est configurado
Voc pode alterar o local onde o MySQL usa/coloca o arquivo de socket da seguinte maneira:
Especifique o caminho em uma arquivo de opo local ou global. Por exemplo, coloque em /
etc/my.cnf:
Problemas e Erros Comuns
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.
Especifique o caminho para o socket na varivel de ambiente MYSQL_UNIX_PORT.
Definindo o caminho com a opo -
-with-unix-socket-path=path-for-socket-file do configure. See Sec-
o 2.3.3, Opes tpicas do configure .
Voc pode testar se o socket funciona com o seguinte comando:
shell> mysqladmin --socket=/path/to/socket version
A.4.6. Problemas Com Fuso Horrio
Se voc tiver problema com SELECT NOW() retornando valores em GMT e no em sua hora local,
voc ter que definir a varivel de ambinte TZ com a seu fuso horrio atual. Isto deve ser feito no
ambiente no qual o servidor executado, por exemplo, em mysqld_safe ou mysql.server.
See Apndice F, Variveis de Ambientes do MySQL.
A.5. Assuntos Relacionados a Consultas
A.5.1. Caso-Sensitivito em Pesquisas
Por padro, as pesquisas no MySQL so caso-insensitivo (a menos que haja algum conjunto de ca-
racter que nunca seja caso-insensitivo, com czech). Isto significa que se voc buscar com no-
me_coluna LIKE 'a%', voc obter todos os valores de colunas que iniciam com A ou a. Se
voc quiser fazer esta busca caso-sensitivo, use algo como INSTR(nome_coluna, "A")=1 pa-
ra verificar o prefixo. Ou use STRCMP(nome_coluna, "A") = 0 se o valor da coluna deve se
exatamente "A".
Operaes de comparaes simples (>=, >, = , < , <=, ordenando e agrupando) so basedos
em cada ``valor de ordenao'' do caracter. Caracteres com o mesmo valor de ordenao (como 'E',
'e' e '') so tratados como o mesmo caracter!
Em verses antigas do MySQL, comparaes com LIKE eram feitas com o valor de letra maiscula
de cada caracter (E == e mas E <> ). Nas verses mais novas, LIKE funciona assim como os ou-
tros operadores de comparao.
Se voc quiser que uma coluna sempre seja tratada de modo caso-sensitivo, declare a como BI-
NARY. See Seco 6.5.3, Sintaxe CREATE TABLE.
Se voc est usando caracteres Chineses na codificao big5, voc pode tornar todas as colunas de
caracteres BINARY. Isto funciona porque a ordenao de caracteres de codificao big5 baseada
na ordem do cdigo ASCII.
A.5.2. Problemas Usando Colunas DATE
O formato de um valor DATE 'YYYY-MM-DD'. De acordo com o padro SQL, nenhum outro for-
mato permitido. Voc deve usar este formato em expresses UPDATE e na clusula WHERE de
Problemas e Erros Comuns
853
insrtrues SELECT. Por exemplo:
mysql> SELECT * FROM nome_tabela WHERE date >= '1997-05-05';
Por convenincia, o MySQL converte automaticamente uma data em um nmero se a data usada
em um contexto numrico (e vice versa). Ele tambm esperto o bastante para permitir uma forma
de string ``relaxada'' em uma atualizao e em uma clusula WHERE que compara uma data a uma
coluna TIMESTAMP, DATE, ou DATETIME. (Forma relaxada significa que qualquer caracter de
pontuao pode seu usado como separador entre as partes. Por exemplo, '1998-08-15' e
'1998#08#15' so equivalentes). O MySQL tambm pode converter uma string sem separadores
(como '19980815'), desde que ela faa sentido como uma data.
A data especial '0000-00-00' pode ser armazenada e recuperada como '0000-00-00'. Ao
usar uma data '0000-00-00' com o MyODBC, ele a converter automaticamente em NULL em
sua verso 2.50.12 e acima, porqie o ODBC no pode tratar este tipo de data.
Como o MySQL realiza a converso descrita acima, a seguinte instruo funcionar:
mysql> INSERT INTO nome_tabela (idate) VALUES (19970505);
mysql> INSERT INTO nome_tabela (idate) VALUES ('19970505');
mysql> INSERT INTO nome_tabela (idate) VALUES ('97-05-05');
mysql> INSERT INTO nome_tabela (idate) VALUES ('1997.05.05');
mysql> INSERT INTO nome_tabela (idate) VALUES ('1997 05 05');
mysql> INSERT INTO nome_tabela (idate) VALUES ('0000-00-00');
mysql> SELECT idate FROM nome_tabela WHERE idate >= '1997-05-05';
mysql> SELECT idate FROM nome_tabela WHERE idate >= 19970505;
mysql> SELECT MOD(idate,100) FROM nome_tabela WHERE idate >= 19970505;
mysql> SELECT idate FROM nome_tabela WHERE idate >= '19970505';
No entatnto o seguinte no funcionar:
mysql> SELECT idate FROM nome_tabela WHERE STRCMP(idate,'19970505')=0;
STRCMP() uma funo string, assim ela converte idate em uma string e realiza um comparao
de string. Ela no converte '19970505' em uma datae e realiza uma comparaas de data.
Note que o MySQL faz uma verificao muito limitada da validade da data. Se voc aramazenar
uma data incorreto, tal como '1998-2-31', a data invalida ser armazenada.
Como o MySQL empacota a data para armazenamento, ele no pode armazenar qualquer data dada
como j que ela no caberia dentro do buffer de resultado. As regras de aceitao das datas so:
Se o MySQL pode armazenar e recuperar um data dada, a data errada acieta para colunas DA-
TE 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.
A.5.3. Problemas com Valores NULL
O conceito do valor NULL uma fonte comum de confuso para os iniciantes em SQL, que frequen-
Problemas e Erros Comuns
854
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 documen-
tao 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 ex-
presso:
mysql> SELECT * FROM minha_tabala WHERE phone = NULL;
Para procurar por valores NULL, voc deve usar o teste IS NULL. A seguir mostramos como en-
contrar 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 esti-
ver usando o MySQL verso 3.23.2 ou mais novo e estiver usando tipos de tabelas NyISAM, In-
noDB 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' tam-
bm 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 arma-
zenar 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.
Problemas e Erros Comuns
855
A.5.4. Problemas com alias
Voc pode usar um alias para referir a uma coluna no GROUP BY, ORDER BY, ou na parte HA-
VING. Aliases podem ser usados para dar as colunas nomes melhores:
SELECT SQRT(a*b) as rt FROM nome_tabela GROUP BY rt HAVING rt > 0;
SELECT id,COUNT(*) AS cnt FROM nome_tabela GROUP BY id HAVING cnt > 0;
SELECT id AS "Customer identity" FROM nome_tabela;
Note que o padro SQL no permite que voc se refira a uma alias na clusula WHERE. Isto porque
quando o cdigo WHERE executado o valor da coluna ainda no pode ser determinado. Por exem-
plo, a seguinte consulta ilegal:
SELECT id,COUNT(*) AS cnt FROM nome_tabela WHERE cnt > 0 GROUP BY id;
A instruo WHERE executada para determinar quais linhas devem ser includas na parte GROUP
BY enquanto HAVING usado para decidir quais linhas o conjunto de resultados deve usar.
A.5.5. Deletando Linhas de Tabelas Relacionadas
Como o MySQL no suporta subconsultas (antes da verso 4.1), enm o uso de mais de uma tabela
na instruao DELETE (antes da verso 4.0), voc deve usar a seguinte abordagem para deletar linhas
de 2 tabelas relacionadas:
1. SELECT as linhas baseado em alguma condio WHERE na tabela principal.
2. DELETE as linhas da tabela princiapl basada nas mesmas condies.
3. DELETE FROM tabela_relacionada WHERE coluna_relacionada IN
(linhas_selecionadas).
Se o nmero total de caracteres na consulta com colunas_relacionadas maior que
1,048,576 (o valor padro de max_allowed_packet, voc deve separ-lo em duas partes meno-
res e executar mltiplas instrues DELETE. Voc provavelmente obter o DELETE mais rpido
apenas delatando 100-1000 ids de colunas_relacionadas por consulta se colu-
nas_relacionadas um ndice. Se colunas_relacionadas no um ndice, a velocidadi
independente do nmero de argumentos na clusula IN.
A.5.6. Resolvendo Problemas Com Registros No En-
contrados
If you have a complicated query that has many tables and that doesn't return any rows, you should
use the following procedure to find out what is wrong with your query:
1. Teste a consulta com EXPLAIN e verifique se voc pode encontrar alguma coisa que est erra-
da. See Seco 5.2.1, Sintaxe de EXPLAIN (Obter informaes sobre uma SELECT).
2. Selcione apenas aqueles campos que so usados na clusula WHERE.
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
Problemas e Erros Comuns
856
porque valores de ponto-flutuante no so valores exatos. Na maioria dos casos, alterar o FLO-
AT por DOUBLE corrigir isto. See Seco A.5.7, Problemas com Comparao de Ponto Flu-
tuante.
6. Se voc ainda no pode imaginar o que est errado, crie um teste mnimo que possa ser execu-
tado 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 mui-
tas) 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 Sec-
o 1.7.1.1, As Listas de Discusso do MySQL.
A.5.7. Problemas com Comparao de Ponto Flutuante
Nmeros de ponto flutuante geram confuses algumas vezes, pois estes nmeros no so armazena-
dos como valores exatos dentro da arquitetura dos computadores. O que pode ser ver na tela no o
valor exato do nmero.
Tipos de campos FLOAT, DOUBLE e DECIMAL so assim.
CREATE TABLE t1 (i INT, d1 DECIMAL(9,2), d2 DECIMAL(9,2));
INSERT INTO t1 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00),
(2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40),
(2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00),
(4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00),
(5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20),
(6, 0.00, 0.00), (6, -51.40, 0.00);
mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b
-> FROM t1 GROUP BY i HAVING a <> b;
+------+--------+-------+
| i | a | b |
+------+--------+-------+
| 1 | 21.40 | 21.40 |
| 2 | 76.80 | 76.80 |
| 3 | 7.40 | 7.40 |
| 4 | 15.40 | 15.40 |
| 5 | 7.20 | 7.20 |
| 6 | -51.40 | 0.00 |
+------+--------+-------+
O resultado est correto. Embora parea que os primeiros cinco registros no devessem passar no
teste de comparao, eles deviam porque a diferena entre o nmero mostrado est na dcima casa
decimal ou depende da arquitetura do computador.
O problema no pode ser resolvido usando ROUND() (ou funo similar), porque o resultado ainda
um nmero de ponto flutuante. Exemplo:
mysql> SELECT i, ROUND(SUM(d1), 2) AS a, ROUND(SUM(d2), 2) AS b
-> FROM t1 GROUP BY i HAVING a <> b;
+------+--------+-------+
| i | a | b |
+------+--------+-------+
| 1 | 21.40 | 21.40 |
| 2 | 76.80 | 76.80 |
| 3 | 7.40 | 7.40 |
| 4 | 15.40 | 15.40 |
| 5 | 7.20 | 7.20 |
Problemas e Erros Comuns
857
| 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 se-
guir.
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 |
Problemas e Erros Comuns
858
| 5 | 7.20 | 7.20 |
+------+-------+-------+
A.6. Assuntos Relacionados ao Otimizador
O MySQL usa um otimizador baseado no custo para descobrir o melhor modo de resolver uma con-
sulta. Em muitos casos o MySQL pode calcular a melhor consulta possvel mas em alguns casos o
MySQL no tem informao suficiente sobre os dados e precisa fazer alguns palpites sobre os da-
dos.
Esta seo do manual direcionada para os casos nos quais o MySQL no faz isto corretamente.
A ferramenta que se tem disponvel para ajudar o MySQL a fazer as coisas 'certas' so:
EXPLAIN. See Seco 5.2.1, Sintaxe de EXPLAIN (Obter informaes sobre uma SELECT).
ANALYZE TABLE. See Seco 4.6.2, Sintaxe de ANALYZE TABLE.
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 .
Configurar variveis especficas de threads. See Seco 4.6.8.4, SHOW VARIABLES.
A.6.1. Camo evitar o varredura da tabela,,,
EXPLAIN mostrar ALL na coluna type quando o MySQL usa uma busca na tabela para resolver
uma consulta. Isto acontece normalmente quando:
A tabela to pequena que mais rpido fazer uma varredura na tabela que uma busca nas cha-
ves. Isto um caso comum para tabelas com menos de 10 linhas e um tamanho de linha peque-
no.
No h nenhum restrio utilizvel na clusula ON ou WHERE para colunas indexadas.
Voc est comparando colunas indexadas com constantes e o MySQL calculou (baseado na r-
vore 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 Sec-
o 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.
Problemas e Erros Comuns
859
A.7. Assuntos Relacionados a Definies de
Tabelas
A.7.1. Problemas com ALTER TABLE.
ALTER TABLE altera uma tablea para o conjunto de caracteres atual. Se voc obter um erro de cha-
ve duplicada durante ALTER TABLE, ento a causa que o novo conjunto de caracteres mapeia du-
as chaves para o mesmo valor ou que a tabela est corrompida, caso no qual voc deve fazer um
REPAIR TABLE na tabela.
Se ALTER TABLE finalizar com um erro com este:
Error on rename of './database/name.frm' to './database/B-a.frm' (Errcode: 17)
o problema pode ser que o MySQL falhou em um ALTER TABLE anterior e existe uma tabela anti-
ga chamada A-algumacoisa ou B-algumacoisa. Neste caso, v at o diretrio de dados do
MySQL e delete todos os campos que tenham nomes iniciando com A- ou B-. (Voc pode quere
mov-los para algum lugar em vez de delet-los.)
ALTER TABLE funciona do seguinte modo:
Cria uma nova tabela chamada A-xxx com as alteraes pedidas.
Todos os registros da tabela antiga so copiadas para A-xxx.
A tabela antiga renomeada com B-xxx.
A-xxx renomeada com o nome da sua tabela antiga.
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 B-
xxx, mas uma simples renomeao no nvel do sistema deve trazer o seus dados de volta.
A.7.2. Como Alterar a Ordem das Colunas em Uma Ta-
bela
O ponto principal do MySQL abstrair a aplicao do formato de armazenamento dos dados. Voc
sempre deve especificar a ordem na qual voc deseja recuperar os dados. Por exemplo:
SELECT nome_coluna1, nome_coluna2, nome_coluna3 FROM nome_tabela;
retornar na ordem nome_coluna1, nome_coluna2, nome_coluna3, enquanto:
SELECT nome_coluna1, nome_coluna3, nome_coluna2 FROM nome_tabela;
retornar colunas na ordem nome_coluna1, nome_coluna3, nome_coluna2.
Se voc quiser alterar a ordem das colunas, voc pode fazer o seguinte:
1. Crie uma nova abela com as colunas na ordem correta.
2. Execute INSERT INTO tabela_nova SELECT campos-
na-ordem-de-tabela_nova FROM tabela_antiga.
Problemas e Erros Comuns
860
3. Delete ou renomeie tabela_antiga.
4. ALTER TABLE tabela_nova RENAME tabela_antiga.
Em uma aplicao, voc nunca deve usar SELECT * e recuperar as colunas baseado em suas posi-
es, pois a ordem e a posio nas quais as colunas so retornadas no permanecer a mesma se vo-
c adicionar/mover/deletar colunas. Uma simples alterao na estrutura de seu banco de dados cau-
saria uma falha em sua aplicao. claro que SELECT * muito mais cabvel em testes de cosul-
tas.
A.7.3. Problemas com TEMPORARY TABLE
Segue uma lista de limitaes com TEMPORARY TABLES.
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 TA-
BLE nome_orig RENAME nome_novo funciona!
Problemas e Erros Comuns
861
Apndice B. Contribuio de
Programas
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 apresenta-
da 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 con-
tribuies!
Se voc quiser construir suporte ao MySQL para interface Perl DBI/ DBD, voc deve buscar os ar-
quivos Data-Dumper, DBI e DBD-mysql e instal-los. See Seco 2.7, Comentrios de Instala-
o do Perl.
Note: Os programas listados aqui podem ser baixados e usados livremente. Os direitos autorias per-
tencem 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
http://www.mysql.com/Downloads/Contrib/KAMXbase1.2.tar.gz Converte arquivos .dbf
em tabelas do MySQL. Mdulo Perl escrito por Pratap Pereira
<pereira@ee.eng.ohio-state.edu>, expandido por Kevin A. McGrail
<kmcgrail@digital1.peregrinehw.com>. Este conversor pode tratra campos
MEMO.
http://www.mysql.com/Downloads/Contrib/HandySQL-1.1.tar.gz HandySQL uma mdulo
de acesso ao MySQL. Ele oferece uma interface C embutida em Perl e aproximadamente
20% mais rpida que o DBI regular.
OLEDB
http://www.mysql.com/Downloads/Win32/MyOLEDB3.exe Pacote de instalao MyO-
LEDB 3.0 da SWSoft.
http://www.mysql.com/Downloads/Win32/mysql-oledb-3.0.0.zip Fonte do MyOLEDB 3.0.
http://www.mysql.com/Downloads/Win32/MySamples.zip Exemplos e documentao do
MyOLEDB.
http://www.mysql.com/Downloads/Win32/MyOLEDB.chm Arquivos de ajuda do MyO-
LEDB.
http://www.mysql.com/Downloads/Win32/libmyodbc.zip Biblioteca esttica do MyODBC
usada para construir o MyOLEDB. Baseada no cdigo MyODBC.
C++
http://www.mysql.com/Downloads/Contrib/mysql-c++-0.02.tar.gz Biblioteca wrapper C++
dp MySQL. Por Roland Haenel, <rh@ginster.net>.
http://www.mysql.com/Downloads/Contrib/MyDAO.tar.gz API C++ do MySQL. Por Satish
<spitfire@pn3.vsnl.net.in>. Inspirado pela API C++ de Roland Haenel e pela bi-
862
blioteca MyC de Ed Carp.
http://www.mysql.com/products/mysql++/ API C++ do MySQL (mais que uma bibliteca
wrapper). Originalmente criado por <kevina@clark.net>. Mantido por Sinisa na
MySQL AB.
http://nelsonjr.homepage.com/NJrAPI/ Um biblioteca independente de banco de dados em
C++ que suporta MySQL.
Delphi
http://www.mysql.com/Downloads/Contrib/DelphiMySQL2.zip Interface Delphi para
libmysql.dll, por <bsilva@umesd.k12.or.us>.
http://www.mysql.com/Downloads/Contrib/Udmysql.pas Um wrapper para libmysql.dll para
uso com Delphi. Por Reiner Sombrowsky.
http://www.fichtner.net/delphi/mysql.delphi.phtml Uma interface Delphi para o MySQL,
com cdigo fonte. Por Matthias Fichtner.
http://www.productivity.org/projects/tmysql/ TmySQL, uma biblioteca para utilizar o
MySQL com Delphi.
https://sourceforge.net/projects/zeoslib/ Zeos Library um conjunto de componentes de ban-
co 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/JdmMysqlDriver-0.1.0.tar.gz Um driver da Vi-
sualWorks 3.0 Smalltalk para MySQL. Por <joshmiller@earthlink.net>.
http://www.mysql.com/Downloads/Contrib/Db.py Mdulo python com caching. Por
<gandalf@rosmail.com>.
http://www.mysql.com/Downloads/Contrib/MySQLmodule-1.4.tar.gz Interface python para
MySQL. Por Joseph Skinner <joe@earthlight.co.nz>. Modificado por Joerg Sene-
kowitsch <senekow@ibm.net>.
http://www.mysql.com/Downloads/Contrib/mysqltcl-1.53.tar.gz Interface Tcl para o
MySQL. Baseado no msqltcl-1.50.tar.gz. Para a verso 2.0 e mais informaes, ve-
ja http://www.xdobry.de/mysqltcl/.
http://www.mysql.com/Downloads/Contrib/MyC-0.1.tar.gz Uma API com Visual Basic por
Ed Carp.
http://www.mysql.com/Downloads/Contrib/Vdb-dflts-2.1.tar.gz Esta uma nova verso de
um conjunto de bibliotecas utilitrias com a inteno de fornecer uma interface genrica para
o mecanismo de banco de dados SQL para que sua aplicao se torne de 3 camadas. A vanta-
gem que voc pode facilmente trocar o mecanismo de banco de dados implementando um
arquvo para o novo backend sem qualquer alterao em sua aplicao. Por
<damian@cablenet.net>.
http://www.mysql.com/Downloads/Contrib/DbFramework-1.10.tar.gz DbFramework uma
coleo de classes para manipular o banco de dados MySQL. As classes so baseadas no
CDIF Data Model Subject Area. Por Paul Sharpe <paul@miraclefish.com>.
http://www.mysql.com/Downloads/Contrib/pike-mysql-1.4.tar.gz Modulo MySQL para pi-
ke. Para uso com o servidor web Roxen.
http://www.mysql.com/Downloads/Contrib/squile.tar.gz Mdulo para guile que permite
ao guile interagir com banco de dados SQL. Por Hal Roberts.
http://www.mysql.com/Downloads/Contrib/stk-mysql.tar.gz Interface para o Stk. Stk o Tk
widgets com Scheme em vez do Tcl. Por Terry Jones.
Contribuio de Programas
863
http://www.mysql.com/Downloads/Contrib/eiffel-wrapper-1.0.tar.gz Eiffel wrapper por Mi-
chael Ravits.
http://www.mysql.com/Downloads/Contrib/SQLmy0.06.tgz FlagShip Replaceable Database
Driver (RDD) para MySQL. Por Alejandro Fernandez Herrero. A homepage do Flagship
RDD http://www.fship.com/rdds.html.
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 pa-
ra o driver MyODBC am aplicaes Coldfusion. Por Miguel Angel Solrzano.
http://www.mysql.com/Downloads/Contrib/MySQL-ADA95_API.zip Uma interface
ADA95 para a API do MySQL. Por Francois Fabien.
http://www.mysql.com/Downloads/Contrib/MyTool-DLL_for_VB_and_MySQL.zip Uma
DLL com a API C do MySQL para Visual Basic. Por Ken Menzel <kenm@icarz.com>.
http://www.mysql.com/Downloads/Contrib/MYSQLX.EXE Objeto ActiveX do MySQL pa-
ra 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 escre-
ver PROCEDURE MySQL que podem ser carregados em tempo de execuo.
http://www.mysql.com/Downloads/Contrib/lua-4.0.tar.gz LUA 4.0
http://www.mysql.com/Downloads/Contrib/mylua-3.23.32.1.tar.gz Correo para o
MySQL 3.23.32 para usar o LUA 4.0. Por Cristian Giussani.
http://www.mysql.com/Downloads/Contrib/patched_myodbc.zip Correo (para suporte ao
Omniform 4.0) para o driver MyODBC. Por Thomas Thaele
<tthaele@papenmeier.de>
B.2. Conversores
http://www.mysql.com/Downloads/Contrib/mssql2mysql.txt Conversor do MS-SQL para
MySQL. Por Michael Kofler. O site do mssql2mysql
http://www.kofler.cc/mysql/mssql2mysql.html.
http://www.mysql.com/Downloads/Contrib/dbf2mysql-1.14.tar.gz Conversor de aruivos .dbf
em tabelas MySQL. Por Maarten Boekhold (<boekhold@cindy.et.tudelft.nl>), Wil-
liam Volkman, e Michael Widenius. Este conversor inclui suporte rudimentar a campos MEMO
para somente-leitura.
http://www.mysql.com/Downloads/Contrib/dbf2mysql-1.13.tgz Converte arquivos .dbf em ta-
belas 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/dbf2mysql.zip Converte arquivos FoxPro .dbf em
tabelas MySQL no Windows. Por Alexander Eltsyn, <ae@nica.ru> ou <ae@usa.net>.
http://www.mysql.com/Downloads/Contrib/dbf2sql.zip Programa pequeno e simples que pode
lhe ajudar a transportar os dados de uma tabela foxpro em uma tabela MySQL. Por Danko Josic.
http://www.mysql.com/Downloads/Contrib/dump2h-1.20.gz Converte a sada de um mysql-
dump em um arquivo de cabealho (.h) do C. Por Harry Brueckner,
<brueckner@mail.respublica.de>.
http://www.mysql.com/Downloads/Contrib/exportsql.txt Um script parecido com ac-
Contribuio de Programas
864
cess_to_mysql.txt, exceto que ele totalmente configurvel, tem melhor converso de ti-
po (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 con-
verte para o mSQL v1 e v2, e no tem custo. Veja http://www.cynergi.net/exportsql/ para a lti-
ma 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 mdu-
lo 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 con-
trrio 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. Cria-
do por Laurent Bossavit da NetDIVE. Nota: no funciona com Access2!
http://www.mysql.com/Downloads/Contrib/mdb2sql.bas Conversor do Access97 para MySQL
por Moshe Gurvich.
http://www.mysql.com/Downloads/Contrib/msql2mysqlWrapper-1.0.tgz Um wrapper C do
mSQL para MySQL. Por <alfred@sb.net>
http://www.mysql.com/Downloads/Contrib/sqlconv.pl Um script simples que pode ser usado pa-
ra 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 mysql-
dump 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 Shree-
ve.
http://www.mysql.com/Downloads/Contrib/oracledump Progrma Perl para converter bancos de
dados Oracle em MySQL. Tem o mesmo formato de sada do mysqldump. Por Johan Anders-
son.
http://www.mysql.com/Downloads/Contrib/excel2mysql Programa Perl para importar pastas de
trabalho do Excel em um banco de dados MySQL. Por Stephen Hurd
<shurd@sk.sympatico.ca>
http://www.mysql.com/Downloads/Contrib/T2S_100.ZIP. Programa Windos para converter ar-
quivos textos em banco de dados MySQL. Por Asaf Azulay.
B.3. Utilitrios
http://worldcommunity.com/opensource/utilities/mysql_backup.html MySQL Backup um
script de backup para o MySQL. Por Peter F. Brown.
http://www.mysql.com/Downloads/Contrib/mysql_watchdog.pl Monitora a daemon do MySQL
par possveis travamentos. Por Yermo Lamers, <yml@yml.com>.
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 to-
da a tabela em um banco de dados. Por Thomas Wana.
http://www.mysql.com/Downloads/Contrib/mysqlsync. Um script Perl para manter cpias remo-
tas de uma banco de dados MySQL em sioncronia com uma cpia master central. Por Mark Jef-
tovic. <markjr@easydns.com>.
Contribuio de Programas
865
http://www.mysql.com/Downloads/Contrib/MySQLTutor-0.2.tar.gz. MySQLTutor. Um tutorial
MySQL para iniciantes.
http://www.mysql.com/Downloads/Contrib/mysql_replicate.pl Programa Perl que trata replica-
es. Por <elble@icculus.nsg.nwu.edu>
http://www.mysql.com/Downloads/Contrib/dbcheck Script Perlque tira backup de uma tabela
antes de executar isamchk nelas. Por Elizabeth.
http://www.mysql.com/Downloads/Contrib/mybackup.
http://www.mswanson.com/mybackup (home page do mybackup) Wrapper para o mysqldump
para backup de todos os bancos de dados. Por Marc Swanson.
http://www.mysql.com/Downloads/Contrib/mdu.pl.gz Exibe o armazenamento usado em um
banco de dados MySQL.
Contribuio de Programas
866
Apndice C. Colaboradores do
MySQL
Este apndice lista o desenvolvedores, coolaboradores e responsveis por suporte que ajudaram a fa-
zer o MySQL o que ele hoje.
C.1. Desenvolvedores do MySQL
Estes so os desenvolvedores que que so ou foram empregaos pela MySQL AB para trabalhar no
programa de banco de dados MySQL, listado na ordem em que comearam a trabalhar para ns. Na
sequncia de cada um dos desenvolvedores est uma pequena lista de tarefas pelas quais o desenvol-
vedor resposvel ou as realizaes de cada um. Todos os desenvolvedores esto envovidos no su-
porte.
Michael (Monty) Widenius
Desenvolvedor lder e prioncipal autor do servidor MySQL (mysqld).
Novas funes para a biblioteca de string.
A maioria das bibliotecas mysys.
As biblotecas ISAM e MyISAM (tratamento do arquivo de ndices em rvore-B e compacta-
o do ndice e formato de regitsros diferentes).
A biblioteca HEAP. Um sistema de tabela em memria com nosso hashing totalmente din-
mico. Em uso desde 1981 e publicado em 1984.
O programa replace (gastou bastante tempo nele, bem LEGAL!).
MyODBC, o driver ODBC para Windows95.
Correo de bugs nas MIT-pthreads para faz-la funcionar com o Servidor MySQL. E tam-
bm Unireg, uma ferramenta com muitas utilidades.
Portabilidade de ferramentas mSQL como msqlperl, DBD/DBI, e DB2mysql.
A maioria dos programas crash-me e a fundao do benchmarks do MySQL.
David Axmark
Principal escritor inicial do Manual de Referncia, incluindo melhoras no texi2html.
Atualizao automatica do manual no site.
Suporte incial ao Autoconf, Automake, e Libtool.
Licenciamento.
Partes de todos os arquivos textos. (Hoje em dia apenas o README deixado. O reto inclu-
do no manual.)
Varios testes de novos recursos.
Nosso expert em assuntos legais de Software Livre.
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 par-
867
tes do mysys foram deixadas.
Algum para o Monty chamar no meio da noite que ele percebe que aquele novo recurso
funciona.
Chefe "Open Sourcerer" (relaes na comunidade MySQL).
Jani Tolonen
mysqlimport
Diversas extenses dos clientes de linha de comando.
PROCEDURE ANALYSE()
Sinisa Milivojevic
Compactao (com zlib) no protocolo cliente/servidor.
Hashing perfeito para fase do analisador lexicogrfico.
INSERT multi-linhas
Opo -e domysqldump
LOAD DATA LOCAL INFILE
Opo SQL_CALC_FOUND_ROWS do SELECT
Opo --max-user-connections=...
net_read e net_write_timeout
GRANT/REVOKE e SHOW GRANTS FOR
Novo protocolo cliente/servidor para 4.0
UNION na verso 4.0
DELETE/UPDATE multi-tabelas
Tabelas derivadas na verso 4.1
Gernciamento de recursos do usurio
Desenvolvedor inicial da APC C++ MySQL++ e do cliente MySQLGUI.
Tonu Samuel (past developer)
interface VIO (a fundao para o protocolo cliente/servidor criptografado).
Sistema de arquivos do MySQL (um modo de usar banco de dados MySQL como arquivos e
diretrios).
A expresso CASE.
As funes MD5() e COALESCE().
Suporte RAID para tabelas MyISAM.
Sasha Pachev
Implementao inicial da replicao (at verso 4.0).
Colaboradores do MySQL
868
SHOW CREATE TABLE.
mysql-bench
Matt Wagner
Pacote de teste do MySQL
Webmaster (at 2002).
Coordenador do desenvolvimento.
Miguel Solorzano
Desenvolvimento e contruo das distribuies Win32
Cdigo do servidor Windows NT.
WinMySQLAdmin
Timothy Smith (past developer)
Suporte a conjunto de caracteres dinmicos.
configure, RPMs e outra partes dos sistemas construdos.
Desenvolvedor inicial do libmysqld, o servidor embutido.
Sergei Golubchik
Pesquisa Full-text.
Adioo de chaves biblioteca MERGE.
Jeremy Cole
Aprovao e edio deste manual.
ALTER TABLE ... ORDER BY ....
UPDATE ... ORDER BY ....
DELETE ... ORDER BY ....
Indrek Siitan
Design/programao de nossa interface web.
Autor do nosso sistema de gerenciamento de newsletter.
Jorge del Conde
MySQLCC (MySQL Control Center)
Desenvolvento do Win32
Implantao inicial do portal na web.
Venu Anuganti
Connector/ODBC (MyODBC) 3.51
Novo protocolo cliente/servidor para a verso 4.1 (para instrues preparadas).
Colaboradores do MySQL
869
Arjen Lentz
Responsvel pelo Manual de Referncia do MySQL
Preparao da edio impressa do Manual.
Alexander (Bar) Barkov, Alexey (Holyfoot) Botchkov, and Ramil Kalimullin
Dados espaciais (GIS) e implementao de Arvores-R para verso 4.1
Unicode e conjunto de caracteres para verso 4.1; documentao para os mesmos.
Oleksandr (Sanja) Byelkin
Cache de consultas na verso 4.0
Implementao de subconsultas (4.1).
Aleksey (Walrus) Kishkin and Alexey (Ranger) Stroganov
Anlise e desenho dos benchmarks.
Manuteno do pacote de teste do MySQL.
Zak Greant
Advogado do Open Source, relaes da comunidade MySQL
Carsten Pedersen
O programa de certificao do MySQL.
Lenz Grimmer
Engenharia de produo (contruo e distribuio)
Peter Zaitsev
Funes SHA1(), AES_ENCRYPT() e AES_DECRYPT().
Depurao, pondo em ordem vrios recursos.
Alexander (Salle) Keremidarski
Suporte.
Depurao.
Per-Erik Martin
Desenvolvedor responsvel por stored procedures (5.0) e triggers.
Jim Winstead
Lidera o desenvolvimento web
Mark Matthews
Driver do Connector/J (Java).
Peter Gulutzan
Adequao aos padres SQL-99, SQL:2003.
Colaboradores do MySQL
870
Documentao do algoritmo/cdigo existente do MySQL.
Documentao do conjunto de caracteres.
Guilhem Bichot
Replciao, a partir do MySQL verso 4.0.
Correo do tratamento de expoentes para DECIMAL.
Autor do mysql_tableinfo.
Antony T. Curtis
MySQL Database para OS/2.
C.2. Coolaboradores do MySQL
Enquanto a MySQL AB for dona dos direitos autorais do servidor MySQL e do manual
MySQL, desejamos reconhecer aqueles que tiveram contibuies de qualquer tipo na distribui-
o do MySQL. Os colaboradores esto listados aqui, em uma ordem randmica:
Gianmassimo Vigazzola <qwerg@mbox.vol.it> or <qwerg@tin.it>
A portabilidade inicial para Win32/NT.
Per Eric Olsson
Pelas crticas mais ou menos condtrutivas e pelo teste do formato de registro dinmico.
Irena Pancirov <irena@mail.yacc.it>
Portabilidade para Win32 com compilador Borland. mysqlshutdown.exe e mysql-
watch.exe
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.
Igor Romanenko <igor@frog.kiev.ua>
Colaboradores do MySQL
871
mysqldump (antigo msqldump, mas portado e aprimorado por Monty).
Yuri Dario
Por manter e expandir a portabilidade do MySQL para OS/2.
Tim Bunce
Autor do mysqlhotcopy.
Zarko Mocnik <zarko.mocnik@dem.si>
Ordenao em esloveno.
"TAMITO" <tommy@valley.ne.jp>
O macro do conjunto de caracteres _MB e os conjuntos de caracteres ujis e sjis.
Joshua Chamas <joshua@chamas.com>
Base para inseres concorrentes, sintaxe da data estendida, depurao no NT resposta na lista
de email do MySQL.
Yves Carlier <Yves.Carlier@rug.ac.be>
mysqlaccess, um progrma para mostrar os direitos de acesso do usurio.
Rhys Jones <rhys@wales.com> (e GWE Technologies Limited)
Por um dos primeiros drives JDBC.
Dr Xiaokun Kelvin ZHU <X.Zhu@brad.ac.uk>
Desenvolvimento de um dos primeiros drivers JDBC e outras ferramentas Java relacionadas ao
MySQL.
James Cooper <pixel@organic.com>
Por configurar um arquivo de lista de email com busca em seu site.
Rick Mehalick <Rick_Mehalick@i-o.com>
Pelo xmysql, um cliente grfico X para o servidor MySQL.
Doug Sisk <sisk@wix.com>
Por fornecer pacotes RPM do MySQL para Linux Red Hat
Diemand Alexander V. <axeld@vial.ethz.ch>
Por fornecer pacotes RPM do MySQL para Linux Red Hat-Alpha.
Antoni Pamies Olive <toni@readysoft.es>
Por fornecer verses RPM de vrios clientes MySQL para Intel e SPARC.
Jay Bloodworth <jay@pathways.sde.state.sc.us>
Por forncer verses RPM do MySQL verso 3.21.
David Sacerdote <davids@secnet.com>
Ideias para verificao segura de nomes de mquinas DNS.
Colaboradores do MySQL
872
Wei-Jou Chen <jou@nematic.ieo.nctu.edu.tw>
Algum suporte para caracteres chineses (BIG5).
Wei He <hewei@mail.ied.ac.cn>
Diversas funcionalidades para o conjunto de casracteres chineses(GBK).
Jan Pazdziora <adelton@fi.muni.cz>
Oredenao em Tcheco
Zeev Suraski <bourbon@netvision.net.il>
Formatao de tempo FROM_UNIXTIME(), funes ENCRYPT() e conseleheiro do bison.
Membro ativo da lista de email.
Luuk de Boer <luuk@wxs.nl>
Portado (e extendido) o pacote de benchmark para DBI/DBD. Tem sido de grande ajuda com o
crash-me e benchmarks em execuo. Algumas novas funes de data. O script
mysql_setpermissions.
Alexis Mikhailov <root@medinf.chuvashia.su>
funes definidas por usurios (UDFs); CREATE FUNCTION e DROP FUNCTION.
Andreas F. Bobak <bobak@relog.ch>
A extenso AGGREGATE para funes UDF.
Ross Wakelin <R.Wakelin@march.co.uk>
Ajuda na configurao do InstallDhield para o MySQL-Win32.
Jethro Wright III <jetman@li.net>
A biblioteca libmysql.dll.
James Pereria <jpereira@iafrica.com>
Mysqlmanager, uma ferramenta Win32 GUI para administrao do servidor MySQL.
Curt Sampson <cjs@portal.ca>
Potabilidade de MIT-pthreads para NetBSD/Alpha e NetBSD 1.3/i386.
Martin Ramsch <m.ramsch@computer.org>
Exemplos no Tutorial MySQL.
Steve Harvey
Por fazer mysqlaccess mais seguro.
Konark IA-64 Centre of Persistent Systems Private Limited
http://www.pspl.co.in/konark/. Ajuda com a portabilidade do servidor MySQL para Win64.
Albert Chin-A-Young.
Atulizao do configure para Tru64, suporte a arquivos grandes e suporte a melhores wrappers
TCP.
John Birrell
Colaboradores do MySQL
873
Emulacao do pthread_mutex() para OS/2.
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, Mauri-
zio 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.
Daniel Koch <dkoch@amcity.com>
Configurao do Irix.
Luuk de Boer <luuk@wxs.nl>
Dvidas de benchmark.
Tim Sailer <tps@users.buoy.com>
Questes do DBD-mysql.
Boyd Lynn Gerber <gerberb@zenez.com>
Questes relacionadas ao SCO.
Richard Mehalick <RM186061@shellus.com>
Questes relacionadas ao xmysql e questes bsicas de instalao.
Zeev Suraski <bourbon@netvision.net.il>
Questes de configurao do mdulo Apache (log & autent) e questes relacionadas ao PHP,
questes relacionadas a sintaxe SQL e outras questes gerais.
Francesc Guasch <frankie@citel.upc.es>
Questes gerais.
Jonathan J Smith <jsmith@wtp.net>
Questes especficas do SO Linux, sintaxe SQL e outra coisas que podem precisar de algum tra-
balho.
Colaboradores do MySQL
874
David Sklar <sklar@student.net>
Usando o MySQL a partir de PHP e Perl.
Alistair MacDonald <A.MacDonald@uel.ac.uk>
Ainda no especificado, mas flexvel e pode lidar com Linux e, talvez, HP-UX. Tentar conse-
guir usurios para utilizar mysqlbug.
John Lyon <jlyon@imag.net>
Questes sobre instalao do MySQL em sistemas Linux, usando ou arquivos .rpm ou compi-
lando o fonter.
Lorvid Ltd. <lorvid@WOLFENET.com>
Assuntos simples de contas/licena/suporte/direitos autorais
Patrick Sherrill <patrick@coconet.com>
Questes sobre interfaces ODBC e VisualC++.
Randy Harmon <rjharmon@uptimecomputers.com>
Questes sobre DBD, Linux, e algumas sintxe SQL.
C.3. Responsveis pela Documentao e Tra-
duo
As seguintes pessoas nos ajudaram com a escrita da documentao do MySQL e a traduo da docu-
mentao ou mensagens de erro no 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.
Michael J. Miller Jr. <mke@terrapin.turbolift.com>
Pelo primeiro manual MySQL. E diversas grafia/linguagem corrigidas no FAQ (que virou o ma-
nual MySQL a muito tempo atras)
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].
Jay Flaherty <fty@mediapulse.com>
Grande parte da seo Perl DBI/DBD no manual.
Paul Southworth <pauls@etext.org>, Ray Loyzaga <yar@cs.su.oz.au>
Aprovao do Manual de Referncia.
Colaboradores do MySQL
875
Therrien Gilbert <gilbert@ican.net>, Jean-Marc Pouyot <jmp@scalaire.fr>
Mensagens de erro em Francs.
Petr Snajdr, <snajdr@pvt.net>
Mensagens de erro em Tcheco.
Jaroslaw Lewandowski <jotel@itnet.com.pl>
Mensagens de erro em Polons
Miguel Angel Fernandez Roiz
Mensagens de erro em Espanhol
Roy-Magne Mo <rmo@www.hivolda.no>
Mensagens de erro em noruegus e teste da verso 3.21.#.
Timur I. Bakeyev <root@timur.tatarstan.ru>
Mensagens de erro em russo.
<brenno@dewinter.com> & Filippo Grassilli <phil@hyppo.com>
Mensagens de erro em italiano.
Dirk Munzinger <dirk@trinity.saar.de>
Mensagens de erro em alemo.
Billik Stefan <billik@sun.uniag.sk>
Mensagens de erro en eslovaco.
Stefan Saroiu <tzoompy@cs.washington.edu>
Mensagens de erro em romeno.
Peter Feher
Mensagens de erro em hungaro.
Roberto M. Serqueira
Mensagens de erro em 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).
C.4. Bibliotecas usadas e incluidas com o
MySQL
A seguir est uma lista dos criadores da biblioteca que inclumos com o fonte do servidor MySQL
Colaboradores do MySQL
876
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 biblio-
teca (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 desenvol-
vido por Chris Provenzano, pela Univesidade da Califrnia, Berkeley e colaboradores. Atual-
mente estamos usando a verso 1_60_beta6 corrigida pelo Monty (veja mit-pthre-
ads/Changes-mysql).
Jean-loup Gailly and Mark Adler
Pela biblioteca zlib (usada no MySQL para Windows).
Bjorn Benson
Por seu pacote safe_malloc (verificador de memria) que usado quando voc configura o
MySQL com --debug.
Free Software Foundation
A biblioteca readline (para o cliente mysql).
The NetBSD fondation
O pacote libedit (usado opcionalmente pelo cliente de linha de comando mysql).
C.5. Pacotes que suportam o MySQL
A seguir encontra-se uma lista dos criadores/mantenedores de algumas das mais importantes APIs/
pacotes/aplicaes que muitas pessoas utilizam com o MySQL.
No podemos listar todos os pacotes existentes aqui porque a lista seria muito difcil de manter. Para
outros pacotes, v ao portal do software em http://www.mysql.com/portal/software.
Tim Bunce, Alligator Descartes
Pela interface DBD (Perl).
Andreas Koenig <a.koenig@mind.de>
Pela interface Perl para o servidor MySQL.
Jochen Wiedmann <wiedmann@neckar-alb.de>
Por manter o mdulo Perl DBD::mysql.
Colaboradores do MySQL
877
Eugene Chan <eugene@acenet.com.sg>
Por portar o PHP para o servidor 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.
Giovanni Maruzzelli <maruzz@matrice.it>
Por portar iODBC (ODBC para Unix).
Xavier Leroy <Xavier.Leroy@inria.fr>
O autor da LinuxThreads (usada pelo servidor MySQL no Linux).
C.6. Ferramentas que so usadas para criar o
MySQL
Segue aqui uma lista de algumas das ferramentas que usamos para criar o MySQL. Ns a utilizamos
para expressar nossos agradecimentos para aquelea que as criaram e sem as quais no poderiamos
ter feito do MySQL o que ele hoje.
Free Software Foundation
De quem obtemos um excelente compilador (gcc), a biblioteca libc (de onde pegamos em-
prestado o strto.c para termos algum cdigo funcionando em Linux)
Free Software Foundation
From whom we got an excellent compiler (gcc), an excellent debugger (gdb and the libc li-
brary (from which we have borrowed strto.c to get some code working in Linux).
Free Software Foundation & The XEmacs development team
For a really great editor/environment used by almost everybody at MySQL AB.
Julian Seward
Author of valgrind, an excellent memory checker tool that has helped us find a lot of other-
wise hard to find bugs in MySQL.
Dorothea Ltkehaus and Andreas Zeller
For DDD (The Data Display Debugger) which is an excellent graphical frontend to gdb).
C.7. Responsveis pelo Suporte do MySQL
Enquanto a MySQL AB montm todos os direitos autorais do servidor MySQL e do manual
MySQL, desejamos apresentar as seguintes companias, que nos ajudaram financeiramente no desen-
volvimento do servidor MySQL, nos pagando para desenvolver novos recursos ou nos dando
hardware para o desenvolvimento do servidor MySQL.
VA Linux / Andover.net
Replicaes de fundos.
Colaboradores do MySQL
878
NuSphere
Edio do manual MySQL.
Stork Design studio
O site da MySQL usado entre 1998-2000.
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
Colaboradores do MySQL
879
Apndice D. Histrico de Alteraes
do MySQL
Este apndice lista as alteraes de verso para verso no cdigo fonte do MySQL.
Estamos agora trabalhando ativamente no MySQL 4.1 & 5.0 e s forneceremos correes de erros
crticos para o MySQL 4.0 e MySQL 3.23. Atualizamos esta seo a medida que adicionamos novos
recursos, para que assim todos possam acompanhar o desenvolvimento.
Nossa seo de TODO contm os planos adicionais que temos para as verses 4.1 e 5.0. See Sec-
o 1.6, MySQL e o Futuro (o TODO).
Note que tendemos a atualizar o manual ao mesmo tempo em que fazemos as alteraes no MySQL.
Se voc encontrar um verso listada aqui que voc no pode encontrar na pgina de download do
MySQL (http://www.mysql.com/downloads/), significa que a verso ainda no foi liberada!
A data mencionada com uma verso liberada a data do ltimo BitKeeper ChangeSet na qual esta
distribuio particular foi baseada, e no a data em que os pacotes estavam disponveis. Os binrios
esto disponveis normalmente alguns dias aps a data indicada do ChangeSet - contruir e testar to-
dos os pacotes levam algum tempo.
D.1. Alteraes na distribuio 5.0.0
(Development)
No momento, a verso 5.0 s est disponvel em seu cdigo fonte. See Seco 2.3.4, Instalando pe-
la rvore de fontes do desenvolvimento.
O seguinte log de alteraes mostra o que j foi feito na rvore 5.0:
Suporte bsico a stored procedures (estilo SQL-99).
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.
D.2. Alteraes na distribuio 4.1.x (Alpha)
A verso 4.1 do servidor MySQL inclui muitos melhoramentos e novos recursos. Os binrios desta
verso esto disponveis para download em http://www.mysql.com/downloads/mysql-4.1.html.
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 UP-
DATE de um registro existente se a insero criasse um valor duplicado em uma chave PRI-
MARY ou UNIQUE. (REPLACE lhe permite sobrescrever um registro existente, o que totalmen-
te diferente). See Seco 6.4.3, Sintaxe INSERT.
Uma nova funo de agrupamento GROUP_CONCAT(). See Seco 6.3.7, Funes e Modifi-
cadores para Usar com Clusulas GROUP BY.
Suporte a Unicode Extensivo (UTF8).
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 ...
ndices BTREE em tabelas HEAP.
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 WAR-
NINGS | ERRORS.
Protocolo binrio mais rpido com instrues prepardas e ligao de parmetros. See Sec-
o 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 en-
to 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 in-
dividual.
D.2.1. Alteraes na distribuio 4.1.2 (not released
yet)
Functionality added or changed:
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 state-
ments to be executed when each client connects or each time a slave's SQL thread starts, respec-
tively.
C API enhancement: SERVER_QUERY_NO_INDEX_USED and SER-
VER_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 star-
ted 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 provi-
Histrico de Alteraes do MySQL
881
ded. (Bug #1561)
Packaging: Fixed a bug in the Mac OS PKG postinstall script (mysql_install_db
was called with an obsolete argument).
Packaging: Added missing file mysql_create_system_tables to the server RPM packa-
ge. This bug was fixed for the 4.1.1 RPMs by updating the MySQL-server RPM from MySQL-
server-4.1.1-0 to MySQL-server-4.1.1-1. The other RPMs were not 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)
Fixed a crash in full-text indexing of UTF-8 data. (Bug #2033)
Replication: a rare race condition in the slave SQL thread that could lead to an incorrect compla-
int that the relay log is corrupted. (Bug #2011)
Replication: if an administrative command on a table (OPTIMIZE TABLE, REPAIR TABLE
etc) was run on the slave, this could sometimes stop the slave SQL thread (this did not lead to
any corruption; one just had to type START SLAVE to get replication going again). (Bug
#1858)
Replication: in the slave SQL thread, a multi-table UPDATE could produce an incorrect compla-
int that some record was not found in one table, if the UPDATE was preceded by a INSERT
... SELECT. (Bug #1701)
D.2.2. Alteraes na distribuio 4.1.1 (01 de Dez de
2003)
Funcionalidades adicionadas ou alteradas:
Added IGNORE option for DELETE statement.
The MySQL source distribution now also includes the MySQL Internals Manual inter-
nals.texi.
Added mysql_set_server_option() C API client function to allow multiple statement
handling in the server to be enabled or disabled.
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 CLI-
ENT_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 AL-
TER TABLE table_name ... CHARACTER SET=... to change the character set for all
CHAR, VARCHAR, and TEXT columns in a table.
Added MATCH ... AGAINST( ... WITH QUERY EXPANSION) and the
ft_query_expansion_limit server variable.
Removed unused ft_max_word_len_for_sort server variable.
Full-text search now supports multi-byte character sets and the Unicode utf8 character set.
Histrico de Alteraes do MySQL
882
(The Unicode ucs2 character set is not yet supported.)
Phrase search in MATCH ... AGAINST ( ... IN BOOLEAN MODE) no longer matches
partial words.
Added aggregate function BIT_XOR() for bitwise XOR operations.
Replication over SSL now works.
The START SLAVE statement now supports an UNTIL clause for specifying that the slave SQL
thread should be started but run only until it reaches a given position in the 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 sin-
gle-row statements.
Added delimiter (\d) command to the mysql command-line client for changing the state-
ment 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 num-
bers before).
The DATABASE() function now returns NULL rather than the empty string if there is no databa-
se selected.
Added --sql-mode=NO_AUTO_VALUE_ON_ZERO option to suppress the usual behaviour of
generating the next sequence number when zero is stored in an AUTO_INCREMENT column.
With this mode enabled, zero is stored as zero; only storing NULL generates a sequence number.
Warning: Incompatible change! Client authentication now is based on 41-byte passwords in
the user table, not 45-byte passwords as in 4.1.0. Any 45-byte passwords created for 4.1.0
must be reset after running the mysql_fix_privilege_tables script.
Added MySQL Server option and global variable 'secure-auth' that disallows authentication for
accounts that have old (pre-4.1.1) passwords.
Added MySQL command line client option 'secure-auth'. If this option is set, client will refuse
to send password in old (pre-4.1.1) format.
Warning: Incompatible change! Renamed the C API mysql_prepare_result() functi-
on to mysql_get_metadata() as the old name was confusing.
Added DROP USER 'username'@'hostname' statement to drop an account that has no
privileges.
The interface to aggregated UDF functions has changed a bit. You must now declare a
xxx_clear() function for each aggregate function XXX().
The CONCAT_WS() function no longer skips empty strings.
Added new ADDTIME(), DATE(), DATEDIFF(), LAST_DAY(), MAKEDATE(), MAKETI-
ME(), 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 argu-
ment.
Histrico de Alteraes do MySQL
883
Added new type values DAY_MICROSECOND, HOUR_MICROSECOND, MINU-
TE_MICROSECOND, SECOND_MICROSECOND, and MICROSECOND for DATE_ADD(), DA-
TE_SUB(), and EXTRACT().
Added new %f microseconds format specifier for DATE_FORMAT() and TIME_FORMAT().
All queries in which at least one SELECT does not use indexes properly now are written to the
slow query log when long log format is used.
It is now possible to create a MERGE table from MyISAM tables in 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 funes COMPRESS(), UNCOMPRESS() e UNCOMPRES-
SED_LENGTH().
Ao fazer SQL SQL_MODE=#, para um modo complexo (como ANSI) agora atualizamos a vari-
vel SQL_MODE para incluir todas as opes que o modo exige.
Adicionada a funo ROLLUP OLAP (Online Analytical Processing - Processamento Analtico
Online), que lhe d um resumo para cada nvel GROUP BY.
Adicionado os cdigos SQLSTATE para todos os erros do servidor.
Adicionado mysql_sqlstate() e mysql_stmt_sqlstate() que retornam o cdigo de
erro SQLSTATE para o ltimo erro.
--lower-case-table-names=1 agora tambm faz a aliases caso insensitivo. (Bug #534)
Colunas TIME com valor de horas maior do que 24 eram retornadas incorretamente para o clien-
te.
As instrues ANALYZE, OPTIMIZE, REPAIR e FLUSH so agora armazenados no log binrio
e assim replicados para o slave. Este registro no ocorre se a palavra chave opcional
NO_WRITE_TO_BINLOG (ou seu alias LOCAL) for usada. As excees so que FLUSH LOGS,
FLUSH MASTER, FLUSH SLAVE e FLUSH TABLES WITH READ LOCK, no so registra-
dos no log em qualquer caso. Para uma sintaxe completa, veja Seco 4.6.4, Sintaxe de
FLUSH.
Nova varivel global RELAY_LOG_PURGE para habilitar ou desabilitar automaticamente a re-
moo de relay logs.
LOAD DATA agora produz avisos que podem ser buscados com SHOW WARNINGS.
Adicionado o suporte a sintaxe CREATE TABLE nome_tabela (LIKE no-
me_tabela2).
CREATE TABLE nome_tabela (...) TYPE=storage_engine agora gera um aviso
se o mecanismo de armazenamento no for respeitado. A tabela ainda criada como MyISAM,
como antes.
Muitas sub selectas so muito mais rpidas que antes.
Disabled the PURGE LOGS statement that was added in in version 4.1.0. The statement now
should be issued as PURGE MASTER LOGS or PURGE BINARY LOGS.
Added SHOW BDB LOGS as an alias for SHOW LOGS.
Added SHOW MASTER LOGS (which had been deleted in version 4.1.0) as an alias for SHOW
BINARY LOGS.
Added Slave_IO_State and Seconds_Behind_Master columns to the output of SHOW
SLAVE STATUS. Slave_IO_State indicates the state of the slave I/O thread, and Se-
conds_Behind_Master indicates the number of seconds by which the slave is late compa-
Histrico de Alteraes do MySQL
884
red to the master.
--lower-case-table-names=1 now also makes aliases case insensitive. (Bug #534)
Bugs corrigidos:
Fixed merging types and length of fields in UNION
Fixed a bug in privilege handling that caused connections from certain IP addresses to be assig-
ned 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 name resolution of columns of reduced subqueries in unions. (Bug #745)
Fixed memory overrun in subqueries in select list with WHERE clause bigger than outer query
WHERE clause. (Bug #726)
Fixed a bug that caused MyISAM tables with FULLTEXT indexes created in 4.0.x to be unreada-
ble in 4.1.x.
Fixed a data loss bug in REPAIR TABLE ... USE_FRM when used with tables that contai-
ned TIMESTAMP columns and were created in 4.0.x.
Fixed reduced subquery processing in ORDER BY/GROUP BY clauses. (Bug #442)
Fixed name resolution of outer columns of subquery in INSERT/REPLACE statements. (Bug
#446)
Fixed bug in marking columns of reduced subqueries. (Bug #679)
Fixed a bug that made CREATE FULLTEXT INDEX syntax illegal.
Fixed a crash when a SELECT that required a temporary table (marked by Using tempo-
rary in EXPLAIN output) was used as a derived table in EXPLAIN command. (Bug #251)
Fixed a rare table corruption bug in DELETE from a big table with a new (created by MySQL-
4.1) fulltext index.
LAST_INSERT_ID() now returns 0 if the last INSERT statement didn't insert any rows.
Corrigido a perda dos ltimos caracteres na sada da funo (bug #447)
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 adici-
onal, o que estava incorreto. (ele deve parar no BEGIN, no primeiro relay log). (Bug #53)
Agora CONNECTION_ID() replicado apropriadamente (bug #177).
A nova funo PASSWORD() na verso 4.1 replicada apropriadamente (bug #344).
Histrico de Alteraes do MySQL
885
Corrigida a dupla liberao de memria
Corrigido um erro em UNION envolvendo tabelas temporrias.
Corrigido um erro de falha em DERIVED TABLES quando EXPLAIN usado em um DERI-
VED 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 exis-
tente 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 cone-
xes 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 IN-
SERT 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: O uso do parmetro ? de instrues preparadas
como argumento de certas funes e clusulas fazia com que o servidor falhasse durante chama-
das mysql_prepare(). (Bug #1500)
Corrigido um erro com instrues preparadas: depois da chamada de mysql_stmt_prepare, col-
chetes so permitidos em todas as instrues consequentes, mesmo se eles no forem preparados
(bug #1946)
D.2.3. Alteraes na distribuio 4.1.0 (03 Apr 2003:
Alpha)
Funcionalidades adicionadas ou alteradas:
Nova autenticao do cliente, mais segura, baseada em senha de 45-byte na tabela user.
Nova funo CRC32() para calcular valor de verificao de redundncia cclica.
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 co-
lunas de caracteres.
A verificao de DATE/DATETIME agora um bit estritamente para suportar a habilidade de
deitiguir automaticamente entre date, datetime e time com microsegundos. Por exemplo, tipos de
dados YYYYMMDD HHMMDD no so mais suportados; deve-se tambm ter separadores entre as
partes DATE/TIME ou no.
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().
Histrico de Alteraes do MySQL
886
Adionada a nova funo da API C mysql_get_server_version().
Corrigido um buh na libmysqlclient que buscava campos padres.
Corrigido um bug no cliente mysql.cc ao ignorar comentrios
Adicionado o mtodo record_in_range() para tabelas MERGE poderem escolher o ndice
certo quando houverem muitos para serem escolhidos.
A replicao agora funciona com RAND() e variveis de usurios @var.
Permite-se alterar o modo para ANSI_QUOTES com o servidor no ar.
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.
Adicionado suporte para UNION em tabelas derivadas.
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 parme-
tros 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 re-
sultados.
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 AU-
TO_INCREMENT UNIQUE.
SELECT ... FROM DUAL um alias para SELECT .... (Para ser compatvel com alguns
outros bancos de dados).
Se criado um CHAR/VARCHAR muito grande, ele alterado automaticamente para TEXT ou
BLOB; Ser exibido um aviso neste caso.
POde-se especificar os tipos BLOB/TEXT diferentes com a sintaxe BLOB(tamanho) e
TEXT(tamanho). O MySQL ir alter-los automaticamente para um dos tipos internos
BLOB/TEXT.
CHAR BYTE um alias para CHAR BINARY.
VARCHARACTER um alias para VARCHAR.
Novos operadores inteiro MOD inteiro e inteiro DIV inteiro.
Adicionado SERIAL DEFAULT VALUE como um alias para AUTO_INCREMENT.
Histrico de Alteraes do MySQL
887
Adicionado TRUE e FALSE como alias para 1 e 0, respectivamente.
Agora aliases so forados em tabelas dferivadas, como no SQL-99.
orrigido SELECT .. LIMIT 0 para retornar a contagem aproriada de linhas para
SQL_CALC_FOUND_ROWS.
Pode-se especificar muitos diretrios temporrios para serem usados de modo round-robin com:
--tmpdir=nomedir1:nomedir2:nomedir3.
Subqueries: SELECT * from t1 where t1.a=(SELECT t2.b FROM t2).
Tabelas derivadas:
SELECT a.col1, b.col2
FROM (SELECT MAX(col1) AS col1 FROM root_table) a,
other_table b
WHERE a.col1=b.col1;
Conjuntos de caracteres a serem definidos por colunas, tabelas e banco de dados.
Suporte a Unicode (UTF8).
Nova sintaxe CONVERT(... USING ...) para converso de valores strings entre conjunto
de caracteres.
ndices BTREE em tabelas HEAP.
Servidor embutido mais rpido (novo protocolo de comunicao interno).
Pode-se adicionar um comentrio por coluna em CREATE TABLE.
SHOW FULL COLUMNS FROM nome_tabela exibe os comentrios das colunas.
ALTER DATABASE.
Suporte a GIS (dados geometricos). See Captulo 10, Extenses Espacias em MySQL.
SHOW [COUNT(*)] WARNINGS exibe avisos sobre o ltimo comnado.
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;
expr SOUNDS LIKE expr o mesmo que SOUNDEX(expr)=SOUNDEX(expr).
Adicionada nova funo VARIANCE(expr) que retorna a varincia de expr
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 reco-
nectar 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.
Histrico de Alteraes do MySQL
888
D.3. Alteraes na distribuio 4.0.x
(Production)
A verso 4.0 do servidor MySQL inclui muitos aprimoramentos e novos recursos:
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 instata-
neamente. See Seco 6.9, Cache de Consultas do MySQL.
Melhora na indexao full-text com modo booleano, truncamento e busca de frase. See Sec-
o 6.8, Pesquisa Full-text no MySQL.
Melhor das tabelas MERGE, suportando INSERTs e AUTO_INCREMENT. See Seco 7.2,
Tabelas MERGE.
Sintaxe UNION em SELECT. See Seco 6.4.1.2, Sintaxe UNION.
Instrues DELETE multi-tabelas. See Seco 6.4.5, Sintaxe DELETE.
libmysqld, a biblioteca do servidor embutido. See Seco 12.1.15, libmysqld, a Biblioteca
do Servidor Embutido MySQL.
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 provedo-
res e outro fornecedores de hospedagem. See Seco 4.4.7, Limitando os Recursos dos Usuri-
os.
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.
Novas funes e opes numerosas.
Alteraes do cdigo existente para melhora da performance e confiabilidade.
Para uma lista completa de alteraes, visite a seo para cada distribuio 4.0.x individual.
D.3.1. Alteraes na distribuio 4.0.17 (not released
yet)
Functionality added or changed:
Allow spaces in windows service names.
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).
Histrico de Alteraes do MySQL
889
Bugs fixed:
Fixed bug #1335 when filesort was never shown in EXPLAIN if query contained ORDER BY
NULL clause.
Fixed invalidation of whole query cache on DROP DATABASE. (Bug #1898)
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 con-
nection. (Bug #1826)
Fixed a bug in trunc* operator of full-text search which sometimes caused MySQL not to find
all matched rows.
Fixed bug in zero prepending to DECIMAL column type.
Fixed optimiser bug, introduced in 4.0.16, when REF access plan was preferred to more 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 pos-
sible 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 tempo-
rary tables when STOP SLAVE was issued.
In a ``chain'' replication setup A->B->C, if 2 sessions on A updated temporary tables of the sa-
me name at the same time, the binary log of B became incorrect, resulting in C becoming confu-
sed. (Bug #1686)
In a ``chain'' replication setup A->B->C, if STOP SLAVE was issued on B while it was replica-
ting a temporary table from A, then when START SLAVE was issued on B, the binary log of B
became incorrect, resulting in C becoming confused. (Bug #1240)
When MASTER_LOG_FILE and MASTER_LOG_POS were not specified, CHANGE MASTER
used the coordinates of the slave I/O thread to set up replication, which broke replication if the
slave SQL thread lagged behind the slave I/O thread. This caused the slave SQL thread to lose
some events. The new behaviour is to use the coordinates of the slave SQL thread instead. See
Seco 4.11.8.1, CHANGE MASTER TO. (Bug #1870)
Now if integer is stored or converted to TIMESTAMP or DATETIME value checks of year,
month, day, hour, minute and second ranges are performed and numbers representing illegal ti-
mestamps are converted to 0 value. This behaviour is consistent with manual and with behaviour
of string to TIMESTAMP/DATETIME conversion. (Bug #1448)
Fixed bug when BIT_AND() and BIT_OR() group functions returned incorrect value if SE-
LECT used a temporary table and no rows were found. (Bug #1790).
Histrico de Alteraes do MySQL
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 com-
plain that the relay log is corrupted. (Bug #2011)
Replication: if an administrative command on a table (OPTIMIZE TABLE, REPAIR TABLE
etc) was run on the slave, this could sometimes stop the slave SQL thread (this did not led to any
corruption; one just had to type START SLAVE to get replication going again). (Bug #1858)
Replication: in the slave SQL thread, a multi-table UPDATE could produce a wrong complain
that some record was not found in one table, if the UPDATE was preceded by a INSERT ...
SELECT. (Bug #1701)
D.3.2. Alteraes na distribuio 4.0.16 (17 Out 2003)
Funcionalidades adicionadas ou alteradas:
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: ran-
ge_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().
Added --libs_r and --include options to mysql_config.
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.
Atualizado o mysql_install_db para poder usar o endereo de IP da mquina local em vez
do nome da mquina ao criar as tabelas de permisses iniciais de skip-name-resolve foi
especificado. Esta opo pode ser til no FreeBSD para evitar problemas de segurana de thre-
ads com o resolver de bibliotecas do FreeBSD. (Obrigado a Jeremy Zawodny pelo patch)
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 loca-
ted in the directory specified by the --slave-load-tmpdir option. All these files are nee-
ded 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 TA-
Histrico de Alteraes do MySQL
891
BLE table_name, when table_name is a MyISAM table. (Bug #1397)
Fixed a bug that resulted in thr_alarm queue is full warnings after increasing the
max_connections variable with SET GLOBAL. (Bug #1435)
Made LOCK TABLES to work when Lock_tables_priv is granted on the database level
and Select_priv is granted on the table level.
Fixed crash of FLUSH QUERY CACHE on queries that use same table several times (Bug
#988).
Fixed core dump bug when setting an enum system variable (such as SQL_WARNINGS) to
NULL.
Extended the default timeout value for Windows clients from 30 seconds to 1 year. (The timeout
that was added in MySQL 4.0.15 was way too short). This fixes a bug that caused ERROR
2013: Lost connection to MySQL server during query for queries that las-
ted 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.
More ``out of memory'' checking in range optimiser.
Fixed and documented a problem when setting and using a user variable within the same SE-
LECT 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 corres-
ponding 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 ru-
les. 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 replicate-
wild-ignore-table=db1.%, as is already the case for CREATE DATABASE and DROP
DATABASE in replication. (Bug #1248)
Fixed a bug where mysqlbinlog crashed with a segmentation fault when used with the -h or
--host option. (Bug #1258)
Fixed a bug where mysqlbinlog crashed with a segmentation fault when used on a binary log
containing only 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 com-
mand 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 slave-
load-tmpdir directory, which defaults to tmpdir) belonging to the other slave MySQL ser-
ver 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 Dele-
te_file event) in its binary log, so the slave could not delete 2 files (SQL_LOAD-*.info
Histrico de Alteraes do MySQL
892
and SQL_LOAD-*.data from its tmpdir. (Bug #1391)
On Windows, the slave forgot to delete a SQL_LOAD-*.info file from tmpdir after suc-
cessfully 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 wri-
ting a transaction to its binary log. This code reported an error in a legal situation: When the sla-
ve 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)
D.3.3. Alteraes na distribuio 4.0.15 (03 Sep 2003)
IMPORTANT:
If you are using this release on Windows, you should upgrade at least your clients (any program that
uses libmysql.lib) to 4.0.16 or above. This is because the 4.0.15 release had a bug in the Win-
dows client library that causes Windows clients using the library to die with a Lost connecti-
on to MySQL server during query error for queries that take more than 30 seconds. This
problem is specific to Windows; clients on other platforms are unaffected.
Funcionalidades adicionadas ou alteradas:
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 consul-
tas 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)
Produz uma mensagem de erro no Windows se um segundo servidor mysqld iniciado na
mesma porta TCP/IP que um servidor mysqld j em execuo.
As variveis do servidor mysqld wait_timeout, net_read_timeout e
net_write_timeout agora funcionam no Windows. Agora pode-se tambm definir o tempo
limite de leitura e escrita em clientes Windows com a opo mysql_options()
Adicionada a opo --sql-mode=NO_DIR_IN_CREATE para tornar possvel para os slaves
ignorarem as opes INDEX DIRECTORY e DATA DIRECTORY dadas para CREATE
TABLE. Quando ele est ligado, SHOW CREATE TABLE no exibir os diretrios dados.
SHOW CREATE TABLE agora exibe as opes INDEX DIRECTORY e DATA DIRECTORY,
se eles fossem especificados quando a tabela era criada.
A varivel do servidor open_files_limit agora exibe o limite de arquivos abertos real.
MATCH ... AGAINST() em modo de linguagem natural agora tratam de palavra presentes
em mais de 2,000,000 linhas como stopwords.
As imagens do disco de instalao do Mac OS X agora incluem um pacote MySQLStartupI-
tem.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.
Histrico de Alteraes do MySQL
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 pa-
dro. Devido a problemas de ligao com compiladores diferentes do gcc, ele no estava inclu-
do em todos os pacotes da distribuio inicial da verso 4.0.15. Os pacotes afetados forma re-
construidos 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 po-
dem verificar em qual banco de dados a consulta com erro est rodando.
Uma alterao da documentao: Adicionado um pargrafo sobre como as opes binlog-
do-db e binlog-ignore-db so testadas em um banco de dados no master (see Sec-
o 4.10.4, O Log Binrio), e um pargrafo sobre como replicate-do-db, replica-
te-do-table e opes anlogas so testadas em bancos de dados e tabelas no slave (see Sec-
o 4.11.6, Opes de Inicializao da Replicao).
Agora o slave no replica SET PASSWORD se estiver configurado para excluir o banco de da-
dos mysql da replicao (usando, por exemplo, replicate-
wild-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 grava-
o 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 va-
zio) no exige mais FLUSH PRIVILEGES para a conta ser conhecida no servidor. (Bug #473)
CHANGE MASTER agora descarrega o relay-log.info. Anteriormente isto era feito na
prxima execuo de START SLAVE, assim se o mysqld fosse desligado no slave depois de
CHANGE MASTER sem executar START SLAVE, o nome e posio do relay log eram perdi-
dos. Na reinicializao eles eram carregados a partir do relay-log.info, revertendo-os para
seus valores antigos (incorretos) de antes do CHANGE MASTER, exibindo mensagens de erro (j
que o relay log antigo no existia mais) e as threads slaves se recusavam a iniciar. (Bug #858)
Bugs corrigidos:
Corrigido o overflow do buffer no tratamewnto de senhas, que podia potencialmente ser explo-
rardo pelo usurio MySQL com privilgios na tabela mysql.user para executar cdigo alea-
trios 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 chec-
ked for each record" na sada do EXPLAIN. (Bug #1172)
Corrigido o tratamento de permisso de tabelas/colunas - a ordenao apropriada (do mais espe-
cfico para o menos especfico, see Seco 4.3.10, Controle de Acesso, Estgio 2: Verificao
da Requisio) no era respeitada (Bug #928)
Histrico de Alteraes do MySQL
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 Win-
dows. (Bug #1119)
Corrigido um possvel deadlock ao alterar key_buffer_size enquanto a cache de chaves era
ativamente usada. (Bug #1088)
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 parente-
ses na parte SELECT.
Corrigido um resultado incorreto ao fazer UNION e ORDER BY .. LIMIT # quando no
usado parenteses na parte SELECT.
Corrigido um problema com SELECT SQL_CALC_FOUND_ROWS ... UNION ALL ...
LIMIT # onde FOUND_ROWS() retornava o nmero incorreto de linhas.
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 co-
mando. (Bug #1064)
Corrigida a falha na comparao de strings usando o conjunto de caracteres tis620. (Bug
#1116)
Corrigido um bug do ISAM na otimizao de MAX().
myisamchk --sort-records=N no marca mais a tabela como danificada se a ordenao
falhar devido a uma chave inapropriada. (Bug #892)
Corrigido um erro no tratamento de tabelas MyISAM compactadas que algumas vezes torna im-
possvel 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 dis-
tribuio. (Bug #1020)
Corrigida um problema de ordenacao da chave (uma chave primria - PRIMARY - declarada em
uma coluna que no explicitamente marcada como NOT NULL era ordenada depois de uma
chave UNIQUE para uma coluna NOT NULL).
Corrigido o resultado de INTERVAL qaundo aplicado a um valor DATE. (Bug #792)
Corrida a compilao da biblioteca do servidor embutido da arquivo de especificao do RPM.
(Bug #959)
Adicionado alguns arquivos que faltavam na arquivo de especificao do RPM e corrigido al-
guns erros de criao do RPM que ocorriam no Red Hat Linux 9. (Bug #998)
Corrigida a avaliao incorreta de XOR na clusula WHERE. (Bug #992)
Corrigido um erro com processamento na cache de consultas com tabelas unidas a partir de mais
de 255 tabelas. (Bug #930)
Histrico de Alteraes do MySQL
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 causando resultados incorretos de MATCH ... AGAINST() em algumas
joins. (Bug #942)
Tabelas MERGE no ignoram mais "Using index" (da sada de EXPLAIN).
Corrigido um erro que fazia uma tabela vazia ser marcada como "analyzed". (Bug #937)
Corrigida a falha em myisamchk --sort-records quando usada em tabelas compactadas.
Corrigido o ALTER TABLE lento (quando comparado a 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 co-
nexes 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 exem-
plo, usando replicate-wild-ignore-table=mysql.%). (Bug #980)
Os campos Last_Errno e Last_Error na sada de SHOW SLAVE STATUS agora so lim-
padas 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 MAS-
TER_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 De-
lete_file. (Bug #1091)
mysqlbinlog exibia avisos superfluos quando se usava --database, o que causava erro de
sintaxe quando enviado para mysql. (Bug #1092)
O mysqlbinlog --database tambm filtra LOAD DATA INFILE (anteriormente, ele
filtrava todas as consultas exceto LOAD DATA INFILE). (Bug #1093)
O mysqlbinlog em alguns casos esquece de colocar um '#' em frente do LOAD DATA
INFILE original (este comando exibido apenas para informao, no para ser executado; mais
tarde ele funcionava como LOAD DATA LOCAL com um nome de arquivo diferente, para exe-
cuo pelo mysql). (Bug #1096)
binlog-do-db e binlog-ignore-db filtravam LOAD DATA INFILE incorretamente
(ele era escrito parcialmente para o log binrio). Isto resultava em um corrompimento do log bi-
nrio, que podia fazer o slave parar com um erro. (Bug #1100)
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)
Histrico de Alteraes do MySQL
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 avi-
sado que no se pode fazer roll back de algumas alteraes, como j era o caso para um IN-
SERT 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 pa-
ra o slave para alguma instruo no transacional, a thread slave de SQL ficava confusa (porque
ela ainda podia achar que estava em uma transao).
D.3.4. Alteraes na distribuio 4.0.14 (18 Jul 2003)
Funcionalidades adicionadas ou alteradas:
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.
Uma alterao de documentao: Funo INTERVAL(NULL, ...) retorna -1.
Habilitado o INSERT do SELECT quando a tabela na qual os registros so inseridos tambm
uma tabela listada no SELECT.
Permite CREATE TABLE e INSERT de qualquer UNION.
A opo SQL_CALC_FOUND_ROWS agora sempre retorna o nmero total de rgistro de qulquer
UNION.
Removida a opo --table de mysqlbinlog para evitar repetir a funcionalidade mysql-
dump.
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 pa-
ra 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 da documentao: adicionado um pargrafo sobre falhas em replicao (como
usar um slave sobrevivente como um novo master, como resumir a configurao original). See
Seco 4.11.9, FAQ da Replicao.
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 pro-
cesso mysqld. (Obrigado a Christian Hammers por fornecer o patch inicial.) (Bug #627)
Adicionada a opo --read-only para que o mysqld no permita atualizaes, exceto da
thread escrava ou de usurios com o privilgio SUPER. (Pacth original de Markus Benning).
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 come-
lo com a nova opo --gdb. Isto porque alguns usurios MySQL encontraram alguns proble-
Histrico de Alteraes do MySQL
897
mas estranhos quando acidentalmente enviavam SIGINT para a threads mysqld.
RESET SLAVE agora limpa os campos Last_Errno e Last_Error na sada de SHOW
SLAVE STATUS.
Adicionada a varivel max_relay_log_size; o relay log ser rotacionado automaticamente
quando seu tamanho exceder max_relay_log_size. Mas se max_relay_log_size for
0 (o padro), max_binlog_size ser usado (como em verses mais antigas).
max_binlog_size ainda se aplica a logs binrios em qualquer caso de uso.
FLUSH LOGS agora rotaciona os relay logs em adio aos outros tipos de logs que ele j rotaci-
onava.
Bugs corrigidos:
Comparao/ordenao para o conjunto de caracteres latin1_de foi reescrita. O algoritmo
antigo no podia tratar casos como "s" > "a". See Seco 4.7.1.1, German character
set. Em casos raros ela resultava em tabela corrompida.
Corrigido um problema com a prompt de senha no Windows. (Bug #683)
ALTER TABLE ... UNION=(...) para uma tabela MERGE agora permitida mesmo que
alguma tabela MyISAM seja somente leitura. (Bug #702)
Corrigido um problema com CREATE TABLE t1 SELECT x'41'. (Bug #801)
Removido alguns avisos de lock incorretos do log de erro.
Corrigida um estouro de memria ao se fazer REPAIR em uma tabela com uma chave auto in-
cremento multi-partes onde uma parte era um pacote CHAR.
Corrigida uma provvel condio de corrida no cdigo da replicao que podia levar potencial-
mente 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 tabe-
las sem sucesso. Corrigido outro bug, assim ele obtem sucesso quando houver milhares de tabe-
las 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 FULL-
TEXT mesmo se fosse possvel (por exemplo, em SELECT * FROM t1 WHERE MATCH
a,b AGAINST("index") > 0).
Corrigido um bug com ``table is full'' em operaes UNION.
Corrigido um problema de segurana no qual usurios habilitados sem privilgios obtinham in-
formaes na lista de banco de dados existentes usando SHOW TABLES e comandos parecidos.
Corrigido um problema de pilha no UnixWare/OpenUnix.
Corrigido um problema de configurao UnixWare/OpenUNIX e OpenServer.
Corrigido um problema de pilha cheia na verificao da senha.
Corrigido um problema com max_user_connections.
Histrico de Alteraes do MySQL
898
HANDLER sem um ndice agora funciona apropriadamente quando uma tabela tem registros de-
letados. (Bug #787)
Corrigido um erro com LOAD DATA em mysqlbinlog. (Bug #670)
Correo: SET CHARACTER SET DEFAULT fucniona. (Bug #462)
Corrigido o comportamento de tabelas MERGE em consultas ORDER BY ... DESC. (Bug
#515)
Corrigida a falha do servidor em PURGE MASTER LOGS ou SHOW MASTER LOGS quando o
log binrio estava desligado. (Bug #733)
Corrigido o problema de verificao de senha no Windows. (Bug #464)
Corrigido um erro na comparao de uma coluna DATETIME e uma constante inteira. (Bug
#504)
Corrigido o modo remoto de mysqlbinlog. (Bug #672)
Corrigido ERROR 1105: Unknown error que ocorria para algumas consultas SELECT,
onde uma coluna declarada como NOT NULL era comparada com uma expresso que podia to-
mar o valor NULL.
Alterado o timeout em mysql_real_connect() para usar poll() em vez de select()
para contornar problemas cmo muitos outros arquivos abertos no cliente.
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. Es-
te bug est no master, no no slave. (Bug #490)
Corrigido um bug: Quando uma instruo INSERT ... SELECT inseria linhas em uma tabe-
la 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 c-
digos 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 Inicia-
lizao da Replicao. (Bug #491)
SET FOREIGN_KEY_CHECKS=0 no era replicado apropriadamente. A correo provavel-
mente no ser feita para 3.23.
Em um slave, LOAD DATA INFILE sem clusulas IGNORE ou REPLACE no master, era re-
plicada com IGNORE. Enquanto isto no for um problemase os dados do master e slave so
Histrico de Alteraes do MySQL
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)
Quando usado um slave compilado com --debug, CHANGE MASTER TO RE-
LAY_LOG_POS podia causar um falha de declarao da depurao. (Bug #576)
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 automatica-
mente 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 es-
crever 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 MASTER_POS_WAIT() estava espereando e o slave estava inativo, e thread slave de SQL
terminada, MASTER_POS_WAIT() esperaria para sempre. Agora quando a thread slave de
SQL termina, MASTER_POS_WAIT() retorna NULL imediatamente (``slave stopped''). (Bug
#651)
Depois de RESET SLAVE; START SLAVE;, o valor de Relay_Log_Space exibido por
SHOW SLAVE STATUS era muito grande para 4 bytes. (Bug #763)
Se uma consulta era ignorada no slave (devido a replicate-ignore-table e outras re-
gras 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)
D.3.5. Alteraes na distribuio 4.0.13 (16 May 2003)
Funcionalidades adicionadas ou alteradas:
PRIMARY KEY agora implica NOT NULL. (Bug #390)
O pacote de binrios do Windows agora est compilado com --enable-local-infile en-
contrar a configurao de construo do Unix.
Removida a medida do tempo de mysql-test-run. time no aceita todos os parmetros
exigidos em muitas aplicaes (por exemplo, QNX) e a medida de tempo no reamente neces-
sria (isto no um benchmark).
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 myi-
sam_repair_threads para habilit-lo. See Seco 4.6.8.4, SHOW VARIABLES.
Histrico de Alteraes do MySQL
900
Adicionada a varivel innodb_max_dirty_pages_pct que controla a quantidade de pgi-
nas ``sujas'' permitidas na rea de buffer do InnoDB.
As mensagens de erro CURRENT_USER() e Access denied agora relatam o nome de m-
quina exatamente como ele est especificado no comando GRANT.
Removido os resultados de benchmark das distribuies fonte e binrias. Eles ainda esto dispo-
nveis na rvore fonte do BK.
Tabelas InnoDB agora suportam ANALYZE TABLE.
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 caracte-
res onde conveniente colocar a string como um item binrio. Depois destas alteraes voc de-
ve 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)
Habilitado delayed_insert_timeout no Linux (as bibliotecas glibc mais modernas tem
um pthread_cond_timedwait corrigido). (Bug #211)
No cria mais threads de insert delayed que o dado por max_insert_delayed_threads.
(Bug #211)
Alterado o UPDATE ... LIMIT para aplicar o limite as linhas encontradas, independente de
terem sido alteradas. Anteriormente o limite era aplicado como uma restrio no nmero de li-
nhas alteradas.
Ajustado o otimizador para favorecer indces em cluster em ver de busca na tabela.
BIT_AND() e BIT_OR() agora retornam um valor de 64 bits sem sinal.
Adicionado avisos ao log de erro do porqu de um falha em uma conexo segura (quando execu-
tando com --log-warnings).
As opes --skip-symlink e --use-symbolic-links esto obsoletas e forma substi-
tudas com --symbolic-links.
A opo padro para innodb_flush_log_at_trx_commit foi alterada de 0 para 1 para
tornar tabelas InnoDB como ACID por padro. See Seco 7.5.3, Opes de Inicializao do
InnoDB.
Adicionado o recurso para SHOW KEYS para mostrar chaves que esto disabilitadas pelo co-
mando 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.
Adicionado MEMORY como um alias para HEAP.
Renomeada a funo rnd para my_rnd j que o nome era muito genrico e um smbolo ex-
portado no libmysqlclient (obrigado a Dennis Haney pelo patch inicial).
Correo de portabilidade: renomeado include/dbug.h para include/my_debug.h.
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, ou-
tros podia sofrer com ele. Agora deve perguntar explicitamente pela sua deleo com a nova op-
o --delete-master-logs.
Se o slave configurado (usando, por exemplo, replicate-
Histrico de Alteraes do MySQL
901
wild-ignore-table=mysql.%) para ecluir mysql.user, mysql.host, mysql.db,
mysql.tables_priv e mysql.columns_priv da replicao, ento GRANT e REVOKE
no sero replicados.
Bugs corrigidos:
A mensagem de erro Access denied ao logar tinha um valor Using password incorreto.
(Bug #398)
Corrigido um bug com NATURAL LEFT JOIN, NATURAL RIGHT JOIN e RIGHT JOIN
quando usadas muitas tabelas em joins. O problema era que o mtodo JOIN no era sempre as-
socioado 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 as-
pas invertidas.
Corrigido Unknown error ao usar UPDATE ... LIMIT. (Bug #373)
Corrigido o problema com o modo ANSI e GROUP BY com constantes. (Bug #387)
Corrigido o erro com UNION e OUTER JOIN. (Bug #386)
Corrigido o erro se usado um UPDATE multi-tabelas e a consulta exige um tabela temporria
maior que tmp_table_size. (Bug #286)
Executa mysql_install_db com a opo -IN-RPM para a instalao do Mac OS X no fa-
lhar 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)
Corrigido um bug de core dump ao usar FORMAT('nan',#). (Bug #284)
Corrigido um erro na resoluo do nome com HAVING ... COUNT(DISTINCT ...).
Corrigido resultados incorretos da operao de truncamento (*) em MATCH ... AGAINST()
em alguns joins complexos.
Fixed a crash in REPAIR ... USE_FRM command, when used on read-only, nonexisting ta-
ble 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 intro-
duced in 4.0)
Fixed some serious bugs in UPDATE ... ORDER BY. (Bug #241)
Histrico de Alteraes do MySQL
902
Fixed unlikely problem in optimising WHERE clause with constant expression like in WHERE 1
AND (a=1 AND b=1).
Fixed that SET SQL_BIG_SELECTS=1 works again.
Introduced proper backtick quoting for db.table in SHOW GRANTS.
FULLTEXT index stopped working after ALTER TABLE that converts TEXT column to CHAR.
(Bug #283)
Fixed a security problem with SELECT and wildcarded select list, when user only had partial
column SELECT privileges on the table.
Mark a MyISAM table as "analyzed" only when all the keys are indeed analyzed.
Only ignore world-writeable my.cnf files that are regular files (and not, for example, named
pipes or character devices).
Fixed few smaller issues with SET PASSWORD.
Fixed error message which contained deprecated text.
Fixed a bug with two NATURAL JOINs in the query.
SUM() 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.
Added missing dashes to parameter --open-files-limit in mysqld_safe. (Bug #264)
Fixed incorrect hostname for TCP/IP connections displayed in SHOW PROCESSLIST.
Fixed a bug with NAN in FORMAT(...) function ...
Fixed a bug with improperly cached database privileges.
Fixed a bug in ALTER TABLE ENABLE / DISABLE KEYS which failed to force a refresh
of table data in the cache.
Fixed bugs in replication of LOAD DATA INFILE for custom parameters (ENCLOSED, TER-
MINATED 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 co-
lumns and at least one BLOB/TEXT column. Bug was caused by incorrect calculation of the ne-
eded 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 setting SQL_BIG_SELECTS option.
Fixed a bug in SHOW PROCESSLIST which only displayed a localhost in the "Host" column.
Histrico de Alteraes do MySQL
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)
Allow optimization of multiple-table update for InnoDB tables as well.
Fixed a bug in multiple-table updates that caused some rows to be updated several times.
Fixed a bug in mysqldump when it was called with --master-data: the CHANGE MAS-
TER 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 seg-
fault on the slave. (Bug #178). USER() is still badly replicated on the slave (it is replicated to
"").
D.3.6. Alteraes na distribuio 4.0.12 (15 Mar 2003:
Production)
Functionality added or changed:
mysqld no longer reads options from world-writeable config files.
Integer values between 9223372036854775807 and 9999999999999999999 are now regarded as
unsigned longlongs, not as floats. This makes these values work similar to values between
10000000000000000000 and 18446744073709551615.
SHOW PROCESSLIST will now include the client TCP port after the hostname to make it easi-
er to know from which client the request originated.
Bugs fixed:
Fixed mysqld crash on extremely small values of sort_buffer variable.
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 mysql-
binlog or replication. The master must be upgraded, not the slave. (Bug #136)
Fixed checking of random part of WHERE clause. (Bug #142)
Fixed a bug with multiple-table updates with InnoDB tables. This bug occurred as, in many ca-
ses, InnoDB tables cannot be updated ``on the fly,'' but offsets to the records have to be stored
in a temporary table.
Added missing file mysql_secure_installation to the server RPM subpackage.
(Bug #141)
Fixed MySQL (and myisamchk) crash on artificially corrupted .MYI files.
Don't allow BACKUP TABLE to overwrite existing files.
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
Histrico de Alteraes do MySQL
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 VALU-
ES(RAND()). In replication this worked ok.
SET SQL_LOG_BIN=0 was ignored for INSERT DELAYED queries. (Bug #104)
SHOW SLAVE STATUS reported too old positions (columns Relay_Master_Log_File
and Exec_Master_Log_Pos) for the last executed statement from the master, if this state-
ment was the COMMIT of a transaction. The master must be upgraded for that, not the slave.
(Bug #52)
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 query cache invalidation on LOAD DATA.
Fixed memory leak on ANALYZE procedure with error.
Fixed a bug in handling CHAR(0) columns that could cause incorrect results from the query.
Fixed rare bug with incorrect initialisation of AUTO_INCREMENT column, as a secondary co-
lumn 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 a portability bug with pthread_attr_getstacksize on HP-UX 10.20 (Patch was
also included in 4.0.11a sources).
Fixed the bigint test to not fail on some platforms (for example, HP-UX and Tru64) due to
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).
D.3.7. Alteraes na distribuio 4.0.11 (20 Feb 2003)
Functionality added or changed:
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.
Histrico de Alteraes do MySQL
905
Added OLD_PASSWORD() as a synonym for PASSWORD().
Allow keyword ALL in group functions.
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 problem with multiple-table delete and InnoDB tables.
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 mis-
sing after the renaming of the server subpackage).
Fixed that table locks are not released with multi-table updates and deletes with InnoDB storage
engine.
Fixed bug in updating BLOB columns with long strings.
Fixed integer-wraparound when giving big integer (>= 10 digits) to function that requires an un-
signed argument, like CREATE TABLE (...) AUTO_INCREMENT=#.
MIN(key_column) could in some cases return NULL on a column with NULL and other valu-
es.
MIN(key_column) and MAX(key_column) could in some cases return incorrect values
when used in OUTER JOIN.
MIN(key_column) and MAX(key_column) could return incorrect values if one of the ta-
bles was empty.
Fixed rare crash in compressed MyISAM tables with blobs.
Fixed bug in using aggregate functions as argument for INTERVAL, CASE, FIELD, CON-
CAT_WS, ELT and MAKE_SET functions.
When running with --lower-case-table-names (default on Windows) and you had ta-
bles or databases with mixed case on disk, then executing SHOW TABLE STATUS followed
with DROP DATABASE or DROP TABLE could fail with Errcode 13.
D.3.8. Alteraes na distribuio 4.0.10 (29 Jan 2003)
Functionality added or changed:
Added option --log-error[=file_name] to mysqld_safe and mysqld. This option
will force all error messages to be put in a log file if the option --console is not given. On
Windows --log-error is enabled as default, with a default name of host_name.err if
the name is not specified.
Changed some things from Warning: to Note: in the log files.
The mysqld server should now compile on NetWare.
Added optimization that if one does GROUP BY ... ORDER BY NULL then result is not
sorted.
Histrico de Alteraes do MySQL
906
New --ft-stopword-file command-line option for mysqld to replace/disable the built-
in 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 gethostb-
yaddr() 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 replica-
te_wild_ignore_table=db.%, these rules will be applied to CREATE/DROP DATABA-
SE too.
Added timeout value for MASTER_POS_WAIT().
Bugs fixed:
Fixed initialisation of the random seed for newly created threads to give a better rand() distri-
bution from the first call.
Fixed a bug that caused mysqld to hang when a table was opened with the HANDLER com-
mand 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 cons-
tant_expression.
Fixed a table corruption in myisamchk's parallel repair mode.
Fixed bug in query cache invalidation on simple table renaming.
Fixed bug in mysqladmin --relative.
On some 64 bit systems, show status reported a strange number for Open_files and
Open_streams.
Fixed incorrect number of columns in EXPLAIN on empty table.
Fixed bug in LEFT JOIN that caused zero rows to be returned in the case the WHERE condition
was evaluated as FALSE after reading const tables. (Unlikely condition).
FLUSH PRIVILEGES didn't correctly flush table/column privileges when
mysql.tables_priv is empty.
Fixed bug in replication when using LOAD DATA INFILE one a file that updated an AU-
TO_INCREMENT column with NULL or 0. This bug only affected MySQL 4.0 masters (not sla-
ves 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 af-
fected 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.
Histrico de Alteraes do MySQL
907
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 er-
ror the binary log was corrupted.
D.3.9. Alteraes na distribuio 4.0.9 (09 Jan 2003)
Functionality added or changed:
OPTIMIZE TABLE will for MyISAM tables treat all NULL values as different when calcula-
ting 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 resol-
ved. This is now fixed.
Fixed crash when replication big LOAD DATA INFILE statement that caused log rotation.
D.3.10. Alteraes na distribuio 4.0.8 (07 Jan 2003)
Functionality added or changed:
Default max_packet_length for libmysqld.c is now 1024*1024*1024.
One can now specify max_allowed_packet in a file ready by
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 improve-
ment.
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:
Fixed bug in ALTER TABLE with BDB tables.
Histrico de Alteraes do MySQL
908
Fixed core dump bug in QUOTE() function.
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 when sending blobs longer than 16M to client.
Fixed bug in GROUP BY when used on BLOB column with NULL values.
Fixed a bug in handling NULL values in CASE ... WHEN ...
D.3.11. Alteraes na distribuio 4.0.7 (20 Dec 2002)
Functionality added or changed:
mysqlbug now also reports the compiler version used for building the binaries (if the compiler
supports the option --version).
Bugs fixed:
Fixed compilation problems on OpenUnix and HPUX 10.20.
Fixed some optimization problems when compiling MySQL with -DBIG_TABLES on a 32 bit
system.
mysql_drop_db() didn't check permissions properly so anyone could drop another users da-
tabase. DROP DATABASE is checked properly.
D.3.12. Alteraes na distribuio 4.0.6 (14 Dec 2002:
Gamma)
Functionality added or changed:
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 replicati-
on 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).
Moved the mysql.server startup script in the RPM packages from /
etc/rc.d/init.d/mysql to /etc/init.d/mysql (which almost all current Linux dis-
tributions support for LSB compliance).
Added Qcache_lowmem_prunes status variable (number of queries that were deleted from
cache because of low memory).
Fixed mysqlcheck so it can deal with table names containing dashes.
Histrico de Alteraes do MySQL
909
Bulk insert optimization (see Seco 4.6.8.4, SHOW VARIABLES) is no longer used when in-
serting small (less than 100) number of rows.
Optimization added for queries like SELECT ... FROM merge_table WHERE inde-
xed_column=constant_expr.
Added functions LOCALTIME and LOCALTIMESTAMP as synonyms for NOW().
CEIL is now an alias for CEILING.
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 CAST(... as CHAR).
Added PostgreSQL compatible LIMIT syntax: SELECT ... LIMIT row_count OFF-
SET 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:
Fixed number of found rows returned in multi table updates
Make --lower-case-table-names default on Mac OS X as the default file system
(HFS+) is case insensitive. See Seco 6.1.3, Caso Sensitivo nos Nomes.
Transactions in AUTOCOMMIT=0 mode didn't rotate binary log.
A fix for the bug in a SELECT with joined tables with ORDER BY and LIMIT clause when file-
sort 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 re-
commended to upgrade to version 4.0.6.
Fixed bug that prevented --chroot command-line option of mysqld from working.
Fixed bug in phrase operator "..." in boolean full-text search.
Fixed bug that caused OPTIMIZE TABLE to corrupt the table under some rare circumstances.
Part rewrite of multi-table-update to optimise it, make it safer and more bug free.
LOCK TABLES now works together with multi-table-update and multi-table-delete.
--replicate-do=xxx didn't work for UPDATE commands. (Bug introduced in 4.0.0)
Fixed shutdown problem on Mac OS X.
Histrico de Alteraes do MySQL
910
Major InnoDB bugs in REPLACE, AUTO_INCREMENT, INSERT INTO ... SELECT
... were fixed. See the InnoDB changelog in the InnoDB section of the manual.
RESET SLAVE caused a crash if the slave threads were running.
D.3.13. Alteraes na distribuio 4.0.5 (13 Nov 2002)
Functionality added or changed:
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 va-
riables 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 struc-
ture 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.
Added support for reading of MySQL 4.1 table definition files.
BETWEEN behaviour changed (see Seco 6.3.1.2, Operadores de Comparao). Now date-
time_col BETWEEN timestamp AND timestamp should work as expected.
One can create TEMPORARY MERGE tables now.
DELETE FROM myisam_table now shrinks not only the .MYD 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.
Removed variable safe_show_database as it was no longer used.
Updated source tree to be built using automake 1.5 and libtool 1.4.
Fixed an inadvertently changed option (--ignore-space) back to the original -
-ignore-spaces in mysqlclient. (Both syntaxes will work).
Don't require UPDATE privilege when using REPLACE.
Added support for DROP TEMPORARY TABLE ..., to be used to make replication safer.
When transactions are enabled, all commands that update temporary tables inside a BEGIN/
COMMIT are now stored in the binary log on COMMIT and not stored if one does ROLLBACK.
This fixes some problems with non-transactional temporary tables used inside transactions.
Histrico de Alteraes do MySQL
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.
Corrected test for root user in mysqld_safe.
Fixed error message issued when storage engine cannot do CHECK or REPAIR.
Fixed rare core dump problem in complicated GROUP BY queries that 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 query cache behaviour with BDB transactions.
Fixed possible floating point exception in MATCH relevance calculations.
Fixed bug in full-text search IN BOOLEAN MODE that made MATCH to return incorrect rele-
vance 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 que-
ries since 4.0.2.
Small code improvement in multi-table updates.
Fixed a newly introduced bug that caused ORDER BY ... LIMIT row_count to not re-
turn all rows.
Fixed a bug in multi-table deletes when outer join is used on an empty table, which gets first to
be deleted.
Fixed a bug in multi-table updates when a single table is updated.
Histrico de Alteraes do MySQL
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 ca-
ched in the query cache.
Small fix in mysqld_safe for some shells.
Give error if a MyISAM MERGE table has more than 2 ^ 32 rows and MySQL was not compiled
with -DBIG_TABLES.
Fixed some ORDER BY ... DESC problems with InnoDB tables.
D.3.14. Alteraes na distribuio 4.0.4 (29 Sep 2002)
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'.
Fixed bug in myisamchk -R mode.
Fixed bug that caused mysqld to crash on REVOKE.
Fixed bug in ORDER BY when there is a constant in the SELECT statement.
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).
Increased max possible max_allowed_packet in mysqld to 1 GB.
Fixed bug when doing a multi-line INSERT on a table with an AUTO_INCREMENT key which
was not in the first part of the key.
Changed LOAD DATA INFILE to not recreate index if the table had rows from before.
Fixed overrun bug when calling AES_DECRYPT() with incorrect arguments.
--skip-ssl can now be used to disable SSL in the MySQL clients, even if one is using other
SSL options in an option 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.
In SHOW TABLE ... STATUS, compressed tables sometimes showed up as dynamic.
SELECT @@[global|session].var_name didn't report global | session in the
result column name.
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 ta-
Histrico de Alteraes do MySQL
913
ble, referenced by a UNIQUE key) appeared in ORDER BY part of SELECT DISTINCT.
--log-binary=a.b.c now properly strips off .b.c.
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.
AND is now optional between REQUIRE options.
REQUIRE option was not properly saved, which could cause strange output in SHOW GRANTS.
Fixed that mysqld --help reports correct values for --datadir and --bind-address.
Fixed that one can drop UDFs that 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-ta-
ble-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 que-
ries of type CREATE TABLE table_name SELECT expression(),...
Fixed bug in queries of type SELECT * FROM table-list GROUP BY ... and SE-
LECT DISTINCT * FROM ....
Fixed bug with the --slow-log when logging an administrator command (like FLUSH TA-
BLES).
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 opti-
ons.
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.
D.3.15. Alteraes na distribuio 4.0.3 (26 Aug 2002:
Beta)
Fixed problem with types of user variables. (Bug #551)
Fixed problem with configure ... --localstatedir=....
Cleaned up mysql.server script.
Fixed a bug in mysqladmin shutdown when pid file was modified while mysqladmin
Histrico de Alteraes do MySQL
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 lo-
wer-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.
Don't update MyISAM index file on update if not strictly necessary.
Fixed bug in SELECT DISTINCT ... FROM many_tables ORDER BY not-
used-column.
Fixed a bug with BIGINT values and quoted strings.
Added QUOTE() function that performs SQL quoting to produce values that can be used as data
values in queries.
Changed variable DELAY_KEY_WRITE to an enum to allow one set DELAY_KEY_WRITE for
all tables without taking down the server.
Changed behaviour of IF(condition,column,NULL) so that it returns the value of the
column type.
Made safe_mysqld a symlink to mysqld_safe in binary distribution.
Fixed security bug when having an empty database name in the user.db table.
Fixed some problems with CREATE TABLE ... SELECT function().
mysqld now has the option --temp-pool enabled by default as this gives better performan-
ce 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.
Fixed bug in query cache after temporary table creation.
Added --count=N (-c) option to mysqladmin, to make the program do only N iterations.
To be used with --sleep (-i). Useful in scripts.
Fixed bug in multi-table UPDATE: when updating a table, do_select() became confused
about reading records from a cache.
Fixed bug in multi-table UPDATE when several fields were referenced from a single table
Fixed bug in truncating nonexisting table.
Fixed bug in REVOKE that caused user resources to be randomly set.
Histrico de Alteraes do MySQL
915
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 two bugs in SELECT DISTINCT with large tables.
Fixed bug in query cache initialisation with very small query cache size.
Allow DEFAULT with INSERT statement.
The startup parameters myisam_max_sort_file_size and myi-
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 core dump bug with INSERT ... SET db_name.table_name.colname=''.
Fixed client hangup bug when using some SQL commands with incorrect syntax.
Fixed a timing bug in DROP DATABASE
New SET [GLOBAL | SESSION] syntax to change thread-specific and global server varia-
bles at runtime.
Added variable slave_compressed_protocol.
Renamed variable query_cache_startup_type to query_cache_type, myi-
sam_bulk_insert_tree_size to bulk_insert_buffer_size, record_buffer
to read_buffer_size and record_rnd_buffer to read_rnd_buffer_size.
Renamed some SQL variables, but old names will still work until 5.0. See Seco 2.5.2,
Atualizando da Verso 3.23 para 4.0.
Renamed --skip-locking to --skip-external-locking.
Removed unused variable query_buffer_size.
Fixed a bug that made the pager option in the mysql client non-functional.
Added full AUTO_INCREMENT support to MERGE tables.
Extended LOG() function to accept an optional arbitrary base parameter. See Seco 6.3.3.2,
Funes Matematicas.
Added LOG2() function (useful for finding out how many bits a number would require for sto-
rage).
Added LN() natural logarithm function for compatibility with other databases. It is synonymous
with LOG(X).
D.3.16. Alteraes na distribuio 4.0.2 (01 Jul 2002)
Cleaned up NULL handling for default values in DESCRIBE table_name.
Fixed truncate() to round up negative values to the nearest integer.
Changed --chroot=path option to execute chroot() immediately after all options have
been parsed.
Don't allow database names that contain '\'.
Histrico de Alteraes do MySQL
916
lower_case_table_names now also affects database names.
Added XOR operator (logical and bitwise XOR) with ^ as a synonym for bitwise XOR.
Added function IS_FREE_LOCK("lock_name"). Based on code contributed by Hartmut
Holzgraefe <hartmut@six.de>.
Removed mysql_ssl_clear() from C API, as it was not needed.
DECIMAL and NUMERIC types can now read exponential numbers.
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.
Added AES_ENCRYPT() and AES_DECRYPT() functions to perform encryption according to
AES standard (Rijndael). See Seco 6.3.6.2, Funes Diversas.
Added --single-transaction option to mysqldump, allowing a consistent dump of
InnoDB tables. See Seco 4.9.7, mysqldump, Descarregando a Estrutura de Tabelas e Da-
dos.
Fixed bug in innodb_log_group_home_dir in SHOW VARIABLES.
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, REPLICA-
TION CLIENT, REPLICATION SLAVE, SHOW DATABASES and SUPER. To use these, you
must have run the mysql_fix_privilege_tables script after upgrading.
Fixed query cache align data bug.
Fixed mutex bug in replication when reading from master fails.
Added missing mutex in TRUNCATE TABLE; This fixes some core dump/hangup problems
when using TRUNCATE TABLE.
Fixed bug in multiple-table DELETE when optimiser uses only indexes.
Fixed that ALTER TABLE table_name RENAME new_table_name is as fast as RENA-
ME TABLE.
Fixed bug in GROUP BY with two or more fields, where at least one field can contain NULL va-
lues.
Use Turbo Boyer-Moore algorithm to speed up LIKE "%keyword%" searches.
Fixed bug in DROP DATABASE with symlink.
Fixed crash in REPAIR ... USE_FRM.
Fixed bug in EXPLAIN with LIMIT offset != 0.
Fixed bug in phrase operator "..." in boolean full-text search.
Fixed bug that caused duplicated rows when using truncation operator * in boolean full-text se-
arch.
Histrico de Alteraes do MySQL
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.
Query cache is now automatically disabled in mysqldump.
Fixed problem on Windows 98 that made sending of results very slow.
Boolean full-text search weighting scheme changed to something more reasonable.
Fixed bug in boolean full-text search that caused MySQL to ignore queries of
ft_min_word_len characters.
Boolean full-text search now supports ``phrase searches''.
New configure option --without-query-cache.
Memory allocation strategy for ``root memory'' changed. Block size now grows with number of
allocated blocks.
INET_NTOA() now returns NULL if you give it an argument that is too large (greater than the
value corresponding to 255.255.255.255).
Fix SQL_CALC_FOUND_ROWS to work with UNIONs. It will work only if the first SELECT
has this option and if there is global LIMIT for the entire statement. For the moment, this requi-
res using parentheses for individual SELECT queries within the statement.
Fixed bug in SQL_CALC_FOUND_ROWS and LIMIT.
Don't give an error for CREATE TABLE ...(... VARCHAR(0)).
Fixed SIGINT and SIGQUIT problems in mysql.cc on Linux with some glibc versions.
Fixed bug in convert.cc, which is caused by having an incorrect net_store_length()
linked in the CONVERT::store() method.
DOUBLE and FLOAT columns now honor the UNSIGNED 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.
InnoDB tables can now be set to automatically grow in size (autoextend).
Added --ignore-lines=n option to mysqlimport. This has the same effect as the IG-
NORE n LINES clause for LOAD DATA.
Fixed bug in UNION with last offset being transposed to total result set.
REPAIR ... USE_FRM added.
Fixed that DEFAULT_SELECT_LIMIT is always imposed on UNION result set.
Fixed that some SELECT options can appear only in the first SELECT.
Fixed bug with LIMIT with UNION, where last select is in the braces.
Fixed that full-text works fine with UNION operations.
Fixed bug with indexless boolean full-text search.
Histrico de Alteraes do MySQL
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.
Fixed bug in WHERE key_name='constant' ORDER BY key_name DESC.
Fixed bug in SELECT DISTINCT ... ORDER BY DESC optimization.
Fixed bug in ... HAVING 'GROUP_FUNCTION'(xxx) IS [NOT] NULL.
Fixed bug in truncation operator for boolean full-text search.
Allow value of --user=# option for mysqld to be 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 that SELECT 0 LIMIT 0 doesn't hang thread.
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 co-
vers the whole row.
Optimized InnoDB sort-buffer handling to take less memory.
Fixed bug in multi-table DELETE and InnoDB tables.
Fixed problem with TRUNCATE and InnoDB tables that produced the error 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 sub-
traction. (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 MyI-
SAM index file.
Changed to use autoconf 2.52 (from autoconf 2.13).
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.
First pre-version of multi-table UPDATE statement.
Fixed bug in multi-table DELETE.
Fixed bug in SELECT CONCAT(argument_list) ... GROUP BY 1.
INSERT ... SELECT did a full rollback in case of an error. Fixed so that we only roll back
the last statement in the current transaction.
Histrico de Alteraes do MySQL
919
Fixed bug with empty expression for boolean full-text search.
Fixed core dump bug in updating full-text key from/to NULL.
ODBC compatibility: Added BIT_LENGTH() function.
Fixed core dump bug in GROUP BY BINARY column.
Added support for NULL keys in HEAP tables.
Use index for ORDER BY in queries of type: SELECT * FROM t WHERE key_part1=1
ORDER BY key_part1 DESC,key_part2 DESC
Fixed bug in FLUSH QUERY CACHE.
Added CAST() and CONVERT() functions. The CAST and CONVERT functions are nearly
identical and mainly useful when you want to create a column with a 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 ty-
pe.
Changed order in which keys are created in tables.
Added new columns Null and Index_type to SHOW INDEX output.
Added --no-beep and --prompt options to mysql command-line client.
New feature: management of user resources.
GRANT ... WITH MAX_QUERIES_PER_HOUR N1
MAX_UPDATES_PER_HOUR N2
MAX_CONNECTIONS_PER_HOUR N3;
See Seco 4.4.7, Limitando os Recursos dos Usurios.
Added mysql_secure_installation to the scripts/ directory.
D.3.17. Alteraes na distribuio 4.0.1 (23 Dec 2001)
Added system command to mysql.
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.
Added mysql_fix_extensions script.
Fixed stack overrun problem with LOAD DATA FROM MASTER on OSF/1.
Fixed shutdown problem on HP-UX.
Added DES_ENCRYPT() and DES_DECRYPT() functions.
Added FLUSH DES_KEY_FILE statement.
Added --des-key-file option to mysqld.
HEX(string) now returns the characters in string converted to hexadecimal.
Fixed problem with GRANT when using lower_case_table_names=1.
Histrico de Alteraes do MySQL
920
Changed SELECT ... IN SHARE MODE to SELECT ... LOCK IN SHARE MODE (as
in MySQL 3.23).
A new query cache to cache results from identical SELECT queries.
Fixed core dump bug on 64-bit machines when it got an incorrect communication packet.
MATCH ... AGAINST(... IN BOOLEAN MODE) can now work without FULLTEXT in-
dex.
Fixed slave to replicate from 3.23 master.
Miscellaneous replication fixes/cleanup.
Got shutdown to work on Mac OS X.
Added myisam/ft_dump utility for low-level inspection of FULLTEXT indexes.
Fixed bug in DELETE ... WHERE ... MATCH ....
Added support for MATCH ... AGAINST(... IN BOOLEAN MODE). Note: you must re-
build your tables with ALTER TABLE tablename TYPE=MyISAM to be able to use boole-
an full-text search.
LOCATE() and INSTR() are now case-sensitive if either argument is a binary string.
Changed RAND() initialisation so that RAND(N) and RAND(N+1) are more distinct.
Fixed core dump bug in UPDATE ... ORDER BY.
In 3.23, INSERT INTO ... SELECT always had IGNORE enabled. Now MySQL will stop
(and possibly roll back) by default in case of an error unless you specify IGNORE.
Ignore DATA DIRECTORY and INDEX DIRECTORY directives on Windows.
Added boolean full-text search code. It should be considered early alpha.
Extended MODIFY and CHANGE in ALTER TABLE to accept the FIRST and AFTER key-
words.
Indexes are now used with ORDER BY on a whole InnoDB table.
D.3.18. Alteraes na distribuio 4.0.0 (Oct 2001:
Alpha)
Added --xml option to mysql for producing XML output.
Added full-text variables ft_min_word_len, ft_max_word_len, and
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.
Removed all Gemini hooks from MySQL server.
Removed my_thread_init() and my_thread_end() from mysql_com.h, and added
mysql_thread_init() and mysql_thread_end() to mysql.h.
Support for communication packets > 16M. In 4.0.1 we will extend MyISAM to be able to hand-
le these.
Histrico de Alteraes do MySQL
921
Secure connections (with SSL).
Unsigned BIGINT constants now work. MIN() and MAX() now handle signed and unsigned
BIGINT numbers correctly.
New character set latin1_de which provides correct German sorting.
STRCMP() now uses the current character set when doing comparisons, which means that the
default comparison behaviour now is case-insensitive.
TRUNCATE TABLE and DELETE FROM tbl_name are now separate functions. One bonus
is that DELETE FROM tbl_name now returns the number of deleted rows, rather than zero.
DROP DATABASE now executes a DROP TABLE on all tables in the database, which fixes a
problem with InnoDB tables.
Added support for UNION.
Added support for multi-table DELETE operations.
A new HANDLER interface to MyISAM tables.
Added support for INSERT on MERGE tables. Patch from Benjamin Pflugmann.
Changed WEEK(date,0) to match the calendar in the USA.
COUNT(DISTINCT) is about 30% faster.
Speed up all internal list handling.
Speed up IS NULL, ISNULL() and some other internal primitives.
Full-text index creation now is much faster.
Tree-like cache to speed up bulk inserts and myisam_bulk_insert_tree_size variable.
Searching on packed (CHAR/VARCHAR) keys is now much faster.
Optimized queries of type: SELECT DISTINCT * from tbl_name ORDER by
key_part1 LIMIT row_count.
SHOW CREATE TABLE now shows all table attributes.
ORDER BY ... DESC can now use keys.
LOAD DATA FROM MASTER ``automatically'' sets up a slave.
Renamed safe_mysqld to mysqld_safe to make this name more in line with other
MySQL scripts/commands.
Added support for symbolic links to MyISAM tables. Symlink handling is now enabled by de-
fault for Windows.
Added SQL_CALC_FOUND_ROWS and FOUND_ROWS(). This makes it possible to know how
many rows a query would have returned without a LIMIT clause.
Changed output format of SHOW OPEN TABLES.
Allow SELECT expression LIMIT ....
Added ORDER BY syntax to UPDATE and DELETE.
SHOW INDEXES is now a synonym for SHOW INDEX.
Histrico de Alteraes do MySQL
922
Added ALTER TABLE tbl_name DISABLE KEYS and ALTER TABLE tbl_name
ENABLE KEYS commands.
Allow use of IN as a synonym for FROM in SHOW commands.
Implemented ``repair by sort'' for FULLTEXT indexes. REPAIR TABLE, ALTER TABLE, and
OPTIMIZE TABLE for tables with FULLTEXT indexes are now up to 100 times faster.
Allow SQL-99 syntax X'hexadecimal-number'.
Cleaned up global lock handling for FLUSH TABLES WITH READ LOCK.
Fixed problem with DATETIME = constant in WHERE optimization.
Added --master-data and --no-autocommit options to mysqldump. (Thanks to Brian
Aker for this.)
Added script mysql_explain_log.sh to distribution. (Thanks to mobile.de).
D.4. Alteraes na distribuio 3.23.x
(Recent; still supported)
Please note that since release 4.0 is now production level, only critical fixes are done in the 3.23 re-
lease series. You are recommended to upgrade when possible, to take advantage of all speed and fe-
ature 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.
Note that only MyISAM is available in the standard binary distribution.
The 3.23 release also includes support for database replication between a master and many slaves,
full-text indexing, and much more.
All new features are being developed in the 4.x version. Only bug fixes and minor enhancements to
existing features will be added to 3.23.
The replication code and BerkeleyDB code is still not as tested and as the rest of the code, so we
will probably need to do a couple of future releases of 3.23 with small fixes for this part of the code.
As long as you don't use these features, you should be quite safe with MySQL 3.23!
Note that the above doesn't mean that replication or Berkeley DB don't work. We have done a lot of
testing of all code, including replication and BDB without finding any problems. It only means that
not as many users use this code as the rest of the code and because of this we are not yet 100% con-
fident in this code.
Histrico de Alteraes do MySQL
923
D.4.1. Alteraes na distribuio 3.23.59 (not released
yet)
If a query was ignored on the slave (because of replicate-ignore-table and other simi-
lar rules), the slave still checked if the query got the same error code (0, no error) as on the mas-
ter. 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)
D.4.2. Alteraes na distribuio 3.23.58 (11 Sep 2003)
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 as-
sures 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 ISAM bug in MAX() optimization.
Fixed Unknown error when doing ORDER BY on reference table which was used with
NULL value on NOT NULL column. (Bug #479)
D.4.3. Alteraes na distribuio 3.23.57 (06 Jun 2003)
Fixed problem in alarm handling that could cause problems when getting a packet that is too lar-
ge.
Fixed problem when installing MySQL as a service on Windows when one gave 2 arguments
(option file group name and service name) to mysqld.
Histrico de Alteraes do MySQL
924
Fixed kill pid-of-mysqld to work on Mac OS X.
SHOW TABLE STATUS displayed incorrect Row_format value for tables that have been
compressed with myisampack. (Bug #427)
SHOW VARIABLES LIKE 'innodb_data_file_path' displayed only the name of the
first datafile. (Bug #468)
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 WHE-
RE 1 AND (a=1 AND b=1).
Fixed problem on IA-64 with timestamps that caused mysqlbinlog to fail.
The default option for innodb_flush_log_at_trx_commit was changed from 0 to 1 to
make InnoDB tables ACID by default. See Seco 7.5.3, Opes de Inicializao do InnoDB.
Fixed problem with too many allocated alarms on slave when connecting to master many times
(normally not a very critical error).
Fixed a bug in replication of temporary tables. (Bug #183)
Fixed 64 bit bug that affected at least AMD hammer systems.
Fixed a bug when doing LOAD DATA INFILE IGNORE: When reading the binary log,
mysqlbinlog and the replication code read REPLACE instead of IGNORE. This could make
the 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 co-
lumns and at least one BLOB/TEXT column. Bug was caused by incorrect calculation of the ne-
eded buffer to pack data.
The binary log was not locked during TRUNCATE table_name or DELETE FROM ta-
ble_name statements, which could cause an INSERT to table_name to be written to the log
before the TRUNCATE or DELETE statements.
Fixed rare bug in UPDATE of InnoDB tables where one row could be updated multiple times.
Produce an error for empty table and column names.
Changed PROCEDURE ANALYSE() to report DATE instead of NEWDATE.
Changed PROCEDURE ANALYSE(#) to restrict the number of values in an ENUM column to #
also for string values.
mysqldump no longer silently deletes the binary logs when invoked with the -
-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 coordi-
nates. (Bug #159)
D.4.4. Alteraes na distribuio 3.23.56 (13 Mar 2003)
Histrico de Alteraes do MySQL
925
Fixed mysqld crash on extremely small values of sort_buffer variable.
Fixed a bug in privilege system for GRANT UPDATE on column level.
Fixed a rare bug when using a date in HAVING with GROUP BY.
Fixed checking of random part of WHERE clause. (Bug #142)
Fixed MySQL (and myisamchk) crash on artificially corrupted .MYI files.
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)
Security enhancement: Don't allow BACKUP TABLE to overwrite existing files.
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 decla-
ration 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 in MAX() optimization in MERGE tables.
Better RAND() initialisation for new connections.
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 dateti-
me2 IS NULL.
Fixed bug in using aggregate functions as argument for INTERVAL, CASE, FIELD, CON-
CAT_WS, ELT and MAKE_SET functions.
When running with --lower-case-table-names (default on Windows) and you had ta-
bles 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().
Fixed bug in mysqladmin --relative.
On some 64 bit systems, show status reported a strange number for Open_files and
Open_streams.
Histrico de Alteraes do MySQL
926
D.4.5. Alteraes na distribuio 3.23.55 (23 Jan 2003)
Fixed double free'd pointer bug in mysql_change_user() handling, that enabled a speci-
ally hacked version of MySQL client to crash mysqld. Note, that one needs to login to the ser-
ver 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 TA-
BLES).
Fixed bug in GROUP BY when used on BLOB column with NULL values.
Fixed a bug in handling NULL values in CASE ... WHEN ....
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 backward-
incompatible 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).
Make --lower-case-table-names default on Mac OS X as the default file system
(HFS+) is case insensitive.
Fixed a bug in scripts/mysqld_safe.sh in NOHUP_NICENESS testing.
Transactions in AUTOCOMMIT=0 mode didn't rotate binary log.
Fixed a bug in scripts/make_binary_distribution that resulted in a remaining
@HOSTNAME@ variable instead of replacing it with the correct path to the hostname binary.
Fixed a very unlikely bug that could cause SHOW PROCESSLIST to core dump in pthre-
ad_mutex_unlock() if a new thread was connecting.
Forbid SLAVE STOP if the thread executing the query has locked tables. This removes a possi-
ble deadlock situation.
D.4.6. Alteraes na distribuio 3.23.54 (05 Dec 2002)
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 re-
commended 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 mysqlcheck so it can deal with table names containing dashes.
Fixed shutdown problem on Mac OS X.
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 >.
Histrico de Alteraes do MySQL
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).
One can create TEMPORARY MERGE tables now.
Fixed that --core-file works on Linux (at least on kernel 2.4.18).
Fixed a problem with BDB and ALTER TABLE.
Fixed reference to freed memory when doing complicated GROUP BY ... ORDER BY queri-
es. Symptom was that mysqld died in function send_fields.
Allocate heap rows in smaller blocks to get better memory usage.
Fixed memory allocation bug when storing BLOB values in internal temporary tables used for
some (unlikely) GROUP BY queries.
Fixed a bug in key optimising handling where the expression WHERE column_name =
key_column_name was calculated as true for NULL values.
Fixed core dump bug when doing LEFT JOIN ... WHERE key_column=NULL.
Fixed MyISAM crash when using dynamic-row tables with huge numbers of packed fields.
Updated source tree to be built using automake 1.5 and libtool 1.4.
D.4.7. Alteraes na distribuio 3.23.53 (09 Oct 2002)
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 that --skip-show-databases doesn't reset the --port option.
Small fix in safe_mysqld for some shells.
Fixed that FLUSH STATUS doesn't reset delayed_insert_threads.
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 lo-
wer_case_table_names=1 (typically on Windows) when giving the table name in upper-
case.
Fixed that -O lower_case_table_names=1 also converts database names to lower case.
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.
Histrico de Alteraes do MySQL
928
Fixed a BDB-related ALTER TABLE bug with dropping a column and shutting down immedia-
tely thereafter.
Fixed problem with configure ... --localstatedir=....
Fixed problem with UNSIGNED BIGINT on AIX (again).
Fixed bug in pthread_mutex_trylock() on HPUX 11.0.
Multi-threaded stress tests for InnoDB.
D.4.8. Alteraes na distribuio 3.23.52 (14 Aug 2002)
Wrap BEGIN/COMMIT around transaction in the binary log. This makes replication honour tran-
sactions.
Fixed security bug when having an empty database name in the user.db table.
Changed initialisation of RND() to make it less predicatable.
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 crea-
te 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 RE-
PAIR TABLE.
Added name of 'administrator command' logs.
Fixed bug with creating an auto-increment value on second part of a UNIQUE() key where first
part could contain NULL values.
Don't write slave-timeout reconnects to the error log.
Fixed bug with slave net read timeouting
Fixed a core-dump bug with MERGE tables and MAX() function.
Fixed bug in ALTER TABLE with BDB tables.
Fixed bug when logging LOAD DATA INFILE to binary log with no active database.
Fixed a bug in range optimiser (causing crashes).
Fixed possible problem in replication when doing DROP DATABASE on a database with In-
noDB tables.
Fixed that mysql_info() returns 0 for 'Duplicates' when using INSERT DELAYED IGNO-
RE.
Added -DHAVE_BROKEN_REALPATH to the Mac OS X (darwin) compile options in confi-
gure.in to fix a failure under high load.
Histrico de Alteraes do MySQL
929
D.4.9. Alteraes na distribuio 3.23.51 (31 May 2002)
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.)
Fixed bug in CONCAT_WS() that cut the result.
Changed name of server variables Com_show_master_stat to
Com_show_master_status and Com_show_slave_stat to
Com_show_slave_status.
Changed handling of gethostbyname() to make the client library thread-safe even if
gethostbyname_r doesn't exist.
Fixed core-dump problem when giving a wrong password string to GRANT.
Fixed bug in DROP DATABASE with symlinked directory.
Fixed optimization problem with DATETIME and value outside DATETIME range.
Removed 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 FLOAT(X+1,X) is not converted to FLOAT(X+2,X). (This also affected
DECIMAL, DOUBLE and REAL types)
Fixed the result from IF() is case in-sensitive if the second and third arguments are case sensi-
tive.
Fixed core dump problem on OSF/1 in gethostbyname_r.
Fixed that underflowed decimal fields are not zero filled.
If we get an overflow when inserting '+11111' for DECIMAL(5,0) UNSIGNED columns,
we will just drop the sign.
Fixed optimization bug with ISNULL(expression_which_cannot_be_null) and IS-
NULL(constant_expression).
Fixed host lookup bug in the glibc library that we used with the 3.23.50 Linux-x86 binaries.
D.4.10. Alteraes na distribuio 3.23.50 (21 Apr
2002)
Fixed buffer overflow problem if someone specified a too long datadir parameter to mysqld
Add missing <row> tags for mysqldump XML output.
Fixed problem with crash-me and gcc 3.0.4.
Fixed that @@unknown_variable doesn't hang server.
Added @@VERSION as a synonym for VERSION().
SHOW VARIABLES LIKE 'xxx' is now case-insensitive.
Fixed timeout for GET_LOCK() on HP-UX with DCE threads.
Histrico de Alteraes do MySQL
930
Fixed memory allocation bug in the glibc library used to build Linux binaries, which caused
mysqld to die in 'free()'.
Fixed SIGINT and SIGQUIT problems in mysql.
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.
InnoDB tables can now be set to automatically grow in size (autoextend).
Our Linux RPMS and binaries are now compiled with gcc 3.0.4, which should make them a bit
faster.
Fixed some buffer overflow problems when reading startup parameters.
Because of problems on shutdown we have now disabled named pipes on Windows by default.
One can enable named pipes by starting mysqld with --enable-named-pipe.
Fixed bug when using WHERE key_column = 'J' or key_column='j'.
Fixed core-dump bug when using --log-bin with LOAD DATA INFILE without an active
database.
Fixed bug in RENAME TABLE when used with lower_case_table_names=1 (default on
Windows).
Fixed unlikely core-dump bug when using DROP TABLE on a table that was in use by a thread
that also used queries on only temporary tables.
Fixed problem with SHOW CREATE TABLE and PRIMARY KEY when using 32 indexes.
Fixed that one can use SET PASSWORD for the anonymous user.
Fixed core dump bug when reading client groups from option files using mysql_options().
Memory leak (16 bytes per every corrupted table) closed.
Fixed binary builds to use --enable-local-infile.
Update source to work with new version of bison.
Updated shell scripts to now agree with new POSIX standard.
Fixed bug where DATE_FORMAT() returned empty string when used with GROUP BY.
D.4.11. Alteraes na distribuio 3.23.49
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.
Added options to make LOAD DATA LOCAL INFILE more secure.
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 pro-
blem.
Histrico de Alteraes do MySQL
931
Fixed shutdown problem on NT.
D.4.12. Alteraes na distribuio 3.23.48 (07 Feb
2002)
Added --xml option to mysqldump for producing XML output.
Changed to use autoconf 2.52 (from autoconf 2.13)
Fixed bug in complicated join with const tables.
Added internal safety checks for InnoDB.
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 resynch-
ronising a master and a slave database in replication.
Added better error messages to help in installation problems of InnoDB tables.
It is now possible to recover MySQL temporary tables that have become orphaned inside the
InnoDB tablespace.
InnoDB now prevents a FOREIGN KEY declaration where the signedness is not the same in
the referencing and referenced integer columns.
Calling SHOW CREATE TABLE or SHOW TABLE STATUS could cause memory corruption
and make mysqld crash. Especially at risk was mysqldump, because it frequently calls SHOW
CREATE TABLE.
If inserts to several tables containing an AUTO_INCREMENT column were wrapped inside one
LOCK TABLES, InnoDB asserted in lock0lock.c.
In 3.23.47 we allowed several NULL values in a UNIQUE secondary index for an InnoDB table.
But CHECK TABLE was not relaxed: it reports the table as corrupt. CHECK TABLE no longer
complains in this situation.
SHOW GRANTS now shows REFERENCES instead of REFERENCE.
D.4.13. Alteraes na distribuio 3.23.47 (27 Dec
2001)
Fixed bug when using the following construct: SELECT ... WHERE key=@var_name OR
key=@var_name2
Histrico de Alteraes do MySQL
932
Restrict InnoDB keys to 500 bytes.
InnoDB now supports NULL in keys.
Fixed shutdown problem on HP-UX. (Introduced in 3.23.46)
Fixed core dump bug in replication when using SELECT RELEASE_LOCK().
Added new command: DO expression,[expression]
Added slave-skip-errors option.
Added statistics variables for all MySQL commands. (SHOW STATUS is now much longer.)
Fixed default values for InnoDB tables.
Fixed that GROUP BY expr DESC works.
Fixed bug when using t1 LEFT JOIN t2 ON t2.key=constant.
mysql_config now also works with binary (relocated) distributions.
D.4.14. Alteraes na distribuio 3.23.46 (29 Nov
2001)
Fixed problem with aliased temporary table replication.
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 in ANALYZE TABLE.
Fixed bug when joining with caching (unlikely to happen).
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.
Changed caching of binary log to make replication slightly faster.
Fixed bug in replication on Mac OS X.
D.4.15. Alteraes na distribuio 3.23.45 (22 Nov
2001)
(UPDATE|DELETE) ...WHERE MATCH bugfix.
shutdown should now work on Darwin (Mac OS X).
Fixed core dump when repairing corrupted packed MyISAM files.
--core-file now works on Solaris.
Fix a bug which could cause InnoDB to complain if it cannot find free blocks from the buffer
cache during recovery.
Histrico de Alteraes do MySQL
933
Fixed bug in InnoDB insert buffer B-tree handling that could cause crashes.
Fixed bug in InnoDB lock timeout handling.
Fixed core dump bug in ALTER TABLE on a TEMPORARY InnoDB table.
Fixed bug in OPTIMIZE TABLE that reset index cardinality if it was up to date.
Fixed problem with t1 LEFT_JOIN t2 ... WHERE t2.date_column IS NULL
when date_column was declared as NOT NULL.
Fixed bug with BDB tables and keys on BLOB columns.
Fixed bug in MERGE tables on OS with 32-bit file pointers.
Fixed bug in TIME_TO_SEC() when using negative values.
D.4.16. Alteraes na distribuio 3.23.44 (31 Oct
2001)
Fixed Rows_examined count in slow query log.
Fixed bug when using a reference to an AVG() column in HAVING.
Fixed that date functions that require correct dates, like DAYOFYEAR(column), will return
NULL for 0000-00-00 dates.
Fixed bug in const-propagation when comparing columns of different types. (SELECT *
FROM date_col="2001-01-01" and date_col=time_col)
Fixed bug that caused error message Can't write, because of unique constra-
int 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 valu-
es.
Fixed bug when doing LEFT JOIN ... ON (col_name = constant) WHERE
col_name = constant.
When using replications, aborted queries that contained % could cause a core dump.
TCP_NODELAY was not used on some systems. (Speed problem.)
Applied portability fixes for OS/2. (Patch by Yuri Dario.)
The following changes are for InnoDB tables:
Add missing InnoDB variables to SHOW VARIABLES.
Foreign keys checking is now done for InnoDB tables.
DROP DATABASE now works also for InnoDB tables.
Histrico de Alteraes do MySQL
934
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 or-
dering.
Note: if you are using latin1 and have inserted characters whose code is greater than 127 into
an indexed CHAR column, you should run CHECK TABLE on your table when you upgrade to
3.23.44, and drop and reimport the table if CHECK TABLE reports an error!
A new my.cnf parameter, innodb_thread_concurrency, helps in performance tuning
in heavily concurrent environments.
A new my.cnf parameter, innodb_fast_shutdown, speeds up server shutdown.
A new my.cnf parameter, innodb_force_recovery, helps to save your data in case the
disk image of the database becomes corrupt.
innodb_monitor has been improved and a new innodb_table_monitor added.
Increased maximum key length from 500 to 7000 bytes.
Fixed a bug in replication of AUTO_INCREMENT columns with multiple-line inserts.
Fixed a bug when the case of letters changes in an update of an indexed secondary column.
Fixed a hang when there are > 24 datafiles.
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 a bug in purge which could cause crashes.
D.4.17. Alteraes na distribuio 3.23.43 (04 Oct
2001)
Fixed a bug in INSERT DELAYED and FLUSH TABLES introduced in 3.23.42.
Fixed unlikely bug, which returned non-matching rows, in SELECT with many tables and multi-
column 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 ta-
bles.
Fixed problem with BDB tables and UNIQUE columns defined as NULL.
Fixed problem with myisampack when using pre-space filled CHAR columns.
Applied patch from Yuri Dario for OS/2.
Fixed bug in --safe-user-create.
Histrico de Alteraes do MySQL
935
D.4.18. Alteraes na distribuio 3.23.42 (08 Sep
2001)
Fixed problem when using LOCK TABLES and BDB tables.
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 with myisampack and BLOB.
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.
Fixed bug with LOAD DATA INFILE and transactional tables.
Fix bug when using INSERT DELAYED with wrong column definition.
Fixed core dump during REPAIR of some particularly broken tables.
Fixed bug in InnoDB and AUTO_INCREMENT columns.
Fixed bug in InnoDB and RENAME TABLE columns.
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.
Applied large patch for OS/2 from Yuri Dario.
Fixed problem with InnoDB when one could get the error Can't execute the given
command... even when no transaction was active.
Applied some minor fixes that concern Gemini.
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.
D.4.19. Alteraes na distribuio 3.23.41 (11 Aug
2001)
Added --sql-mode=value[,value[,value]] option to mysqld. See Seco 4.1.1,
Opes de Linha de Comando do mysqld.
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.
Histrico de Alteraes do MySQL
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.
Split record_buffer to record_buffer and record_rnd_buffer. To make things
compatible to previous MySQL versions, if record_rnd_buffer is not set, then it takes the
value of record_buffer.
Fixed optimising bug in ORDER BY where some ORDER BY parts where wrongly removed.
Fixed overflow bug with ALTER TABLE and MERGE tables.
Added prototypes for my_thread_init() and my_thread_end() to mysql_com.h
Added --safe-user-create option to mysqld.
Fixed bug in SELECT DISTINCT ... HAVING that caused error message Can't find
record in #...
D.4.20. Alteraes na distribuio 3.23.40
Fixed problem with --low-priority-updates and INSERT statements.
Fixed bug in slave thread when under some rare circumstances it could get 22 bytes ahead on the
offset in the master.
Added slave_net_timeout for replication.
Fixed problem with UPDATE and BDB tables.
Fixed hard bug in BDB tables when using key parts.
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).
CHECK TABLE now checks if an AUTO_INCREMENT column contains the value 0.
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).
Option --force to myisamchk now also updates states.
Added option --warnings to mysqld. Now mysqld prints the error Aborted connec-
tion only if this option is used.
Fixed problem with SHOW CREATE TABLE when you didn't have a PRIMARY KEY.
Properly fixed the rename of innodb_unix_file_flush_method variable to in-
nodb_flush_method.
Fixed bug when converting BIGINT UNSIGNED to DOUBLE. This caused a problem when do-
ing comparisons with BIGINT values outside of the signed range.
Histrico de Alteraes do MySQL
937
Fixed bug in BDB tables when querying empty tables.
Fixed a bug when using COUNT(DISTINCT) with LEFT JOIN and there weren't any mat-
ching rows.
Removed all documentation referring to the GEMINI table type. GEMINI is not released under
an Open Source license.
D.4.21. Alteraes na distribuio 3.23.39 (12 Jun
2001)
The AUTO_INCREMENT sequence wasn't reset when dropping and adding an AU-
TO_INCREMENT column.
CREATE ... SELECT now creates non-unique indexes delayed.
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.
Added functions to handle symbolic links to make life easier in 4.0.
We are now using the -lcma thread library on HP-UX 10.20 so that MySQL will be more sta-
ble on HP-UX.
Fixed problem with IF() and number of decimals in the result.
Fixed date-part extraction functions to work with dates where day and/or month is 0.
Extended argument length in option files from 256 to 512 chars.
Fixed problem with shutdown when INSERT DELAYED was waiting for a LOCK TABLE.
Fixed core dump bug in InnoDB when tablespace was full.
Fixed problem with MERGE tables and big tables (> 4G) when using ORDER BY.
D.4.22. Alteraes na distribuio 3.23.38 (09 May
2001)
Fixed a bug when SELECT from MERGE table sometimes results in incorrectly ordered rows.
Fixed a bug in REPLACE() when using the ujis character set.
Applied Sleepycat BDB patches 3.2.9.1 and 3.2.9.2.
Added --skip-stack-trace option to mysqld.
CREATE TEMPORARY now works with InnoDB tables.
InnoDB now promotes sub keys to whole keys.
Histrico de Alteraes do MySQL
938
Added option CONCURRENT to LOAD DATA.
Better error message when slave max_allowed_packet is too low to read a very long log
event from the master.
Fixed bug when too many rows where removed when using SELECT DISTINCT ... HA-
VING.
SHOW CREATE TABLE now returns TEMPORARY for temporary tables.
Added Rows_examined to slow query log.
Fixed problems with function returning empty string when used together with a group function
and a WHERE that didn't match any rows.
New program mysqlcheck.
Added database name to output for administrative commands like CHECK, REPAIR, OPTIMI-
ZE.
Lots of portability fixes for InnoDB.
Changed optimiser so that queries like SELECT * FROM tbl_name,tbl_name2 ...
ORDER BY key_part1 LIMIT row_count will use index on key_part1 instead of
filesort.
Fixed bug when doing LOCK TABLE to_table WRITE,...; INSERT INTO
to_table... SELECT ... when to_table was empty.
Fixed bug with LOCK TABLE and BDB tables.
D.4.23. Alteraes na distribuio 3.23.37 (17 Apr
2001)
Fixed a bug when using MATCH() in HAVING clause.
Fixed a bug when using HEAP tables with LIKE.
Added --mysql-version option to safe_mysqld
Changed INNOBASE to InnoDB (because the INNOBASE name was already used). All con-
figure options and mysqld start options now use innodb instead of innobase. This me-
ans that before upgrading to this version, you have to change any configuration files where you
have used innobase options!
Fixed bug when using indexes on CHAR(255) NULL columns.
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 abnor-
mally, 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.
Fixed a bug in REGEXP on 64-bit machines.
UPDATE and DELETE with WHERE unique_key_part IS NULL didn't update/delete all
Histrico de Alteraes do MySQL
939
rows.
Disabled INSERT DELAYED for tables that support transactions.
Fixed bug when using date functions on TEXT/BLOB column with wrong date format.
UDFs now also work on Windows. (Patch by Ralph Mason.)
Fixed bug in ALTER TABLE and LOAD DATA INFILE that disabled key-sorting. These com-
mands should now be faster in most cases.
Fixed performance bug where reopened tables (tables that had been waiting for FLUSH or RE-
PAIR) would not use indexes for the next query.
Fixed problem with ALTER TABLE to InnoDB tables on FreeBSD.
Added mysqld variables myisam_max_sort_file_size and myi-
sam_max_extra_sort_file_size.
Initialise signals early to avoid problem with signals in InnoDB.
Applied patch for the tis620 character set to make comparisons case-independent and to 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 !
Added --skip-safemalloc option to mysqld.
D.4.24. Alteraes na distribuio 3.23.36 (27 Mar
2001)
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.
Added SET TRANSACTION ISOLATION LEVEL ...
Added SELECT ... FOR UPDATE.
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.
Fixed a bug in CONCAT_WS() where it returned incorrect results.
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.
Histrico de Alteraes do MySQL
940
D.4.25. Alteraes na distribuio 3.23.35 (15 Mar
2001)
Fixed newly introduced bug in ORDER BY.
Fixed wrong define CLIENT_TRANSACTIONS.
Fixed bug in SHOW VARIABLES when using INNOBASE tables.
Setting and using user variables in SELECT DISTINCT didn't work.
Tuned SHOW ANALYZE for small tables.
Fixed handling of arguments in the benchmark script run-all-tests.
D.4.26. Alteraes na distribuio 3.23.34a
Added extra files to the distribution to allow INNOBASE support to be compiled.
D.4.27. Alteraes na distribuio 3.23.34 (10 Mar
2001)
Added the INNOBASE storage engine and the BDB storage engine to the MySQL source distri-
bution.
Updated the documentation about GEMINI tables.
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.
mysqld now only sets CLIENT_TRANSACTIONS in mysql->server_capabilities if
the server supports a transaction-safe storage engine.
Fixed LOAD DATA INFILE to allow numeric values to be read into ENUM and SET columns.
Improved error diagnostic for slave thread exit.
Fixed bug in ALTER TABLE ... ORDER BY.
Added max_user_connections variable to mysqld.
Limit query length for replication by max_allowed_packet, not the arbitrary limit of 4 MB.
Allow space around = in argument to --set-variable.
Fixed problem in automatic repair that could leave some threads in state Waiting for ta-
ble.
SHOW CREATE TABLE now displays the UNION=() for MERGE tables.
ALTER TABLE now remembers the old UNION=() definition.
Fixed bug when replicating timestamps.
Histrico de Alteraes do MySQL
941
Fixed bug in bidirectional replication.
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 MAX() optimization on sub-key for BDB tables.
Fixed problem where garbage results were returned when using BDB tables and BLOB or TEXT
fields when joining many tables.
Fixed a problem with BDB tables and TEXT columns.
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.
Allow --skip-gemini, --skip-bdb, and --skip-innodb options to be specified when
invoking mysqld, even if these storage engines are not compiled in to mysqld.
One can now do GROUP BY ... DESC.
Fixed a deadlock in the SET code, when one ran SET @foo=bar, where bar is a column re-
ference, an error was not properly generated.
D.4.28. Alteraes na distribuio 3.23.33 (09 Feb
2001)
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.
Added --character-sets-dir option to myisampack.
Removed warnings when running REPAIR TABLE ... EXTENDED.
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.
Added SEQUENCE() as an example UDF function.
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 where CASE didn't work with GROUP BY.
Added --sort-recover option to myisamchk.
myisamchk -S and OPTIMIZE TABLE now work on Windows.
Fixed bug when using DISTINCT on results from functions that referred to a group function, li-
ke:
SELECT a, DISTINCT SEC_TO_TIME(SUM(a))
FROM tbl_name GROUP BY a, b;
Histrico de Alteraes do MySQL
942
Fixed buffer overrun in libmysqlclient library. Fixed bug in handling STOP event after
ROTATE event in replication.
Fixed another buffer overrun in DROP DATABASE.
Added Table_locks_immediate and Table_locks_waited status variables.
Fixed bug in replication that broke slave server start with existing master.info. This fixes a
bug introduced in 3.23.32.
Added SET SQL_SLAVE_SKIP_COUNTER=n command to recover from replication glitches
without a full database copy.
Added max_binlog_size variable; the binary log will be rotated automatically when the si-
ze crosses the limit.
Added Last_Error, Last_Errno, and Slave_skip_counter variables to SHOW
SLAVE STATUS.
Fixed bug in MASTER_POS_WAIT() function.
Execute core dump handler on SIGILL, and SIGBUS in addition to SIGSEGV.
On x86 Linux, print the current query and thread (connection) id, if available, in the core dump
handler.
Fixed several timing bugs in the test suite.
Extended mysqltest to take care of the timing issues in the test suite.
ALTER TABLE can now be used to change the definition for a MERGE table.
Fixed creation of MERGE tables on Windows.
Portability fixes for OpenBSD and OS/2.
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 di-
rectory entry cache instead of the disk cache.
D.4.29. Alteraes na distribuio 3.23.32 (22 Jan
2001: Production)
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.
MERGE tables didn't work on Windows.
Histrico de Alteraes do MySQL
943
Fixed problem with SET PASSWORD=... on Windows.
Added missing my_config.h to RPM distribution.
TRIM("foo" from "foo") didn't return an empty string.
Added --with-version-suffix option to configure.
Fixed core dump when client aborted connection without mysql_close().
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().
D.4.30. Alteraes na distribuio 3.23.31 (17 Jan
2001)
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.
Fixed the MySQL RPM so it no longer depends on Perl5.
Fixed some problems with HEAP tables on Windows.
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.
Added option MEDIUM to CHECK TABLE.
Fixed problem when using DECIMAL() keys on negative numbers.
HOUR() (and some other TIME functions) on a CHAR column always returned NULL.
Fixed security bug in something (please upgrade if you are using an earlier MySQL 3.23 versi-
on).
Fixed buffer overflow bug when writing a certain error message.
Added usage of setrlimit() on Linux to get -O --open-files-limit=# to work on
Linux.
Added bdb_version variable to mysqld.
Fixed bug when using expression of type:
SELECT ... FROM t1 LEFT JOIN t2 ON (t1.a=t2.a) WHERE t1.a=t2.a
In this case the test in the WHERE clause was wrongly optimised away.
Fixed bug in MyISAM when deleting keys with possible NULL values, but the 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.
Histrico de Alteraes do MySQL
944
Added Threads_created status variable to mysqld.
D.4.31. Alteraes na distribuio 3.23.30 (04 Jan
2001)
Added SHOW OPEN TABLES command.
Fixed that myisamdump works against old mysqld servers.
Fixed myisamchk -k# so that it works again.
Fixed a problem with replication when the binary log file went over 2G on 32-bit systems.
LOCK TABLES will now automatically start a new transaction.
Changed BDB tables to not use internal subtransactions and reuse open files to get more speed.
Added --mysqld=# option to safe_mysqld.
Allow hex constants in the --fields-*-by and --lines-terminated-by options to
mysqldump and mysqlimport. By Paul DuBois.
Added --safe-show-database option to mysqld.
Added have_bdb, have_gemini, have_innobase, have_raid and have_openssl
to SHOW VARIABLES to make it easy to test for supported extensions.
Added --open-files-limit option to mysqld.
Changed --open-files option to --open-files-limit in safe_mysqld.
Fixed a bug where some rows were not found with HEAP tables that had many keys.
Fixed that --bdb-no-sync works.
Changed --bdb-recover to --bdb-no-recover as recover should be on by default.
Changed the default number of BDB locks to 10000.
Fixed a bug from 3.23.29 when allocating the shared structure needed for BDB tables.
Changed mysqld_multi.sh to use configure variables. Patch by Christopher McCrory.
Added fixing of include files for Solaris 2.8.
Fixed bug with --skip-networking on Debian Linux.
Fixed problem that some temporary files where reported as having the name UNOPENED in error
messages.
Fixed bug when running two simultaneous SHOW LOGS queries.
D.4.32. Alteraes na distribuio 3.23.29 (16 Dec
2000)
Configure updates for Tru64, large file support, and better TCP wrapper support. By Albert
Chin-A-Young.
Histrico de Alteraes do MySQL
945
Fixed bug in <=> operator.
Fixed bug in REPLACE with BDB tables.
LPAD() and RPAD() will shorten the result string if it's longer than the length argument.
Added SHOW LOGS command.
Remove unused BDB logs on shutdown.
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.
Renamed bdb_lock_max variable to bdb_max_lock.
Added support for AUTO_INCREMENT on sub-fields for BDB tables.
Added ANALYZE of BDB tables.
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 en-
tire transaction.
If you do a ROLLBACK when you have updated a non-transactional table you will get an error as
a warning.
Added --bdb-shared-data option to mysqld.
Added Slave_open_temp_tables status variable to mysqld
Added binlog_cache_size and max_binlog_cache_size variables to mysqld.
DROP TABLE, RENAME TABLE, CREATE INDEX and DROP INDEX are now transaction
endpoints.
If you do a DROP DATABASE on a symbolically linked database, both the link and the original
database is deleted.
Fixed DROP DATABASE to work on OS/2.
Fixed bug when doing a SELECT DISTINCT ... table1 LEFT JOIN table2 ...
when table2 was empty.
Added --abort-slave-event-count and --disconnect-slave-event-count
options to mysqld for debugging and testing of replication.
Fixed replication of temporary tables. Handles everything except slave server restart.
Histrico de Alteraes do MySQL
946
SHOW KEYS now shows whether key is FULLTEXT.
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.
safe_mysqld, mysql.server, and mysql_install_db have been modified to use
mysql_print_defaults instead of various hacks to read the my.cnf files. In addition, the
handling of various paths has been made more consistent with how mysqld handles them by
default.
Automatically remove Berkeley DB transaction logs that no longer are in use.
Fixed bug with several FULLTEXT indexes in one table.
Added a warning if number of rows changes on REPAIR/OPTIMIZE.
Applied patches for OS/2 by Yuri Dario.
FLUSH TABLES tbl_name 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.
Changed mi_create() to use less stack space.
Fixed bug with optimiser trying to over-optimise MATCH() when used with UNIQUE key.
Changed crash-me and the MySQL benchmarks to also work with FrontBase.
Allow RESTRICT and CASCADE after DROP TABLE to make porting easier.
Reset status variable which could cause problem if one used --slow-log.
Added connect_timeout variable to mysql and mysqladmin.
Added connect-timeout as an alias for timeout for option files read by
mysql_options().
D.4.33. Alteraes na distribuio 3.23.28 (22 Nov
2000: Gamma)
Added new options --pager[=...], --no-pager, --tee=... and --no-tee to the
mysql client. The new corresponding interactive commands are pager, nopager, tee and
notee. See Seco 4.9.2, mysql, A Ferramenta de Linha de Comando, mysql --help
and the interactive help for more information.
Fixed crash when automatic repair of MyISAM table failed.
Fixed a major performance bug in the table locking code when one constantly had a lot of SE-
LECT, UPDATE and INSERT statements running. The symptom was that the UPDATE and IN-
SERT 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 op-
tion was ignored.
One can now specify interactive-timeout in the option file that is read by
Histrico de Alteraes do MySQL
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 problem when using NATURAL JOIN without keys.
Fixed a bug when using a multi-part keys where the first part was of type TEXT or BLOB.
DROP of temporary tables wasn't stored in the update/binary log.
Fixed a bug where SELECT DISTINCT * ... LIMIT row_count only returned one
row.
Fixed a bug in the assembler code in strstr() for SPARC and cleaned up the global.h he-
ader file to avoid a problem with bad aliasing with the compiler submitted with Red Hat 7.0.
(Reported by Trond Eivind Glomsrd)
The --skip-networking option now works properly on NT.
Fixed a long outstanding bug in the ISAM tables when a row with a length of more than 65K
was shortened by a single byte.
Fixed a bug in MyISAM when running multiple updating processes on the same table.
Allow one to use FLUSH TABLE tbl_name.
Added --replicate-ignore-table, --replicate-do-table, -
-replicate-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 pro-
blems when there are many files open.
Added --open-files and --timezone options to safe_mysqld.
Fixed a fatal bug in CREATE TEMPORARY TABLE ... SELECT ....
Fixed a problem with CREATE TABLE ... SELECT NULL.
Added variables large_file_support,net_read_timeout, net_write_timeout
and query_buffer_size to SHOW VARIABLES.
Added status variables created_tmp_files and sort_merge_passes to SHOW STA-
TUS.
Fixed a bug where we didn't allow an index name after the FOREIGN KEY definition.
Added TRUNCATE table_name as a synonym for DELETE FROM table_name.
Fixed a bug in a BDB key compare function when comparing part keys.
Added bdb_lock_max variable to mysqld.
Added more tests to the benchmark suite.
Fixed an 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.
Histrico de Alteraes do MySQL
948
SLAVE START did not work if you started with --skip-slave-start and had not expli-
citly run CHANGE MASTER TO.
Fixed the output of SHOW MASTER STATUS to be consistent with SHOW SLAVE STATUS.
(It now has no directory in the log name.)
Added PURGE MASTER LOGS TO.
Added SHOW MASTER LOGS.
Added --safemalloc-mem-limit option to mysqld to simulate memory shortage when
compiled with the --with-debug=full option.
Fixed several core dumps in out-of-memory conditions.
SHOW SLAVE STATUS was using an uninitialised mutex if the slave had not been started yet.
Fixed bug in ELT() and MAKE_SET() when the query used a temporary table.
CHANGE MASTER TO without specifying MASTER_LOG_POS would set it to 0 instead of 4
and hit the magic number in the master binlog.
ALTER TABLE ... ORDER BY ... syntax added. This will create the new table with the
rows in a specific order.
D.4.34. Alteraes na distribuio 3.23.27 (24 Oct
2000)
Fixed a bug where the automatic repair of MyISAM tables sometimes failed when the datafile
was corrupt.
Fixed a bug in SHOW CREATE when using AUTO_INCREMENT columns.
Changed BDB tables to use new compare function in Berkeley DB 3.2.3.
You can now use Unix sockets with MIT-pthreads.
Added the latin5 (turkish) character set.
Small portability fixes.
D.4.35. Alteraes na distribuio 3.23.26 (18 Oct
2000)
Renamed FLUSH MASTER and FLUSH SLAVE to RESET MASTER and RESET SLAVE.
Fixed <> to work properly with NULL.
Fixed a problem with SUBSTRING_INDEX() and REPLACE(). (Patch by Alexander Igonit-
chev)
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.
Added read-only-key optimization to BDB tables.
Histrico de Alteraes do MySQL
949
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.
Automatic repair of MyISAM tables if you start mysqld with --myisam-recover.
Removed the TYPE= keyword from CHECK and REPAIR. Allow CHECK options to be combi-
ned. (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-degra-
ding reconnect and a scary message in the error log.
Changed the format of the binary log --- added magic number, server version, binlog version.
Added server ID and query error code for each query event.
Replication thread from the slave now will kill all the stale threads from the same server.
Long replication user names were not being handled properly.
Added --replicate-rewrite-db option to mysqld.
Added --skip-slave-start option to mysqld.
Updates that generated an error code (such as INSERT INTO foo(some_key) values
(1),(1)) erroneously terminated the slave thread.
Added optimization of queries where DISTINCT is only used on columns from some of the ta-
bles.
Allow floating-point numbers where there is no sign after the exponent (like 1e1).
SHOW GRANTS didn't always show all column grants.
Added --default-extra-file=# option to all MySQL clients.
Columns referenced in INSERT statements now are initialised properly.
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.
Fixed a bug in FULLTEXT index when inserting a NULL column.
Changed to use mkstemp() instead of tempnam(). Based on a patch from John Jones.
D.4.36. Alteraes na distribuio 3.23.25 (29 Sep
2000)
Fixed that databasename works as second argument to mysqlhotcopy.
The values for the UMASK and UMASK_DIR environment variables now can be specified in oc-
tal by beginning the value with a zero.
Added RIGHT JOIN. This makes RIGHT a reserved word.
Added @@IDENTITY as a synonym for LAST_INSERT_ID(). (This is for MSSQL compati-
bility.)
Histrico de Alteraes do MySQL
950
Fixed a bug in myisamchk and REPAIR when using FULLTEXT index.
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 va-
lue of the log-bin option.
Fixed a bug in MyISAM with packed multi-part keys.
Fixed crash when using CHECK TABLE on Windows.
Fixed a bug where FULLTEXT index always used the koi8_ukr character set.
Fixed privilege checking for CHECK TABLE.
The MyISAM repair/reindex code didn't use the --tmpdir option for its temporary files.
Added BACKUP TABLE and RESTORE TABLE.
Fixed core dump on CHANGE MASTER TO when the slave did not have the master to start
with.
Fixed incorrect Time in the processlist for Connect of the slave thread.
The slave now logs when it connects to the master.
Fixed a core dump bug when doing FLUSH MASTER if you didn't specify a filename argument
to --log-bin.
Added missing ha_berkeley.x files to the MySQL Windows distribution.
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).
HEAP tables didn't use keys properly. (Bug from 3.23.23.)
Added better support for MERGE tables (keys, mapping, creation, documentation...). See Sec-
o 7.2, Tabelas MERGE.
Fixed bug in mysqldump from 3.23 which caused some CHAR columns not to be quoted.
Merged analyze, check, optimize and repair code.
OPTIMIZE TABLE is now mapped to REPAIR with statistics and sorting of the index tree.
This means that for the moment it only works on MyISAM tables.
Added a pre-alloced block to root_malloc to get fewer mallocs.
Added a lot of new statistics variables.
Fixed ORDER BY bug with BDB tables.
Removed warning that mysqld couldn't remove the .pid file under Windows.
Changed --log-isam to log MyISAM tables instead of isam tables.
Fixed CHECK TABLE to work on Windows.
Added file mutexes to make pwrite() safe on Windows.
Histrico de Alteraes do MySQL
951
D.4.37. Alteraes na distribuio 3.23.24 (08 Sep
2000)
Added created_tmp_disk_tables variable to mysqld.
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 cha-
racters 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).
D.4.38. Alteraes na distribuio 3.23.23 (01 Sep
2000)
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 incompati-
bility 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.
Fixed non-fatal free() bug in mysqlimport.
Fixed bug in MyISAM index handling of DECIMAL/NUMERIC keys.
Fixed a bug in concurrent insert in MyISAM tables. In some contexts, usage of
MIN(key_part) or MAX(key_part) returned an empty set.
Updated mysqlhotcopy to use the new FLUSH TABLES table_list syntax. Only ta-
bles 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.
Added atomic RENAME TABLE command.
Don't count NULL values in COUNT(DISTINCT ...).
Changed ALTER TABLE, LOAD DATA INFILE on empty tables and INSERT ... SE-
LECT ... 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.
Histrico de Alteraes do MySQL
952
ALTER TABLE now logs the first used insert_id correctly.
Fixed crash when adding a default value to a BLOB column.
Fixed a bug with DATE_ADD/DATE_SUB where it returned a datetime instead of a date.
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 con-
current inserts crash. This only affects systems that don't have the pthre-
ad_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 SELECT on part keys to work with BDB tables.
Fixed INSERT INTO bdb_table ... SELECT to work with BDB tables.
CHECK TABLE now updates key statistics for the table.
ANALYZE TABLE will now only update tables that have been changed since the last
ANALYZE. Note that this is a new feature and tables will not be marked to be analysed until they
are updated in any way with 3.23.23 or newer. For older tables, you have to do CHECK TABLE
to update the key distribution.
Fixed some minor privilege problems with CHECK, ANALYZE, REPAIR and SHOW CREATE
commands.
Added CHANGE MASTER TO statement.
Added FAST, QUICK EXTENDED check types to CHECK TABLES.
Changed myisamchk so that --fast and --check-only-changed are also honored with
--sort-index and --analyze.
Fixed fatal bug in LOAD TABLE FROM MASTER that did not lock the table during index re-
build.
LOAD DATA INFILE broke replication if the database was excluded from replication.
More variables in SHOW SLAVE STATUS and SHOW MASTER STATUS.
SLAVE STOP now will not return until the slave thread actually exits.
Full-text search via the MATCH() function and FULLTEXT index type (for MyISAM files). This
makes FULLTEXT a reserved word.
D.4.39. Alteraes na distribuio 3.23.22 (31 Jul 2000)
Fixed that lex_hash.h is created properly for each MySQL distribution.
Fixed that MASTER and COLLECTION are not reserved words.
The log generated by --slow-query-log didn't contain the whole queries.
Fixed that open transactions in BDB tables are rolled back if the connection is closed unexpec-
tedly.
Added workaround for a bug in gcc 2.96 (intel) and gcc 2.9 (IA-64) in gen_lex_hash.c.
Histrico de Alteraes do MySQL
953
Fixed memory leak in the client library when using host= in the my.cnf file.
Optimized functions that manipulate the hours/minutes/seconds.
Fixed bug when comparing the result of DATE_ADD()/DATE_SUB() against a number.
Changed the meaning of -F, --fast for myisamchk. Added -C, -
-check-only-changed option to myisamchk.
Added ANALYZE tbl_name to update key statistics for tables.
Changed binary items 0x... to be regarded as integers by default.
Fix for SCO and SHOW PROCESSLIST.
Added auto-rehash on reconnect for the mysql client.
Fixed a newly introduced bug in MyISAM, where the index file couldn't get bigger than 64M.
Added SHOW MASTER STATUS and SHOW SLAVE STATUS.
D.4.40. Alteraes na distribuio 3.23.21
Added mysql_character_set_name() function to the MySQL C API.
Made the update log ASCII 0 safe.
Added the mysql_config script.
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 inste-
ad of the old deprecated API calls.
Fixed chown warning in safe_mysqld.
Fixed a bug in ORDER BY that was introduced in 3.23.19.
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 du-
ring an INSERT/UPDATE.
myisamchk didn't correctly update row checksum when used with -ro (this only gave a war-
ning in subsequent runs).
Fixed bug in REPAIR TABLE so that it works with tables without indexes.
Fixed buffer overrun in DROP DATABASE.
LOAD TABLE FROM MASTER is sufficiently bug-free to announce it as a feature.
MATCH and AGAINST are now reserved words.
D.4.41. Alteraes na distribuio 3.23.20
Histrico de Alteraes do MySQL
954
Fixed bug in 3.23.19; DELETE FROM tbl_name removed the .frm file.
Added SHOW CREATE TABLE.
D.4.42. Alteraes na distribuio 3.23.19
Changed copyright for all files to GPL for the server code and utilities and to LGPL for the cli-
ent libraries. See http://www.fsf.org/licenses/.
Fixed bug where all rows matching weren't updated on a MyISAM table when doing update ba-
sed 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.
Changed name of print_defaults program to my_print_defaults to avoid name con-
fusion.
Fixed NULLIF() to work as required by SQL-99.
Added net_read_timeout and net_write_timeout as startup parameters to mysqld.
Fixed bug that destroyed index when doing myisamchk --sort-records on a table with
prefix compressed index.
Added pack_isam and myisampack to the standard MySQL distribution.
Added the syntax BEGIN WORK (the same as BEGIN).
Fixed core dump bug when using ORDER BY on a CONV() expression.
Added LOAD TABLE FROM MASTER.
Added FLUSH MASTER and FLUSH SLAVE.
Fixed big/little endian problem in the replication.
D.4.43. Alteraes na distribuio 3.23.18
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.
CREATE TABLE ... SELECT ... PROCEDURE now works.
Internal temporary tables will now use compressed index when using GROUP BY on VAR-
CHAR/CHAR columns.
Fixed a problem when locking the same table with both a READ and a WRITE lock.
Fixed problem with myisamchk and RAID tables.
D.4.44. Alteraes na distribuio 3.23.17
Histrico de Alteraes do MySQL
955
Fixed a bug in FIND_IN_SET() when the first argument was NULL.
Added table locks to Berkeley DB.
Fixed a bug with LEFT JOIN and ORDER BY where the first table had only one matching row.
Added 4 sample my.cnf example files in the support-files directory.
Fixed duplicated key problem when doing big GROUP BY operations. (This bug was pro-
bably introduced in 3.23.15.)
Changed syntax for INNER JOIN to match SQL-99.
Added NATURAL JOIN syntax.
A lot of fixes in the BDB interface.
Added handling of --no-defaults and --defaults-file to safe_mysqld.sh and
mysql_install_db.sh.
Fixed bug in reading compressed tables with many threads.
Fixed that USE INDEX works with PRIMARY keys.
Added BEGIN statement to start a transaction in AUTOCOMMIT mode.
Added support for symbolic links for Windows.
Changed protocol to let client know if the server is in AUTOCOMMIT mode and if there is a pen-
ding transaction. If there is a pending transaction, the client library will give an error before re-
connecting to the server to let the client know that the server did a rollback. The protocol is still
backward-compatible with old clients.
KILL now works on a thread that is locked on a 'write' to a dead client.
Fixed memory leak in the replication slave thread.
Added new log-slave-updates option to mysqld, to allow daisy-chaining the slaves.
Fixed compile error on FreeBSD and other systems where pthread_t is not the same as int.
Fixed master shutdown aborting the slave thread.
Fixed a race condition in INSERT DELAYED code when doing ALTER TABLE.
Added deadlock detection sanity checks to INSERT DELAYED.
D.4.45. Alteraes na distribuio 3.23.16
Added SLAVE START and SLAVE STOP statements.
Added TYPE=QUICK option to CHECK and to REPAIR.
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 re-
connects. This will also improve systems where you can't use persistent connections.
Lots of fixes in the Berkeley DB interface.
UPDATE IGNORE will not abort if an update results in a DUPLICATE_KEY error.
Histrico de Alteraes do MySQL
956
Put CREATE TEMPORARY TABLE commands in the update log.
Fixed bug in handling of masked IP numbers in the privilege tables.
Fixed bug with delay_key_write tables and CHECK TABLE.
Added replicate-do-db and replicate-ignore-db options to mysqld, to restrict
which databases get replicated.
Added SQL_LOG_BIN option.
D.4.46. Alteraes na distribuio 3.23.15 (May 2000:
Beta)
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!)
Replication between master and slaves.
Fixed bug that other threads could steal a lock when a thread had a lock on a table and did a
FLUSH TABLES command.
Added the slow_launch_time variable and the Slow_launch_threads status variable
to mysqld. These can be examined with mysqladmin variables and mysqladmin
extended-status.
Added functions INET_NTOA() and INET_ATON().
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.
Don't write INSERT DELAYED to update log if SQL_LOG_UPDATE=0.
Fixed problem with REPLACE on HEAP tables.
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 problem with CHECK on table with deleted keyblocks.
Fixed a bug in reconnect (at the client side) where it didn't free memory properly in some con-
texts.
Fixed problems in update log when using LAST_INSERT_ID() to update a table with an AU-
TO_INCREMENT key.
Added NULLIF() function.
Fixed bug when using LOAD DATA INFILE on a table with BLOB/TEXT columns.
Optimized MyISAM to be faster when inserting keys in sorted order.
EXPLAIN SELECT ... now also prints out whether MySQL needs to create a temporary ta-
Histrico de Alteraes do MySQL
957
ble or use file sorting when resolving the SELECT.
Added optimization to skip ORDER BY parts where the part is a constant expression in the
WHERE part. Indexes can now be used even if the ORDER BY 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.
Changed RAID_CHUNKSIZE to be in 1024-byte increments.
Fixed core dump in LOAD_FILE(NULL).
D.4.47. Alteraes na distribuio 3.23.14
Added mysql_real_escape_string() function to the MySQL C API.
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 ti-
me. 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 that DROP TABLE is logged in the update log.
Fixed problem when searching on DECIMAL() key field where the column data contained lea-
ding zeros.
Fix bug in myisamchk when the AUTO_INCREMENT column isn't the first key.
Allow DATETIME in ISO8601 format: 2000-03-12T12:00:00
Dynamic character sets. A mysqld binary can now handle many different character sets (you
can choose which when starting mysqld).
Added command REPAIR TABLE.
Added mysql_thread_safe() function to the MySQL C API.
Added the UMASK_DIR environment variable.
Added CONNECTION_ID() function to return the client connection thread ID.
When using = on BLOB or VARCHAR BINARY keys, where only a part of the column was inde-
xed, the whole column of the result row wasn't compared.
Fix for sjis character set and ORDER BY.
When running in ANSI mode, don't allow columns to be used that aren't in the GROUP BY part.
D.4.48. Alteraes na distribuio 3.23.13
Fixed problem when doing locks on the same table more than 2 times in the same LOCK TA-
BLE command; this fixed the problem one got when running the test-ATIS test with --fast or
--check-only-changed.
Histrico de Alteraes do MySQL
958
Added SQL_BUFFER_RESULT option to SELECT.
Removed end space from double/float numbers in results from temporary tables.
Added CHECK TABLE command.
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.
Fixed a possible endless loop when calculating timestamp.
Added print_defaults program to the .rpm files. Removed mysqlbug from the client
.rpm file.
D.4.49. Alteraes na distribuio 3.23.12 (07 Mar
2000)
Fixed bug in MyISAM involving REPLACE ... SELECT ... which could give a corrupted
table.
Fixed bug in myisamchk where it incorrectly reset the AUTO_INCREMENT value.
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 ad-
dition, the new code is MUCH faster.
Added patches to make MySQL compile on Mac OS X.
Added IF NOT EXISTS clause to CREATE DATABASE.
Added --all-databases and --databases options to mysqldump to allow dumping of
many databases at the same time.
Fixed bug in compressed DECIMAL() index in MyISAM tables.
Fixed bug when storing 0 into a timestamp.
When doing mysqladmin shutdown on a local connection, mysqladmin now waits until
the PID file is gone before terminating.
Fixed core dump with some COUNT(DISTINCT ...) queries.
Fixed that myisamchk works properly with RAID tables.
Fixed problem with LEFT JOIN and key_field IS NULL.
Fixed bug in net_clear() which could give the error Aborted connection in the
MySQL clients.
Added options USE INDEX (key_list) and IGNORE INDEX (key_list) as parame-
ters in SELECT.
DELETE and RENAME should now work on RAID tables.
Histrico de Alteraes do MySQL
959
D.4.50. Alteraes na distribuio 3.23.11
Allow the ALTER TABLE tbl_name ADD (field_list) syntax.
Fixed problem with optimiser that could sometimes use incorrect keys.
Fixed that GRANT/REVOKE ALL PRIVILEGES doesn't affect GRANT OPTION.
Removed extra ')' from the output of SHOW GRANTS.
Fixed problem when storing numbers in timestamps.
Fix problem with timezones that have half hour offsets.
Allow the syntax UNIQUE INDEX in CREATE statements.
mysqlhotcopy - fast online hot-backup utility for local MySQL databases. By Tim Bunce.
New more secure mysqlaccess. Thanks to Steve Harvey for this.
Added --i-am-a-dummy and --safe-updates options to mysql.
Added select_limit and max_join_size variables to mysql.
Added SQL_MAX_JOIN_SIZE and SQL_SAFE_UPDATES options.
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.
Added --skip-delay-key-write option to mysqld.
Fixed security problem in the protocol regarding password checking.
_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 ma-
ke things safe for old clients.
D.4.51. Alteraes na distribuio 3.23.10
Fixed bug in 3.23.9 where memory wasn't properly freed when using LOCK TABLES.
D.4.52. Alteraes na distribuio 3.23.9
Fixed problem that affected queries that did arithmetic on group functions.
Fixed problem with timestamps and INSERT DELAYED.
Fixed that date_col BETWEEN const_date AND const_date works.
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.
Histrico de Alteraes do MySQL
960
Original patch by Matthew Vanecek.
Fixed critical problem with the WITH GRANT OPTION option.
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 FLO-
OR(POW(2,63)).
Renamed mysqld startup option from --delay-key-write to -
-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 option to print default arguments to all clients.
Added --log-slow-queries option to mysqld to log all queries that take a long time to a
separate log file with a time indicating how long the query took.
Fixed core dump when doing WHERE key_col=RAND(...).
Fixed optimization bug in SELECT ... LEFT JOIN ... key_col IS NULL, when
key_col could contain NULL values.
Fixed problem with 8-bit characters as separators in LOAD DATA INFILE.
D.4.53. Alteraes na distribuio 3.23.8 (02 Jan 2000)
Fixed problem when handling indexfiles larger than 8G.
Added latest patches to MIT-pthreads for NetBSD.
Fixed problem with timezones that are < GMT - 11.
Fixed a bug when deleting packed keys in NISAM.
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.
Option --delay-key-write didn't enable delayed key writing.
Fixed update of TEXT column which involved only case changes.
Fixed that INSERT DELAYED doesn't update timestamps that are given.
Added function YEARWEEK() and options x, X, v and V to DATE_FORMAT().
Histrico de Alteraes do MySQL
961
Fixed problem with MAX(indexed_column) and HEAP tables.
Fixed problem with BLOB NULL keys and LIKE "prefix%".
Fixed problem with MyISAM and fixed-length rows < 5 bytes.
Fixed problem that could cause MySQL to touch freed memory when doing very complicated
GROUP BY queries.
Fixed core dump if you got a crashed table where an ENUM field value was too big.
D.4.54. Alteraes na distribuio 3.23.7 (10 Dec 1999)
Fixed workaround under Linux to avoid problems with pthread_mutex_timedwait,
which is used with INSERT DELAYED. See Seco 2.6.2, Notas Linux (Todas as verses).
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).
Fixed a bug in MyISAM with keys > 250 characters.
In MyISAM one can now do an INSERT at the same time as other threads are reading from the
table.
Added max_write_lock_count variable to mysqld to force a READ lock after a certain
number of WRITE locks.
Inverted flag delay_key_write on show variables.
Renamed concurrency variable to thread_concurrency.
The following functions are now multi-byte-safe: LOCATE(substr,str), POSITI-
ON(substr IN str), LOCATE(substr,str,pos), INSTR(str,substr),
LEFT(str,len), RIGHT(str,len), SUBSTRING(str,pos,len), SUBSTRING(str
FROM pos FOR len), MID(str,pos,len), SUBSTRING(str,pos), SUBS-
TRING(str FROM pos), SUBSTRING_INDEX(str,delim,count), RTRIM(str),
TRIM([[BOTH | TRAILING] [remstr] FROM] str), REPLA-
CE(str,from_str,to_str), REVERSE(str), INSERT(str,pos,len,newstr),
LCASE(str), LOWER(str), UCASE(str) and UPPER(str); patch by Wei He.
Fix core dump when releasing a lock from a non-existent table.
Remove locks on tables before starting to remove duplicates.
Added option FULL to SHOW PROCESSLIST.
Added option --verbose to mysqladmin.
Fixed problem when automatically converting HEAP to MyISAM.
Fixed bug in HEAP tables when doing insert + delete + insert + scan the table.
Fixed bugs on Alpha with REPLACE() and LOAD DATA INFILE.
Added interactive_timeout variable to mysqld.
Changed the argument to mysql_data_seek() from ulong to ulonglong.
D.4.55. Alteraes na distribuio 3.23.6
Histrico de Alteraes do MySQL
962
Added -O lower_case_table_names={0|1} option to mysqld to allow users to force
table names to lowercase.
Added SELECT ... INTO DUMPFILE.
Added --ansi option to mysqld to make some functions SQL-99 compatible.
Temporary table names now start with #sql.
Added quoting of identifiers with ` (" in --ansi mode).
Changed to use snprintf() when printing floats to avoid some buffer overflows on Fre-
eBSD.
Made FLOOR() overflow safe on FreeBSD.
Added --quote-names option to mysqldump.
Fixed bug that one could make a part of a PRIMARY KEY NOT NULL.
Fixed encrypt() to be thread-safe and not reuse buffer.
Added mysql_odbc_escape_string() function to support big5 characters in MyODBC.
Rewrote the storage engine to use classes. This introduces a lot of new code, but will make table
handling faster and better.
Added patch by Sasha for user-defined variables.
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 DECI-
MAL(10,0). The same goes for NUMERIC.
Added option ROW_FORMAT={default | dynamic | fixed | compressed} to
CREATE_TABLE.
DELETE FROM table_name didn't work on temporary tables.
Changed function CHAR_LENGTH() to be multi-byte character safe.
Added function ORD(string).
D.4.56. Alteraes na distribuio 3.23.5 (20 Oct 1999)
Fixed some Y2K problems in the new date handling in 3.23.
Fixed problem with SELECT DISTINCT ... ORDER BY RAND().
Added patches by Sergei A. Golubchik for text searching on the MyISAM level.
Fixed cache overflow problem when using full joins without keys.
Fixed some configure issues.
Some small changes to make parsing faster.
Adding a column after the last field with ALTER TABLE didn't work.
Histrico de Alteraes do MySQL
963
Fixed problem when using an AUTO_INCREMENT column in two keys
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.
Don't allow NULL columns in a PRIMARY KEY (only in UNIQUE keys).
Clear LAST_INSERT_ID() if one uses this in ODBC: WHERE au-
to_increment_column IS NULL. This seems to fix some problems with Access.
SET SQL_AUTO_IS_NULL=0|1 now turns on/off the handling of searching after the last in-
serted row with WHERE auto_increment_column IS NULL.
Added new variable concurrency to mysqld for Solaris.
Added --relative option to mysqladmin to make extended-status more useful to
monitor changes.
Fixed bug when using COUNT(DISTINCT ...) on an empty table.
Added support for the Chinese character set GBK.
Fixed problem with LOAD DATA INFILE and BLOB columns.
Added bit operator ~ (negation).
Fixed problem with UDF functions.
D.4.57. Alteraes na distribuio 3.23.4 (28 Sep 1999)
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().)
Added connect timeout on TCP/IP connections.
Fixed problem with LIKE "%" on an index that may have NULL values.
REVOKE ALL PRIVILEGES didn't revoke all privileges.
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.
New command: SHOW GRANTS FOR user (by Sinisa).
New date_add syntax: date/datetime + INTERVAL # interval_type. By
Joshua Chamas.
Fixed privilege check for LOAD DATA REPLACE.
Automatic fixing of broken include files on Solaris 2.7
Some configure issues to fix problems with big filesystem detection.
Histrico de Alteraes do MySQL
964
REGEXP is now case-insensitive if you use non-binary strings.
D.4.58. Alteraes na distribuio 3.23.3
Added patches for MIT-pthreads on NetBSD.
Fixed range bug in MyISAM.
ASC is now the default again for ORDER BY.
Added LIMIT to UPDATE.
Added mysql_change_user() function to the MySQL C API.
Added character set to SHOW VARIABLES.
Added support of --[whitespace] comments.
Allow INSERT into tbl_name VALUES (), that is, you may now specify an empty va-
lue 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 re-
turned the rightmost pos characters.)
SUM() with GROUP BY returned 0 on some systems.
Changed output for SHOW TABLE STATUS.
Added DELAY_KEY_WRITE option to CREATE TABLE.
Allow AUTO_INCREMENT on any key part.
Fixed problem with YEAR(NOW()) and YEAR(CURDATE()).
Added CASE construct.
New function COALESCE().
D.4.59. Alteraes na distribuio 3.23.2 (09 Aug 1999)
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.
Running myisamchk without -a updated the index distribution incorrectly.
SET SQL_LOW_PRIORITY_UPDATES=1 was causing a parse error.
You can now update index columns that are used in the WHERE clause. UPDATE tbl_name
SET KEY=KEY+1 WHERE KEY > 100
Date handling should now be a bit faster.
Added handling of fuzzy dates (dates where day or month is 0), such as '1999-01-00'.
Fixed optimization of SELECT ... WHERE key_part1=const1 AND
key_part_2=const2 AND key_part1=const4 AND key_part2=const4; in-
dextype should be range instead of ref.
Histrico de Alteraes do MySQL
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.
MyISAM tables now allow keys on NULL and BLOB/TEXT columns.
The following join is now much faster: SELECT ... FROM t1 LEFT JOIN t2 ON ...
WHERE t2.not_null_column IS NULL.
ORDER BY and GROUP BY can be done on functions.
Changed handling of 'const_item' to allow handling of ORDER BY RAND().
Indexes are now used for WHERE key_column = function.
Indexes are now used for WHERE key_column = col_name even if the columns are not
identically packed.
Indexes are now used for WHERE col_name IS NULL.
Changed heap tables to be stored in low_byte_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.
Added --init-file=file_name option to mysqld.
Added COUNT(DISTINCT value, [value, ...]).
CREATE TEMPORARY TABLE now creates a temporary table, in its own namespace, that is
automatically deleted if connection is dropped.
New reserved words (required for CASE): CASE, THEN, WHEN, ELSE and END.
New functions EXPORT_SET() and MD5().
Support for the GB2312 Chinese character set.
D.4.60. Alteraes na distribuio 3.23.1
Fixed some compilation problems.
D.4.61. Alteraes na distribuio 3.23.0 (05 Aug 1999:
Alpha)
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 function LOAD_FILE(filename) to get the contents of a file as a string value.
New operator <=> which will act as = but will return TRUE if both arguments are NULL. This is
useful for comparing changes between tables.
Added the ODBC 3.0 EXTRACT(interval FROM datetime) function.
Histrico de Alteraes do MySQL
966
Columns defined as FLOAT(X) are not rounded on storage and may be in scientific notation
(1.0 E+10) when retrieved.
REPLACE is now faster than before.
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.)
SHOW TABLE STATUS returns a lot of information about the tables.
Added LIKE to the SHOW STATUS command.
Added Privileges column to SHOW COLUMNS.
Added Packed and Comment columns to SHOW INDEX.
Added comments to tables (with CREATE TABLE ... COMMENT "xxx").
Added UNIQUE, as in CREATE TABLE table_name (col INT not null UNIQUE)
New create syntax: CREATE TABLE table_name SELECT ...
New create syntax: CREATE TABLE IF NOT EXISTS ...
Allow creation of CHAR(0) columns.
DATE_FORMAT() now requires '%' before any format character.
DELAYED is now a reserved word (sorry about that :( ).
An example procedure is added: analyse, 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!
BINARY cast to force a string to be compared in case-sensitive fashion.
Added --skip-show-database option to mysqld.
Check whether a row has changed in an UPDATE now also works with BLOB/TEXT columns.
Added the INNER join syntax. NOTE: This made INNER a reserved word!
Added support for netmasks to the hostname in the MySQL grant tables. You can specify a net-
mask 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.
Fix storage of floating-point values in TIME columns.
Changed parsing of TIME strings to be more strict. Now the fractional second part is detected
(and currently skipped). The following formats are supported:
[[DAYS] [H]H:]MM:]SS[.fraction]
[[[[[H]H]H]H]MM]SS[.fraction]
Histrico de Alteraes do MySQL
967
Detect (and ignore) fractional second part from DATETIME.
Added the LOW_PRIORITY attribute to LOAD DATA INFILE.
The default index name now uses the same case as the column name on which the index name is
based.
Changed default number of connections to 100.
Use bigger buffers when using LOAD DATA INFILE.
DECIMAL(x,y) now works according to SQL-99.
Added aggregate UDF functions. Thanks to Andreas F. Bobak (<bobak@relog.ch>) for
this!
LAST_INSERT_ID() is now updated for INSERT INTO ... SELECT.
Some small changes to the join table optimiser to make some joins faster.
SELECT DISTINCT is much faster; it uses the new UNIQUE functionality in MyISAM. One
difference compared to MySQL Version 3.22 is that the output of DISTINCT is no longer sor-
ted.
All C client API macros are now functions to make shared libraries more reliable. Because of
this, you can no longer call mysql_num_fields() on a MYSQL object, you must use
mysql_field_count() instead.
Added use of LIBWRAP; patch by Henning P. Schmiedehausen.
Don't allow AUTO_INCREMENT for other than numerical columns.
Using AUTO_INCREMENT will now automatically make the column NOT NULL.
Show NULL as the default value for AUTO_INCREMENT columns.
Added SQL_BIG_RESULT; SQL_SMALL_RESULT is now default.
Added a shared library RPM. This enhancement was contributed by David Fox
(<dsfox@cogsci.ucsd.edu>).
Added --enable-large-files and --disable-large-files switches to confi-
gure. See configure.in for some systems where this is automatically turned off because of
broken implementations.
Upgraded readline to 4.0.
New CREATE TABLE options: PACK_KEYS and CHECKSUM.
Added --default-table-type option to mysqld.
D.5. Alteraes na distribuio 3.22.x (Old;
discontinued)
The 3.22 version has faster and safer connect code than version 3.21, as well as a lot of new nice
enhancements. As there aren't really any major changes, upgrading from 3.21 to 3.22 should be very
easy and painless. See Seco 2.5.4, Atualizando da verso 3.21 para 3.22.
D.5.1. Alteraes na distribuio 3.22.35
Histrico de Alteraes do MySQL
968
Fixed problem with STD().
Merged changes from the newest ISAM library from 3.23.
Fixed problem with INSERT DELAYED.
Fixed a bug core dump when using a LEFT JOIN/STRAIGHT_JOIN on a table with only one
row.
D.5.2. Alteraes na distribuio 3.22.34
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 fi-
les for 3.22.33 :(
D.5.3. Alteraes na distribuio 3.22.33
Fixed problems in Windows when locking tables with LOCK TABLE.
Quicker kill of SELECT DISTINCT queries.
D.5.4. Alteraes na distribuio 3.22.32 (14 Feb 2000)
Fixed problem when storing numbers in timestamps.
Fix problem with timezones that have half hour offsets.
Added mysqlhotcopy, a fast online hot-backup utility for local MySQL databases. By Tim
Bunce.
New more secure mysqlaccess. Thanks to Steve Harvey for this.
Fixed security problem in the protocol regarding password checking.
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.
D.5.5. Alteraes na distribuio 3.22.31
A few small fixes for the Windows version.
D.5.6. Alteraes na distribuio 3.22.30
Fixed optimiser problem on SELECT when using many overlapping indexes.
Disabled floating-point exceptions for FreeBSD to fix core dump when doing SELECT FLO-
OR(POW(2,63)).
Histrico de Alteraes do MySQL
969
Added print of default arguments options to all clients.
Fixed critical problem with the WITH GRANT OPTION option.
Fixed non-critical Y2K problem when writing short date to log files.
D.5.7. Alteraes na distribuio 3.22.29 (02 Jan 2000)
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.
Added latest patches to MIT-pthreads for NetBSD.
Fixed problem with timezones that are < GMT -11.
Fixed a bug when deleting packed keys in NISAM.
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.
Added mysqlshutdown.exe and mysqlwatch.exe to the Windows distribution.
Fixed problem when doing ORDER BY on a reference key.
Fixed that INSERT DELAYED doesn't update timestamps that are given.
D.5.8. Alteraes na distribuio 3.22.28 (20 Oct 1999)
Fixed problem with LEFT JOIN and COUNT() on a column which was declared NULL + and
it had a DEFAULT value.
Fixed core dump problem when using CONCAT() in a WHERE clause.
Fixed problem with AVG() and STD() with NULL values.
D.5.9. Alteraes na distribuio 3.22.27
Fixed prototype in my_ctype.h when using other character sets.
Some configure issues to fix problems with big filesystem detection.
Fixed problem when sorting on big BLOB columns.
ROUND() will now work on Windows.
D.5.10. Alteraes na distribuio 3.22.26 (16 Sep
1999)
Fixed core dump with empty BLOB/TEXT column argument to REVERSE().
Extended /*! */ with version numbers.
Histrico de Alteraes do MySQL
970
Changed SUBSTRING(text FROM pos) to conform to SQL-99. (Before this construct re-
turned the rightmost 'pos' characters.)
Fixed problem with LOCK TABLES combined with DELETE FROM table
Fixed problem that INSERT ... SELECT didn't use BIG_TABLES.
SET SQL_LOW_PRIORITY_UPDATES=# didn't work.
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 in compression key handling in ISAM.
D.5.11. Alteraes na distribuio 3.22.25
Fixed some small problems with the installation.
D.5.12. Alteraes na distribuio 3.22.24 (05 Jul 1999)
DATA is no longer a reserved word.
Fixed optimiser bug with tables with only one row.
Fixed bug when using LOCK TABLES table_name READ; FLUSH TABLES;
Applied some patches for HP-UX.
isamchk should now work on Windows.
Changed configure to not use big file handling on Linux as this crashes some Red Hat 6.0
systems
D.5.13. Alteraes na distribuio 3.22.23 (08 Jun
1999)
Upgraded to use Autoconf 2.13, Automake 1.4 and libtool 1.3.2.
Better support for SCO in configure.
Added option --defaults-file=file_name to option file handling to force use of only
one specific option file.
Extended CREATE syntax to ignore MySQL Version 3.23 keywords.
Fixed deadlock problem when using INSERT DELAYED on a table locked with LOCK TA-
BLES.
Fixed deadlock problem when using DROP TABLE on a table that was locked by another thre-
ad.
Add logging of GRANT/REVOKE commands in the update log.
Histrico de Alteraes do MySQL
971
Fixed isamchk to detect a new error condition.
Fixed bug in NATURAL LEFT JOIN.
D.5.14. Alteraes na distribuio 3.22.22 (30 Apr
1999)
Fixed problem in the C API when you called mysql_close() directly after
mysql_init().
Better client error message when you can't open socket.
Fixed delayed_insert_thread counting when you couldn't create a new delayed_insert
thread.
Fixed bug in CONCAT() with many arguments.
Added patches for DEC 3.2 and SCO.
Fixed path-bug when installing MySQL as a service on NT.
MySQL on Windows is now compiled with VC++ 6.0 instead of with VC++ 5.0.
New installation setup for MySQL on Windows.
D.5.15. Alteraes na distribuio 3.22.21
Fixed problem with DELETE FROM TABLE when table was locked by another thread.
Fixed bug in LEFT JOIN involving empty tables.
Changed the mysql.db column from CHAR(32) to CHAR(60).
MODIFY and DELAYED are no longer reserved words.
Fixed a bug when storing days in a TIME column.
Fixed a problem with Host '...' is not allowed to connect to this
MySQL server after one had inserted a new MySQL user with a GRANT command.
Changed to use TCP_NODELAY also on Linux (should give faster TCP/IP connections).
D.5.16. Alteraes na distribuio 3.22.20 (18 Mar
1999)
Fixed STD() for big tables when result should be 0.
The update log didn't have newlines on some operating systems.
INSERT DELAYED had some garbage at end in the update log.
D.5.17. Alteraes na distribuio 3.22.19 (Mar 1999:
Histrico de Alteraes do MySQL
972
Production)
Fixed bug in mysql_install_db (from 3.22.17).
Changed default key cache size to 8M.
Fixed problem with queries that needed temporary tables with BLOB columns.
D.5.18. Alteraes na distribuio 3.22.18
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 effici-
ently.
D.5.19. Alteraes na distribuio 3.22.17
Fixed a core dump problem when using --log-update and connecting without a default da-
tabase.
Fixed some configure and portability problems.
Using LEFT JOIN on tables that had circular dependencies caused mysqld to hang forever.
D.5.20. Alteraes na distribuio 3.22.16 (Feb 1999:
Gamma)
mysqladmin processlist could kill the server if a new user logged in.
DELETE FROM tbl_name WHERE key_column=col_name didn't find any matching
rows. Fixed.
DATE_ADD(column, ...) didn't work.
INSERT DELAYED could deadlock with status 'upgrading lock'
Extended ENCRYPT() to take longer salt strings than 2 characters.
longlong2str is now much faster than before. For Intel x86 platforms, this function is
written in optimised assembler.
Added the MODIFY keyword to ALTER TABLE.
D.5.21. Alteraes na distribuio 3.22.15
GRANT used with IDENTIFIED BY didn't take effect until privileges were flushed.
Name change of some variables in SHOW STATUS.
Histrico de Alteraes do MySQL
973
Fixed problem with ORDER BY with 'only index' optimization when there were multiple key de-
finitions 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.
Added BENCHMARK(loop_count,expression) function to time expressions.
D.5.22. Alteraes na distribuio 3.22.14
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.
Names for user-defined functions are no longer case-sensitive.
Added escape of ^Z (ASCII 26) to \Z as ^Z doesn't work with pipes on Windows.
mysql_fix_privileges adds a new column to the mysql.func to support aggregate
UDF functions in future MySQL releases.
D.5.23. Alteraes na distribuio 3.22.13
Saving NOW(), CURDATE() or CURTIME() directly in a column didn't work.
SELECT COUNT(*) ... LEFT JOIN ... didn't work with no WHERE part.
Updated config.guess to allow MySQL to configure on UnixWare 7.1.x.
Changed the implementation of pthread_cond() on the Windows version. get_lock()
now correctly times out on Windows!
D.5.24. Alteraes na distribuio 3.22.12
Histrico de Alteraes do MySQL
974
Fixed problem when using DATE_ADD() and DATE_SUB() in a WHERE clause.
You can now set the password for a user with the GRANT ... TO user IDENTIFIED BY
'password' syntax.
Fixed bug in GRANT checking with SELECT on many tables.
Added missing file mysql_fix_privilege_tables to the RPM distribution. This is not
run by default because it relies on the client package.
Added option SQL_SMALL_RESULT to SELECT to force use of fast temporary tables when
you know that the result set will be small.
Allow use of negative real numbers without a decimal point.
Day number is now adjusted to maximum days in month if the resulting month after
DATE_ADD/DATE_SUB() doesn't have enough days.
Fix that GRANT compares columns in case-insensitive fashion.
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.
D.5.25. Alteraes na distribuio 3.22.11
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 IN-
DEX.
GRANT to allow/deny users table and column access.
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.
New status variables: aborted_threads, aborted_connects.
New option variable: connection_timeout.
Added support for Thai sorting (by Pruet Boonma
<pruet@ds90.intanon.nectec.or.th>).
Slovak and Japanese error messages.
Configuration and portability fixes.
Added option SET SQL_WARNINGS=1 to get a warning count also for simple (single-row) in-
serts.
MySQL now uses SIGTERM instead of SIGQUIT with shutdown to work better on FreeBSD.
Added option \G (print vertically) to mysql.
SELECT HIGH_PRIORITY ... killed mysqld.
Histrico de Alteraes do MySQL
975
IS NULL on a AUTO_INCREMENT column in a LEFT JOIN didn't work as expected.
New function MAKE_SET().
D.5.26. Alteraes na distribuio 3.22.10
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).
Fixed a bug in ALTER TABLE that caused mysqld to crash.
MySQL now always reports the conflicting key values when a duplicate key entry occurs.
(Before this was only reported for INSERT.)
New syntax: INSERT INTO tbl_name SET col_name=value,
col_name=value, ...
Most errors in the .err log are now prefixed with a time stamp.
Added option MYSQL_INIT_COMMAND to mysql_options() to make a query on connect
or reconnect.
Added option MYSQL_READ_DEFAULT_FILE and MYSQL_READ_DEFAULT_GROUP to
mysql_options() to read the following parameters from the MySQL option files: port,
socket, compress, password, pipe, timeout, user, init-command, host and
database.
Added maybe_null to the UDF structure.
Added option IGNORE to INSERT statements with many rows.
Fixed some problems with sorting of the koi8 character sets; users of koi8 must run
isamchk -rq on each table that has an index on a CHAR or VARCHAR column.
New script mysql_setpermission, by Luuk de Boer. It allows easy creation of new users
with permissions for specific databases.
Allow use of hexadecimal strings (0x...) when specifying a constant string (like in the column
separators with LOAD DATA INFILE).
Ported to OS/2 (thanks to Antony T. Curtis <antony.curtis@olcs.net>).
Added more variables to SHOW STATUS and changed format of output to be like SHOW VA-
RIABLES.
Added extended-status command to mysqladmin which will show the new status varia-
bles.
D.5.27. Alteraes na distribuio 3.22.9
SET SQL_LOG_UPDATE=0 caused a lockup of the server.
New SQL command: FLUSH [ TABLES | HOSTS | LOGS | PRIVILEGES ] [,
...]
Histrico de Alteraes do MySQL
976
New SQL command: KILL thread_id.
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 thre-
ad waiting for another SELECT to get a WRITE LOCK.
Moved wild_compare() to string class to be able to use LIKE on BLOB/TEXT columns
with \0.
Added ESCAPE option to LIKE.
Added a lot more output to mysqladmin debug.
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.
D.5.28. Alteraes na distribuio 3.22.8
Czech character sets should now work much better.
DATE_ADD() and DATE_SUB() didn't work with group functions.
mysql will now also try to reconnect on USE database commands.
Fix problem with ORDER BY and LEFT JOIN and const tables.
Fixed problem with ORDER BY if the first ORDER BY column was a key and the rest of the
ORDER BY columns wasn't part of the key.
Fixed a big problem with OPTIMIZE TABLE.
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).
Fixed problems with TIME columns and negative strings.
Added an extra thread signal loop on shutdown to avoid some error messages from the client.
MySQL now uses the next available number as extension for the update log file.
Added patches for UNIXWARE 7.
D.5.29. Alteraes na distribuio 3.22.7 (Sep 1998:
Beta)
Added LIMIT clause for the DELETE statement.
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.
Histrico de Alteraes do MySQL
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 inte-
grated isamchk for more speed.
Upgraded libtool to get the configure more portable.
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.
Added the --log-long-format option to mysqld to enable timestamps and INSERT_IDs
in the update log.
Added --where option to mysqldump (patch by Jim Faucette).
The lexical analyser now uses ``perfect hashing'' for faster parsing of SQL statements.
D.5.30. Alteraes na distribuio 3.22.6
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.
Fixed small optimise problem when updating keys.
Changed makefiles to support shared libraries.
MySQL-NT can now use named pipes, which means that you can now use MySQL-NT without
having to install TCP/IP.
D.5.31. Alteraes na distribuio 3.22.5
All table lock handing is changed to avoid some very subtle deadlocks when using DROP TA-
BLE, ALTER TABLE, DELETE FROM TABLE and mysqladmin flush-tables under
heavy usage. Changed locking code to get better handling of locks of different types.
Updated DBI to 1.00 and DBD to 1.2.0.
Added a check that the error message file contains error messages suitable for the current versi-
on 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.
The return type of mysql_fetch_lengths() has changed from uint * to ulong *.
This may give a warning for old clients but should work on most machines.
Histrico de Alteraes do MySQL
978
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 na-
mes.
New better compressed server/client protocol.
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 privi-
lege to bypass the update log. (Modified patch from Sergey A Mukhin
<violet@rosnet.net>.)
Fixed fatal bug in LPAD().
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.
Increased the default value of max_allowed_packet to 1M in mysqld.
Added --low-priority-updates option to mysqld, to give table-modifying operations
(INSERT, REPLACE, UPDATE, DELETE) lower priority than retrievals. You can now use
{INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... You can also
use SET SQL_LOW_PRIORITY_UPDATES={0|1} to change the priority for one thread.
One side effect is that LOW_PRIORITY is now a reserved word. :(
Add support for INSERT INTO table ... VALUES(...),(...),(...), to allow in-
serting multiple rows with a single statement.
INSERT INTO tbl_name is now also cached when used with LOCK TABLES. (Previously
only INSERT ... SELECT and LOAD DATA INFILE were cached.)
Allow GROUP BY functions with HAVING:
mysql> SELECT col FROM table GROUP BY col HAVING COUNT(*)>0;
mysqld will now ignore trailing ';' characters in queries. This is to make it easier to migrate
from some other SQL servers that require the trailing ';'.
Fix for corrupted fixed-format output generated by SELECT INTO OUTFILE.
Warning: incompatible change! Added Oracle GREATEST() and LEAST() functions. You
must now use these instead of the MAX() and MIN() functions to get the largest/smallest value
from a list of values. These can now handle REAL, BIGINT and string (CHAR or VARCHAR) va-
lues.
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.
Histrico de Alteraes do MySQL
979
Added --vertical option to mysql, for printing results in vertical mode.
Index-only optimization; some queries are now resolved using only indexes. Until MySQL 4.0,
this works only for numeric columns. See Seco 5.4.3, Como o MySQL Utiliza ndices.
Lots of new benchmarks.
A new C API chapter and lots of other improvements in the manual.
D.5.32. Alteraes na distribuio 3.22.4
Added --tmpdir option to mysqld, for specifying the location of the temporary file direc-
tory.
MySQL now automatically changes a query from an ODBC client:
SELECT ... FROM table WHERE auto_increment_column IS NULL
to:
SELECT ... FROM table WHERE auto_increment_column == LAST_INSERT_ID()
This allows some ODBC programs (Delphi, Access) to retrieve the newly inserted row to fetch
the AUTO_INCREMENT id.
DROP TABLE now waits for all users to free a table before deleting it.
Fixed small memory leak in the new connect protocol.
New functions BIN(), OCT(), HEX() and CONV() for converting between different number
bases.
Added function SUBSTRING() with 2 arguments.
If you created a table with a record length smaller than 5, you couldn't delete rows from the ta-
ble.
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.
Fixed table locks for Windows.
Allow '$' in identifiers.
Changed name of user-specific configuration file from my.cnf to .my.cnf (Unix only).
Added DATE_ADD() and DATE_SUB() functions.
D.5.33. Alteraes na distribuio 3.22.3
Fixed a lock problem (bug in MySQL Version 3.22.1) when closing temporary tables.
Added missing mysql_ping() to the client library.
Histrico de Alteraes do MySQL
980
Added --compress option to all MySQL clients.
Changed byte to char in mysql.h and mysql_com.h.
D.5.34. Alteraes na distribuio 3.22.2
Searching on multiple constant keys that matched more than 30% of the rows didn't always use
the best possible key.
New functions <<, >>, RPAD() and LPAD().
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 Chu-
makov <nikkic@cityline.ru>).
Trailing spaces are now ignored when comparing case-sensitive strings; this should fix some
problems with ODBC and flag 512!
Fixed a core dump bug in the range optimiser.
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 lots of new options to mysqldump.
Server error messages are now in mysqld_error.h.
The server/client protocol now supports compression.
All bug fixes from MySQL Version 3.21.32.
D.5.35. Alteraes na distribuio 3.22.1 (Jun 1998:
Alpha)
Added new C API function mysql_ping().
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 mysql_options(...,MYSQL_OPT_CONNECT_TIMEOUT,...) so you can set a
timeout for connecting to a server.
Added --timeout option to mysqladmin, as a test of mysql_options().
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 ta-
ble.
WEEK() now takes an optional argument to allow handling of weeks when the week starts on
Histrico de Alteraes do MySQL
981
Monday (some European countries). By default, WEEK() assumes the week starts on Sunday.
TIME columns weren't stored properly (bug in MySQL Version 3.22.0).
UPDATE now returns information about how many rows were matched and updated, and how
many ``warnings'' occurred when doing the update.
Fixed incorrect result from FORMAT(-100,2).
ENUM and SET columns were compared in binary (case-sensitive) fashion; changed to be case-
insensitive.
D.5.36. Alteraes na distribuio 3.22.0
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 pass-
word '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 se-
conds, 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;
Histrico de Alteraes do MySQL
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!
Added optimization of not_null_column IS NULL (needed for some Access queries).
Allow STRAIGHT_JOIN to be used between two tables to force the optimiser to join them in a
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 FI-
ELD_TYPE_CHAR.
CREATE INDEX and DROP INDEX are now implemented through ALTER TABLE. CREATE
TABLE is still the recommended (fast) way to create indexes.
Added --set-variable option wait_timeout to mysqld.
Added time column to mysqladmin processlist to show how long a query has taken or
how long a thread has slept.
Added lots of new variables to show variables and some new to show status.
Added new type YEAR. YEAR is stored in 1 byte with allowable values of 0, and 1901 to 2155.
Added new DATE type that is stored in 3 bytes rather than 4 bytes. All new tables are created
with the new date type if you don't use the --old-protocol option to mysqld.
Fixed bug in record caches; for some queries, you could get Error from table hand-
ler: # on some operating systems.
Added --enable-assembler option to configure, for x86 machines (tested on Linux +
gcc). This will enable assembler functions for the most important string functions for more spe-
ed!
D.6. Alteraes na distribuio 3.21.x
Version 3.21 is quite old now, and should be avoided if possible. This information is kept here for
historical purposes only.
D.6.1. Alteraes na distribuio 3.21.33
Fixed problem when sending SIGHUP to mysqld; mysqld core dumped when starting from
boot on some systems.
Fixed problem with losing a little memory for some connections.
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.
INSERT INTO TABLE (timestamp_column) VALUES (NULL); didn't set times-
tamp.
D.6.2. Alteraes na distribuio 3.21.32
Histrico de Alteraes do MySQL
983
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 so-
me 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 opti-
on. 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 re-
fresh (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.
D.6.3. Alteraes na distribuio 3.21.31
Fixed a sign extension problem for the TINYINT type on Irix.
Fixed problem with LEFT("constant_string",function).
Fixed problem with FIND_IN_SET().
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.
D.6.4. Alteraes na distribuio 3.21.30
mysql now returns an exit code > 0 if the query returned an error.
Saving of command-line history to file in mysql client. By Tommy Larsen
<tommy@mix.hive.no>.
Fixed problem with empty lines that were ignored in mysql.cc.
Save the pid of the signal handler thread in the pid file instead of the pid of the main thread.
Added patch by <tommy@valley.ne.jp> to support Japanese characters SJIS and UJIS.
Changed safe_mysqld to redirect startup messages to 'hostname'.err instead of
'hostname'.log to reclaim file space on mysqladmin refresh.
ENUM always had the first entry as default value.
ALTER TABLE wrote two entries to the update log.
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.
Histrico de Alteraes do MySQL
984
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.
D.6.5. Alteraes na distribuio 3.21.29
LOCK TABLES + DELETE from tbl_name never removed locks properly.
Fixed problem when grouping on an OR function.
Fixed permission problem with umask() and creating new databases.
Fixed permission problem on result file with SELECT ... INTO OUTFILE ...
Fixed problem in range optimiser (core dump) for a very complex query.
Fixed problem when using MIN(integer) or MAX(integer) in GROUP BY.
Fixed bug on Alpha when using integer keys. (Other keys worked on Alpha.)
Fixed bug in WEEK("XXXX-xx-01").
D.6.6. Alteraes na distribuio 3.21.28
Fixed socket permission (clients couldn't connect to Unix socket on Linux).
Fixed bug in record caches; for some queries, you could get Error from table hand-
ler: # on some operating systems.
D.6.7. Alteraes na distribuio 3.21.27
Added user level lock functions GET_LOCK(string,timeout), RELEA-
SE_LOCK(string).
Added Opened_tables to show status.
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.
Changed configure for detection of FreeBSD 3.0 9803xx and above
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.
Added umask() to make log files non-readable for normal users.
Ignore users with old (8-byte) password on startup if not using --old-protocol option to
Histrico de Alteraes do MySQL
985
mysqld.
SELECT which matched all key fields returned the values in the case of the matched values, not
of the found values. (Minor problem.)
D.6.8. Alteraes na distribuio 3.21.26
FROM_DAYS(0) now returns "0000-00-00".
In DATE_FORMAT(), PM and AM were swapped for hours 00 and 12.
Extended the default maximum key size to 256.
Fixed bug when using BLOB/TEXT in GROUP BY with many tables.
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.
D.6.9. Alteraes na distribuio 3.21.25
Changed typedef 'string' to typedef 'my_string' for better portability.
You can now kill threads that are waiting on a disk-full condition.
Fixed some problems with UDF functions.
Added long options to isamchk. Try isamchk --help.
Fixed a bug when using 8 bytes long (alpha); filesort() didn't work. Affects DISTINCT,
ORDER BY and GROUP BY on 64-bit processors.
D.6.10. Alteraes na distribuio 3.21.24
Dynamic loadable functions. Based on source from Alexis Mikhailov.
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.
Added Italian error messages from <brenno@dewinter.com>.
configure now works better on OSF/1 (tested on 4.0D).
Histrico de Alteraes do MySQL
986
Added hooks to allow LIKE optimization with international character support.
Upgraded DBI to 0.93.
D.6.11. Alteraes na distribuio 3.21.23
The following symbols are now reserved words: TIME, DATE, TIMESTAMP, TEXT, BIT,
ENUM, NO, ACTION, CHECK, YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, STATUS, VA-
RIABLES.
Setting a TIMESTAMP to NULL in LOAD DATA INFILE ... didn't set the current time for
the TIMESTAMP.
Fix BETWEEN to recognise binary strings. Now BETWEEN is case-sensitive.
Added --skip-thread-priority option to mysqld, for systems where mysqld's thread
scheduling doesn't work properly (BSDI 3.1).
Added ODBC functions DAYNAME() and MONTHNAME().
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 expressi-
ons.
Added variables command to mysqladmin.
A lot of small changes to the binary releases.
Fixed a bug in the new protocol from MySQL Version 3.21.20.
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.
MySQL can now be started as a service on NT.
D.6.12. Alteraes na distribuio 3.21.22
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.
Fixed bug in ORDER BY on string formula with possible NULL values.
Fixed problem in range optimiser when using <= on sub index.
Histrico de Alteraes do MySQL
987
Added functions DAYOFYEAR(), DAYOFMONTH(), MONTH(), YEAR(), WEEK(), QUAR-
TER(), HOUR(), MINUTE(), SECOND() and FIND_IN_SET().
Added SHOW VARIABLES command.
Added support of ``long constant strings'' from SQL-99:
mysql> SELECT 'first ' 'second'; -> 'first second'
Upgraded Msql-Mysql-modules to 1.1825.
Upgraded mysqlaccess to 2.02.
Fixed problem with Russian character set and LIKE.
Ported to OpenBSD 2.1.
New Dutch error messages.
D.6.13. Alteraes na distribuio 3.21.21a
Configure changes for some operating systems.
D.6.14. Alteraes na distribuio 3.21.21
Fixed optimiser bug when using WHERE data_field = date_field2 AND da-
te_field2 = constant.
Added SHOW STATUS command.
Removed manual.ps from the source distribution to make it smaller.
D.6.15. Alteraes na distribuio 3.21.20
Changed the maximum table name and column name lengths from 32 to 64.
Aliases can now be of ``any'' length.
Fixed mysqladmin stat to return the right number of queries.
Changed protocol (downward compatible) to mark if a column has the AUTO_INCREMENT at-
tribute or is a TIMESTAMP. This is needed for the new Java driver.
Added Hebrew sorting order by Zeev Suraski.
Solaris 2.6: Fixed configure bugs and increased maximum table size from 2G to 4G.
D.6.16. Alteraes na distribuio 3.21.19
Upgraded DBD to 1.1823. This version implements mysql_use_result in DBD-Mysql.
Benchmarks updated for empress (by Luuk).
Histrico de Alteraes do MySQL
988
Fixed a case of slow range searching.
Configure fixes (Docs directory).
Added function REVERSE() (by Zeev Suraski).
D.6.17. Alteraes na distribuio 3.21.18
Issue error message if client C functions are called in wrong order.
Added automatic reconnect to the libmysql.c library. If a write command fails, an automatic
reconnect is done.
Small sort sets no longer use temporary files.
Upgraded DBI to 0.91.
Fixed a couple of problems with LEFT OUTER JOIN.
Added CROSS JOIN syntax. CROSS is now a reserved word.
Recoded yacc/bison stack allocation to be even safer and to allow MySQL to handle even
bigger expressions.
Fixed a couple of problems with the update log.
ORDER BY was slow when used with key ranges.
D.6.18. Alteraes na distribuio 3.21.17
Changed documentation string of --with-unix-socket-path to avoid confusion.
Added ODBC and SQL-99 style LEFT OUTER JOIN.
The following are new reserved words: LEFT, NATURAL, USING.
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 mat-
ching 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 wai-
ting 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 modifi-
ed.
LIMIT offset,count didn't work in INSERT ... SELECT.
Optimized key block caching. This will be quicker than the old algorithm when using bigger key
caches.
D.6.19. Alteraes na distribuio 3.21.16
Histrico de Alteraes do MySQL
989
Added ODBC 2.0 & 3.0 functions POWER(), SPACE(), COT(), DEGREES(), RADIANS(),
ROUND(2 arg) and TRUNCATE().
Warning: Incompatible change! LOCATE() parameters were swapped according to ODBC
standard. Fixed.
Added function TIME_TO_SEC().
In some cases, default values were not used for NOT NULL fields.
Timestamp wasn't always updated properly in UPDATE SET ... statements.
Allow empty strings as default values for BLOB and TEXT, to be compatible with mysqldump.
D.6.20. Alteraes na distribuio 3.21.15
Warning: Incompatible change! mysqlperl is now from Msql-Mysql-modules. This means
that connect() now takes host, database, user, password arguments! The old versi-
on took host, database, password, user.
Allow DATE '1997-01-01', TIME '12:10:10' and TIMESTAMP '1997-01-01
12:10:10' formats required by SQL-99. Warning: Incompatible change! This has the un-
fortunate side-effect that you no longer can have columns named DATE, TIME or TIMESTAMP.
:( Old columns can still be accessed through tablename.columnname!)
Changed Makefiles to hopefully work better with BSD systems. Also, manual.dvi is now in-
cluded in the distribution to avoid having stupid make programs trying to rebuild it.
readline library upgraded to version 2.1.
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, Post-
greSQL 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.
Fixed bug in range-optimiser that crashed MySQL on some queries.
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.
Added RENAME option to ALTER TABLE: ALTER TABLE name RENAME TO
new_name.
make_binary_distribution now includes libgcc.a in libmysqlclient.a. This
should make linking work for people who don't have gcc.
Changed net_write() to my_net_write() because of a name conflict with Sybase.