MySQL 5.1.4x (Windows) | InnodbGenericName
Recentemente, limpei os dados de um banco de dados mySQL (algumas centenas de milhares de linhas) e estou planejando usar
OPTIMIZE TABLE LOGTABLEFOO1,LOGTABLEFOO2,LOGTABLEFOO3;
para reduzir a pegada de espaço de dados, o espaço em branco vazio está ocupando no sistema de arquivos.
Minha preocupação é que, assim que iniciar este comando, não saberei quanto tempo levará ou em que ponto do processo. Existe alguma maneira que eu possa determinar esta informação? Tanto quanto eu sei, não há nenhum indicador de progresso.
Não há nada que o MySQL tenha que indique o progresso do
OPTIMIZE TABLE;
.Você pode ter que acessar o sistema operacional usando o Windows Explorer e procurar uma tabela tmp crescente. Dica: Tabelas temporárias são tabelas MyISAM que não possuem uma extensão .
frm
arquivo com o nome#sql-9999.MYD
e#sql-9999.MYI
. Enquanto esses dois arquivos existirem, a consulta será considerada em andamento. Para saber até que ponto, seria preciso saber quantas linhas vezes o comprimento médio das linhas para estimar a porcentagem feita ou deixada a ser feita.MariaDB tem alguma medição de progresso para o seguinte :
ALTER TABLE
ADD INDEX
DROP INDEX
LOAD DATA INFILE
CHECK TABLE
REPAIR TABLE
ANALYZE TABLE
OPTIMIZE TABLE
Eu discuti o assunto antes em termos de operações do MySQL
May 02, 2012
: Como posso monitorar o andamento da importação de um arquivo .sql grande?Jan 17, 2012
: Adicionando um índice muito lento... existe um cmd do mysql para obter um ETA ou mostrar o progresso?Se você está tentando reduzir o tamanho de ibdata1 para InnoDB, descartar tabelas simplesmente deixa grandes lacunas em ibdata1. Você deve executar uma limpeza completa da infraestrutura InnoDB.
Apr 01, 2012
: innodb_file_per_table é aconselhável?Mar 25, 2012
: Por que o InnoDB armazena todos os bancos de dados em um arquivo?Mar 29, 2011
: Tamanho máximo da tabela para o servidor de banco de dados MySQL em execução no Windows (NTFS) Tipo de tabela InnoDBFeb 04, 2011
: MySQL InnoDB - innodb_file_per_table contras?Oct 29, 2010
: Howto: Limpar um mecanismo de armazenamento mysql InnoDB?ATUALIZAÇÃO 2012-12-21 19:30 EDT
Digamos que você queira correr
Veja dois cenários envolvendo innodb_file_per_table e este
OPTIMIZE TABLE
CENÁRIO #1: innodb_file_per_table desabilitado
A execução
OPTIMIZE TABLE
fará com que todos os dados e páginas de índicemydb.mytable
sejam anexados contiguamente a ibdata1. Isso deixará o espaço ocupado anteriormente para aumentar ainda mais a loucura da fragmentação.Nesse cenário, a tabela temporária existiria como InnoDB e se materializaria em ibdata1. Assim, não haveria nada para monitorar visualmente.
CENÁRIO #2: innodb_file_per_table ativado
Para cada tabela InnoDB mydb.mytable você teria
O
.ibd
arquivo contém os dados e as páginas de índice da tabela.A execução
OPTIMIZE TABLE
fará com que todos os dados e páginas de índicemydb.mytable
sejam gravados em um.ibd
arquivo externo que você pode ver no Windows Explorer.EMBARGO
Ativar innodb_file_per_table e executar
OPTIMIZE TABLE
nunca recuperará o espaço anteriormente ocupado em ibdata1. Você terá que realizar a limpeza do InnoDB para recriar o ibdata1 de forma que os dados e índices nunca mais residam no ibdata1.CONCLUSÃO
Como afirmado anteriormente, o MariaDB pode monitorar
OPTIMIZE TABLE;
Se você quiser algo que possa monitorar e tiver innodb_file_per_table ativado, poderá substituir
com o seguinte equivalente mecânico:
Tenha em mente que OPTIMIZE TABLE nada mais é
ALTER TABLE ... ENGINE=InnoDB;
do que ANALYZE TABLE .Com essas etapas, você sabe com antecedência quais são as tabelas temporárias
LOGTABLEFOO1_NEW.ibd
LOGTABLEFOO2_NEW.ibd
LOGTABLEFOO3_NEW.ibd
Simplesmente monitore a existência e o tamanho de cada arquivo até que ele desapareça.
Existe uma maneira mais simples, se você tiver acesso ao sistema de arquivos.
MySQL gera um arquivo .TMD; você pode observar o tamanho do arquivo crescendo; deve atingir mais ou menos o tamanho do seu MYD existente quando terminar.
Por exemplo, se você cd para o seu datadir, e simplesmente
watch "ls -lah|grep table_name"
retornará algo assim (no Linux). No meu caso, o progresso é de 287 MB de 427 MB (aproximadamente).O pt-online-schema-change do Percona Toolkit faz isso para você.
Altere
mydb.LOGTABLEFOO1
paraInnoDB
, executando efetivamenteOPTIMIZE TABLE
de maneira não bloqueante porque já é uma tabela InnoDB