AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 8011
Accepted
IcarusNM
IcarusNM
Asked: 2011-11-17 22:08:30 +0800 CST2011-11-17 22:08:30 +0800 CST 2011-11-17 22:08:30 +0800 CST

Alguma saída melhor do log do MySQL InnoDB "no futuro"?

  • 772

Eu tenho esse erro InnoDB no MySQL 5.0. Mysqld foi parado de forma limpa, mas consegui perder ib_logfile0 & ib_logfile1 depois. Agora, após uma inicialização limpa, o InnoDB fez sua "recuperação de falhas". Eu passei pelo negócio innodb_force_recovery=4, consertei uma tabela MyISAM travada e agora a replicação está pronta, além disso. Grandes números comprometidos:

111116 15:49:36  InnoDB: Error: page 393457 log sequence number 111 561,760,232
InnoDB: is in the future! Current system log sequence number 70 3,946,969,851.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.0/en/forcing-recovery.html
InnoDB: for more information.

Isso está em um servidor escravo. O erro acima vomita às centenas. Encontrei esta resposta: "insira e exclua > 64 GB de dados, para que o número de sequência de log seja inflado o suficiente".

http://forums.mysql.com/read.php?22,50163,50163#msg-50163

Esse número mágico de 64 GB vem de 4 GB * 16, onde o "número principal" do log innodb desse cara precisava aumentar de 0 a 15. O meu vai de 70 a 111 = 164 GB. Isso levará 5 dias. Continuarei trabalhando para acelerar meu script e executá-lo em paralelo para acelerar isso. Enquanto isso, espero que alguém tenha uma resposta melhor. Isso é bobo.

mysql innodb
  • 3 3 respostas
  • 45478 Views

3 respostas

  • Voted
  1. Best Answer
    IcarusNM
    2011-11-19T20:52:51+08:002011-11-19T20:52:51+08:00

    Esta era uma situação bastante rara. Espero nunca acabar lá novamente, com um InnoDB "número de sequência de log está no futuro!" erro. Por causa dos meus detalhes particulares, reconstruir/restaurar os dados do meu servidor foi o último recurso. Alguns truques para ajudar foram boas ideias, mas no final, decidi continuar melhorando meu script Perl para jogar esse jogo bobo e fazer o máximo de shows/hora que pudesse. Que diabos, é um bom teste de estresse do sistema.

    Lembre-se: o objetivo é aumentar um único contador ("log sequence number") que é armazenado em algum lugar nos cabeçalhos de ib_logfile0 e ib_logfile1 . Isso é para falsificar o InnoDB para que ele ignore uma aparente distorção do tempo e continue com a vida. Mas ninguém sabe como editar esse número. Ou se eles sabem, ninguém está falando.

    Aqui está o meu produto final. YMMV, mas usar a função REPEAT do mysql para gerar os dados internamente é altamente eficiente.

     #!/usr/bin/perl
     use DBI;
     $table = shift || die;
     $dbh = DBI->connect("DBI:mysql:junk:host=localhost", "user", "pass"); #Edit "junk" (DB name), user, and pass to suit.
     $dbh->do("DROP TABLE IF EXISTS $table");
     $dbh->do("CREATE TABLE $table (str TEXT) ENGINE=INNODB");
     $sth = $dbh->prepare("INSERT INTO $table (str) VALUES (REPEAT(?,1000000))");
     foreach (1..50) {
        $sth->execute('0123456789');   # 10 MB
     }
     $dbh->do("DELETE FROM $table");
    

    Minha receita sugerida:

    1. Crie um banco de dados 'lixo'
    2. Salve o script perl acima como junk.pl .
    3. Execute junk.pl data1 , junk.pl data2 , e junk.pl data3 , etc. tudo de uma vez, para tantos núcleos de CPU quanto o servidor de banco de dados tiver, para iniciar. Abra vários shells e envolva cada execução em um loop Bash: while true; do date; junk.pl dataX; done.

    Veja seu LSN crescer, talvez em outro loop:

     silly# echo "SHOW INNODB STATUS \G" | mysql -p'xxxxxx' | grep '^Log seq'
     Log sequence number 124 3871092821
     silly# echo "SHOW INNODB STATUS \G" | mysql -p'xxxxxx' | grep '^Log seq'
     Log sequence number 124 4209892586
     silly# echo "SHOW INNODB STATUS \G" | mysql -p'xxxxxx' | grep '^Log seq'
     Log sequence number 125 85212387
    

    O grande número é um INT de 32 bits não assinado que será encapsulado em 4 GB, aumentando o número menor a cada vez. Neste caso acima, ele apenas rolou de 124 para 125. Seu objetivo está oculto no mysqld.log que o enviou pesquisando no Google para esta solução ridícula em primeiro lugar. Depois de cruzar a linha de chegada, é isso! Sopre os chifres! Solte o confete!

    Barra lateral: Isso descobriu um bug interessante no mysqld 5.0 w/REPEAT: se você for para 20 MB, ele vira algum contador interno e rola para ~ 96 KB. Nenhum aviso ou erro em qualquer lugar. Eu não ia perder tempo rastreando isso. 10 MB funciona muito bem. Se você atingir algum outro limite, ele pode reclamar. Eu tenho vários buffers innodb aumentados do padrão. Tempere a gosto. Como sempre, observe mysqld.log em uma janela.

    • 10
  2. RolandoMySQLDBA
    2011-11-18T06:06:02+08:002011-11-18T06:06:02+08:00

    Você tem três (3) opções:

    OPÇÃO 01 : Execute rsync de Master to Slave (Downtime no Master)

    • Passo 01 : Executar reset master;no mestre (Zaps Binary Logs)
    • Passo 02: service mysql stopno mestre
    • Passo 03: service mysql stopno escravo
    • Passo 04: rsync /var/lib/mysql do mestre para o escravo
    • Passo 05: service mysql startno mestre
    • Etapa 06: Use o primeiro log binário no mestre como o log para iniciar a replicação. Use o tamanho do arquivo desse log como a posição para iniciar a replicação de
    • Passo 07 : service mysql stop --skip-slave-startno escravo
    • Etapa 08: Execute o comando CHANGE MASTER TO para configurar a replicação do log e a posição verificada na Etapa 06
    • Etapa 09 : Execute start slave;no escravo e deixe a replicação acompanhar

    OPÇÃO 02 : Execute rsync de Master to Slave (tempo de inatividade mínimo no mestre)

    • Passo 01 : Executar reset master;no mestre (Zaps Binary Logs)
    • Passo 02: service mysql stopno escravo
    • Passo 03: rsync /var/lib/mysql do mestre para o escravo
    • Passo 04: Repita o Passo 03 até que dois rsyncs consecutivos levem o mesmo tempo
    • Passo 05: service mysql stopno mestre
    • Passo 06: rsync /var/lib/mysql do mestre para o escravo
    • Passo 07: service mysql startno mestre
    • Etapa 08: Use o primeiro log binário no mestre como o log para iniciar a replicação. Use o tamanho do arquivo desse log como a posição para iniciar a replicação de
    • Passo 09 : service mysql stop --skip-slave-startno escravo
    • Etapa 10: Execute o comando CHANGE MASTER TO para configurar a replicação do log e a posição verificada na Etapa 08
    • Etapa 11: Execute start slave;no escravo e deixe a replicação acompanhar

    OPÇÃO 03 : Use o XtraBackup

    Esta ferramenta de software não apenas fará uma cópia não intrusiva de um mestre em execução, mas também criará os ib_logfiles correspondentes para você. Você teria que configurar a replicação

    Eu postei no StackExchange antes sobre este assunto

    • Como posso mover um banco de dados de um servidor para outro?
    • MySQL Community Edition: Posso replicar todo o meu servidor com outro servidor de uma só vez?
    • Como você sincroniza novamente o banco de dados MySQL mestre com as alterações do banco de dados escravo se o mestre ficar offline?
    • https://serverfault.com/questions/257394/create-a-mysql-slave-from-another-slave-but-point-it-at-the-master/257426#257426

    Eu fiz essas coisas muitas vezes para a empresa de hospedagem do meu empregador. Um cliente tinha 3,7 TB para mover e demorou cerca de 16 horas. 64 GB é muito pequeno em comparação.

    • 5
  3. Glenn Plas
    2013-01-08T08:51:09+08:002013-01-08T08:51:09+08:00

    Descobri que talvez haja uma maneira mais legal de resolver esse problema trabalhando em tabelas particionadas. Eu precisava eliminar partições de alguns anos atrás e tive que adicionar algumas para 2014. Quase todas as partições relatam esse erro, assim como as antigas. Acidente muito desagradável.

    Então, enquanto DROPPING old e usando REORGANIZE da partição MAXVALUE (a última), ele criará novos arquivos que estão ok, então eu recebo cada vez menos avisos. Enquanto isso, ajuda a incrementar o contador de sequência de log, então não preciso inserir dados falsos. Eu tenho isso acontecendo em um servidor mestre btw ...

    Então, é isso:

    ALTER TABLE Events DROP PARTITION p1530 , p1535 , p1540 , p1545 , 
    p1550, p1555 , p1560 , p1565 , p1570 , p1575 , p1580 , p1585 , p1590 , 
    p1595 , p1600 , p1605 , p1610 , p1615 , p1620 , p1625 , p1630 , p1635 , 
    p1640 , p1645 , p1650 , p1655 , p1660 , p1665 , p1670 , p1675 , p1680 , 
    p1685 , p1690 , p1695 , p1700 , p1705 , p1710 , p1715 , p1720 , p1725 , 
    p1730 , p1735 , p1740 , p1745 , p1750 , p1755 , p1760 , p1765 , p1770 , 
    p1775 , p1780 , p1785 , p1790 , p1795 , p1800 , p1805 , p1810 , p1815 , 
    p1820 , p1825 , p1830 , p1835 , p1840;
    

    E isto:

    ALTER table Events REORGANIZE PARTITION p3000 INTO (
    PARTITION p3500 VALUES LESS THAN (TO_DAYS('2013-01-01')),
    PARTITION p3510 VALUES LESS THAN (TO_DAYS('2013-01-04')),
    PARTITION p3520 VALUES LESS THAN (TO_DAYS('2013-01-07')),
    PARTITION p3530 VALUES LESS THAN (TO_DAYS('2013-01-10'))
    ...
    PARTITION p4740 VALUES LESS THAN (TO_DAYS('2014-01-08')),
    PARTITION p9000 VALUES LESS THAN MAXVALUE)
    

    Isso eliminará efetivamente cada partição na alteração e a recriará com uma cópia temporária do conteúdo do que estava lá. Você pode fazer isso por tabela, se quiser, meu aplicativo permite que isso aconteça, então não precisa se preocupar com backups sincronizados etc.

    Agora, para o resto da tabela, como não toquei em todas as partições no processo, algumas ficarão com o aviso de sequência de log, para aquelas que estão quebradas , mas cobertas por esta ação de reorganização, provavelmente executarei isso:

    ALTER TABLE Events REBUILD PARTITION p0, p1;
    

    ou aquilo

    ALTER TABLE Events OPTIMIZE PARTITION p0, p1;
    

    Então, isso me fez pensar, você poderia fazer isso com tabelas simples de baunilha, adicionar partições temporárias por hash e depois removê-las (ou mantê-las, posso recomendar fortemente partições).

    Estou usando mariadb no entanto, não mysql (então XtraDB)

    Talvez isso ajude alguém. Ainda estou rodando, até agora tudo bem. Mudar o ENGINE parece fazer o trabalho também, então eu o trago entre o MyIsam e eles de volta ao InnoDB.

    É bastante lógico, se você mudar ENGINE, a tabela desaparece do innodb, então não será mais um problema.

    ALTER TABLE Events ENGINE=MyISAM;
    ALTER TABLE Events ENGINE=InnoDB;
    

    parece funcionar aqui. Posso confirmar algumas coisas em tabelas particionadas:

    • ALTER TABLE xyz ENGINE=InnoDB é muito lento, para Aria (mariadb) duas vezes mais rápido, mas em geral uma maneira lenta de incrementar o contador de sequência de log
    • ALTER TABLE xyz REBUILD PARTITION ALL é a maneira mais rápida de 'consertar' as tabelas e ajudar a incrementar o contador
    • ALTER TABLE xyz ANALYZE PARTITION ALL é lento em comparação com o anterior e não reescreve partições que verificam que estão ok. REBUILD garante uma reescrita em um esquema de tabela temporária.

    Usei os últimos em várias mesas. Os avisos acontecem quando ele está tentando abrir os arquivos e há um para cada definição de partição aberta com problemas de contador. Quase rolou no balcão hoje para as últimas mesas. Eu acho que uma vez que tudo é processado, é necessário liberar os logs binários.

    atualização : posso concluir algumas coisas agora que consegui resolver esse problema.

    • Meu travamento foi causado pela reorganização de partições em uma tabela no formato Aria (MariaDB).
    • (para mim) fazer uma reconstrução das partições funcionou melhor e mais rápido para aumentar o contador de sequências. Alterar o mecanismo é lento e você precisa fazer isso duas vezes para afetar o innodb. alterar para o innoDB é bastante lento em relação ao MyIsam ou Aria.
    • Atualizei para o MariaDB 5.3 e não para 5.5 (era: 5.2) e funciona bem. Eu acho que há muitos problemas com aria, partições em 5.5 (e bugs confirmados) para usar essa combinação.
    • Realmente deveria haver uma maneira melhor de redefinir o contador de sequência de log.
    • 2

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve