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 / 6191
Accepted
randomx
randomx
Asked: 2011-09-27 12:30:30 +0800 CST2011-09-27 12:30:30 +0800 CST 2011-09-27 12:30:30 +0800 CST

Como você identifica a corrupção da tabela InnoDB?

  • 772

Eu tenho algumas tabelas que são particionadas e possuem vários índices em um escravo replicado. Depois de copiar o instantâneo (verificado seguro) para um novo escravo e atualizar o mysqld de 5.1.42 para 5.5.15 e reiniciar a replicação, estou recebendo falhas do InnoDB com a mensagem de erro "Ponteiro inválido ..."

Esses erros ocorreram em 2 servidores com hardware e sistema operacional diferentes. Depois de correr:

ALTER TABLE .... COALESCE PARTION n;

o problema desaparece para essa tabela.

Minha pergunta é maior em escopo, porém, e é "Como você identifica a corrupção da tabela InnoDB?" ou reformulado "Como você avalia a integridade da tabela InnoDB?" O "CHECK TABLE" é a única ferramenta disponível para identificar problemas pré-crash?

Não tenho certeza se isso importa, mas as falhas ocorreram executando: Versão: '5.5.15-55-log' socket: '/opt/mysql.sock' porta: 3306 Percona Server (GPL), Release rel21.0, Revisão 158

mysql innodb
  • 4 4 respostas
  • 57808 Views

4 respostas

  • Voted
  1. Best Answer
    Derek Downey
    2011-09-30T16:45:10+08:002011-09-30T16:45:10+08:00

    Morgan dá uma dica em seu comentário de que o InnoDB está constantemente verificando páginas corrompidas fazendo checksums nas páginas que lê. Se o InnoDB encontrar uma incompatibilidade de checksum, ele irá travar o servidor.

    Se você quiser acelerar esse processo (em vez de esperar que o InnoDB leia a página corrompida), você pode usar innochecksum:

    Como as incompatibilidades de soma de verificação farão com que o InnoDB desligue deliberadamente um servidor em execução, pode ser preferível usar essa ferramenta em vez de esperar que um servidor em uso de produção encontre as páginas danificadas.

    Uma ressalva interessante:

    innochecksum não pode ser usado em arquivos de tablespace que o servidor já tenha aberto. Para esses arquivos, você deve usar CHECK TABLE para verificar as tabelas dentro do tablespace.

    Então sim, para uma tabela online CHECK TABLEé provavelmente a ferramenta (ou como apontado em outra resposta mysqlcheck se você quiser fazer mais de um único banco de dados por vez).

    Se você pode desligar seu banco de dados, você pode forçar as somas de verificação usandoinnochecksum

    Anedótico: Em um tablespace innodb de 29 GB (com innodb_file_per_table=1), esse script levou cerca de 2 minutos

    #!/bin/bash
    for i in $(ls /var/lib/mysql/*/*.ibd)
    do
      innochecksum -v $i
    done
    

    Como um bônus, porém, como você está executando o Percona, eles implementaram um novo método para soma de verificação innodb rápida . Nunca usei, mas pode acelerar o processo.

    • 21
  2. marcio
    2011-09-28T03:30:51+08:002011-09-28T03:30:51+08:00

    AVISO: antes de tentar qualquer uma dessas instruções, é altamente recomendável verificar se há um backup íntegro do seu banco de dados em mãos, apenas por precaução. (obrigado @Nick pelo aviso)

    Tente usar o mysqlcheckcomando. Em um terminal:

    mysqlcheck -u username -p --databases database1 database2
    

    Este comando produzirá uma lista de todas as tabelas e um status informando se houve algum tipo de corrupção:

    table1  OK
    table2  OK
    table3  OK
    tableN  OK
    

    Com isso em mãos você já saberá quais mesas você precisa reparar. Apenas no caso de você querer reparar tudo de uma vez:

    mysqlcheck -u username -p --auto-repair --databases database1 database2 
    

    Mais sobre mysqlcheck: ​​http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.html

    Nota: você marcou sua pergunta com percona . Eu não tinha idéia do que era isso, então eu pesquisei. Parece ser um fork do MySQL, mas não tenho motivos para acreditar que os comandos são incompatíveis (dedos cruzados).


    Alguém me indicou este guia que tem instruções mais específicas para recuperação de banco de dados InnoDB para situações mais críticas em que todo o banco de dados não inicia: http://www.softwareprojects.com/resources/programming/t-how-to-fix-mysql -database-myisam-innodb-1634.html

    • 7
  3. RolandoMySQLDBA
    2011-09-28T11:58:33+08:002011-09-28T11:58:33+08:00

    De acordo com o Guia de Estudo de Certificação MySQL 5.0, Página 443.444 Seção 30.4 :

    Você pode verificar as tabelas do InnoDB usando o comando CHECK TABLE ou usando um programa cliente para emitir a instrução para você. No entanto, se uma tabela InnoDB tiver problemas, você não poderá corrigi-la usando REPAIR TABLE porque essa instrução se aplica apenas ao MyISAM.

    Se uma verificação de tabela indicar que uma tabela do InnoDB tem problemas, você poderá restaurar a tabela para um estado consistente despejando-a com mysqldump, descartando-a e recriando-a a partir desse despejo.

    No caso de um travamento de um servidor MySQL ou no host em que ele é executado, algumas tabelas InnoDB podem precisar de reparos. Normalmente, basta reiniciar o servidor porque o mecanismo de armazenamento InnoDB executa a recuperação automática como parte de sua sequência de inicialização. Em casos raros, o servidor pode não inicializar devido à falha da recuperação automática do InnoDB. Se isso acontecer, use o seguinte procedimento:

    • Reinicie o servidor com a opção --innodb_force_recovery definida para um valor de 1 a 6. Esses valores indicam níveis crescentes de cautela para evitar uma falha e níveis crescentes de tolerância para possíveis inconsistências nas tabelas recuperadas. Um bom valor para começar é 4.

    • Quando você inicia o servidor com --innodb_force_recovery definido como um valor diferente de zero, o InnoDB trata o tablespace como somente leitura. Consequentemente, você deve despejar as tabelas do InnoDB com mysqldump e depois eliminá-las enquanto a opção estiver em vigor. Em seguida, reinicie o servidor sem a opção --innodb_force_recovery. Quando o servidor for ativado, recupere as tabelas InnoDB dos arquivos de despejo.

    • Se as etapas anteriores falharem, é necessário restaurar as tabelas do InnoDB de um backup anterior.

    Por favor, leia MySQL Docs em InnoDB Forced Recovery  

    • 7
  4. RolandoMySQLDBA
    2011-10-01T02:43:04+08:002011-10-01T02:43:04+08:00

    Eu me pergunto o que acontece se alguém usar dados do InnoDB criados por meio do plug-in InnoDB e depois mudar para outra versão do InnoDB. Isso poderia criar uma possível corrupção de página aos olhos do mysqld.

    Observe o que a documentação do MySQL no formato de arquivo InnoDB diz sobre essa possibilidade:

    Em geral, uma versão mais recente do InnoDB pode criar uma tabela ou índice que não pode ser lido ou escrito com segurança com uma versão anterior do InnoDB sem risco de travamentos, travamentos, resultados errados ou corrupções. O plug-in InnoDB apresenta um novo mecanismo para proteger contra essas condições e ajudar a preservar a compatibilidade entre arquivos de banco de dados e versões do InnoDB.

    Eu descartaria os dados do escravo. Na verdade, eu apenas usaria força bruta obtendo um despejo lógico (mysqldump) dos dados:

    • Solte todos os bancos de dados usando o InnoDB no escravo
    • Desligue o mysql no escravo
    • Excluir ibdata1, ib_logfile0 e ib_logfile1 no escravo
    • Inicie o mysql no escravo, permitindo que ibdata1, ib_logfile0 e ib_logfile1 sejam recriados
    • mysqldump os dados do mestre no escravo

    Minha resposta original postada é considerada 'old school'. No entanto, neste caso, eu definitivamente examinaria os formatos de arquivo usados ​​por .ibd e/ou ibdata1.

    • 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