Adicionando um índice muito lento… existe um cmd mysql para obter um ETA ou mostrar progresso?

13

Atualmente, estou executando uma consulta alter na minha tabela (entradas de 20 milhões) para adicionar um índice. já está em execução há mais de 3 dias (preso em 'copiar para tabela tmp').

existe uma maneira de ver o progresso da consulta ou, em outras palavras, existe uma maneira de obter um tempo de conclusão da estimativa?

obrigado.

Atai Voltaire
fonte
4
MyISAM? InnoDB? Se o InnoDB, o arquivo por tabela está ativado?
Charles
Ótima pergunta - melhor coisa que eu posso pensar imediatamente é fazer uma estimativa aproximada usando o tamanho dos arquivos temporários e reais matérias - vai fazer mais algumas pesquisas embora
Por favor, SHOW CREATE TABLE tblname\Gsobre a mesa e diga-nos o índice que você deseja criar.
RolandoMySQLDBA 16/01

Respostas:

3

Quando o mysql altera uma tabela, ele essencialmente faz uma cópia dela e depois a troca. Dessa forma, se você cancelar a atualização no meio, a tabela ainda estará em um estado estável. Portanto, você pode procurar no diretório de dados do mysql (/ var / lib / mysql /?) Para ver o tamanho do novo arquivo, que lhe dirá qual o seu comprimento. Isso é um pouco mais difícil com o Innodb, mas há uma tabela tmp sendo criada em algum lugar.

Você pode reduzir significativamente a quantidade de tempo que um índice leva, aumentando suas variáveis ​​de buffer de classificação (myisam_sort_buffer_size, sort_buffer_size). Faça o maior tamanho possível com a memória que você possui. Você pode reduzir alguns dias do tempo de modificação e reduzi-lo a algumas horas, dependendo da quantidade de memória que você possui. Eu fiz uma tabela de 150 milhões de registros em cerca de 3 horas.


fonte
Infelizmente não consegui encontrar nenhuma tabela tmp. Eu uso o innoDB, com innodb_file_per_table definido como OFF.
2

Como innodb_fle_per_table está desativado, você não pode ver a tabela e medir o seu progresso.

Eu fiz um post anterior sobre como fazer isso no MyISAM . Você pode fazer isso no InnoDB se, e somente se, innodb_file_per_table estiver ativado, e você reprojetar a infraestrutura do InnoDB . Ainda é necessário procurar no sistema operacional os tamanhos dos arquivos em questão.

Depois de implementar totalmente a Limpeza do InnoDB e ativar o innodb_file_per_table, convém executar a atualização do índice da seguinte maneira:

EXEMPLO você tem o seguinte

  • Instância MySQL com / var / lib / mysql como datadir
  • Tabela do InnoDB chamada db.lotsofdatacom 20 milhões de nomes:

A tabela fica assim:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Suponha que você queira criar um índice de nome. Você consegue fazer isso:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

Enquanto o INSERT está em execução, você entra no sistema operacional e executa o seguinte:

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

Isso fornecerá uma lista do tamanho atual de lotsofdata_new.ibd. Quando fica maior que lotsofdata.ibd, então você sabe que está quase completo.

BTW MariaDB tem um Status de Progresso implementado internamente .

RolandoMySQLDBA
fonte
obrigado por seus feedbacks. por enquanto, decidi matar a consulta e tentar novamente depois de atualizar para a última versão do mysql. espero que seja mais tranquilo dessa maneira.
Atai Voltaire
1

Não há uma maneira confiável de ver o progresso de uma criação de índice. Se você tivesse innodb-file-per-table, poderia obter alguma indicação observando o arquivo .ibd temporário que está sendo criado no diretório de dados e compará-lo com o tamanho do arquivo atual, mas isso não é muito confiável, pois seu arquivo de dados atual pode ficar inchado devido a exclusões / fragmentação e o novo arquivo de dados terá um índice adicional que o anterior.

Parece que você está usando uma versão do MySQL sem o plugin InnoDB instalado. O plug-in do InnoDB possui criação rápida de índice, que não requer uma reconstrução completa da tabela para adições e exclusões de índice. O plugin InnoDB é ativado por padrão no MySQL 5.5 e está disponível com uma configuração em 5.1.38 e posterior.

  • Qual versão do MySQL você está usando?

De volta ao Percona Server, de muitas maneiras (anterior à 5.5), o InnoDB Plugin está ativado por padrão.

Aaron Brown
fonte
0

pt-online-schema-change da Percona mostra a estimativa de tempo restante. Por padrão, ele imprime a estimativa de tempo restante e a porcentagem de progresso a cada 30 segundos.

Ele também possui funções adicionais em comparação com apenas executar o comando ALTER por si só.

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

Haluk
fonte