Como recuperar banco de dados MySQL de arquivos .myd, .myi, .frm

183

Como restaurar um dos meus bancos de dados MySQL a partir .myd, .myi, .frmarquivos?

chandrajeet
fonte
10
Embora eu tenha respondido a isso, ele realmente pertence ao Serverfault.
Derobert 18/05/09
31
@chandrajeet, você realmente deve aceitar a resposta mais votada.
Tower
2
Hey chandrajeet, por que você não aceita a resposta de derobert? Eu confirmo que funciona para mim também. Não é para você? stackoverflow.com/help/someone-answers
Taz

Respostas:

173

Se essas são tabelas MyISAM, a colocação dos arquivos .FRM, .MYD e .MYI em um diretório de banco de dados (por exemplo, /var/lib/mysql/dbname) tornará essa tabela disponível. Não precisa ser o mesmo banco de dados de onde vieram, o mesmo servidor, a mesma versão do MySQL ou a mesma arquitetura. Você também pode precisar alterar a propriedade da pasta (por exemplo, chown -R mysql:mysql /var/lib/mysql/dbname)

Observe que as permissões ( GRANT, etc.) fazem parte do mysqlbanco de dados. Portanto, eles não serão restaurados junto com as tabelas; pode ser necessário executar as GRANTinstruções apropriadas para criar usuários, conceder acesso etc. ( mysqlé possível restaurar o banco de dados, mas é necessário ter cuidado com as versões do MySQL e com as execuções necessárias do mysql_upgradeutilitário).

Na verdade, você provavelmente só precisa do .FRM (estrutura da tabela) e do .MYD (dados da tabela), mas precisará reparar a tabela para reconstruir o .MYI (índices).

A única restrição é que, se você estiver desatualizando, é melhor verificar as notas de versão (e provavelmente executar a tabela de reparo). Versões mais recentes do MySQL adicionam recursos, é claro.

[Embora deva ser óbvio, se você combinar e combinar tabelas, a integridade dos relacionamentos entre essas tabelas é seu problema; O MySQL não se importa, mas sua aplicação e seus usuários podem. Além disso, esse método não funciona de maneira alguma para tabelas do InnoDB. Somente o MyISAM, mas considerando os arquivos que você possui, você possui o MyISAM]

derobert
fonte
Isso realmente funcionaria sem adicionar as entradas apropriadas à tabela information_schema? Quero dizer, o MySQL precisa saber para procurar esses arquivos, certo?
Zenshai 18/05/09
4
As tabelas information_schema realmente não existem, são apenas visualizações no estado interno do banco de dados. Veja dev.mysql.com/doc/refman/5.0/en/information-schema.html
brian-brazil
4
Uau, eu me senti suja, mas remover o diretório inteiro do que eu acho que era uma instalação do MySQL4 no MySQL5.1 recriou magicamente as tabelas. Sem reinicialização ou qualquer coisa (no Windows).
Dave
4
Funciona, você só precisa se lembrar de executar (para todas as tabelas): check table sometable; e depois executar o reparo (apenas se necessário): repair table sometable;
Nux
3
Isso funcionou muito bem! Eu havia colocado os arquivos no lugar, mas o mysql não os estava "vendo" até mudar de propriedade para "mysql: mysql".
sean.boyer
26

Observe que se você deseja reconstruir o arquivo MYI, o uso correto de REPAIR TABLE é:

TABELA DE REPAROS sometable USE_FRM;

Caso contrário, você provavelmente obterá outro erro.

mcardellg
fonte
24

Acabei de descobrir a solução para isso. Estou usando o MySQL 5.1 ou 5.6 no Windows 7.

  1. Copie o arquivo .frm e ibdata1 do arquivo antigo localizado em "C: \ Dados do Programa \ MySQL \ MSQLServer5.1 \ Data"
  2. Pare a instância do servidor SQL na instância atual do SQL
  3. Vá para o diretório de dados localizado em "C: \ Dados do Programa \ MySQL \ MSQLServer5.1 \ Data"
  4. Cole o ibdata1 e a pasta do seu banco de dados que contém o arquivo .frm do arquivo que você deseja recuperar.
  5. Inicie a instância do MySQL.

Não é necessário localizar o arquivo .MYI e .MYD para esta recuperação.

alnel
fonte
Siga estas etapas (depois que tudo falhar) e use o innodb_force_recovery = 4nível (não tenho certeza de que era necessário neste caso). Obrigado Senhor!
Joshua Stewardson
6
FYI: ibdata1é o InnoDB, não o MyISAM.
Derobert
14

Uma coisa a observar:

O arquivo .FRM possui sua estrutura de tabela e é específico para sua versão do MySQL.

O arquivo .MYD NÃO é específico para a versão, pelo menos não para versões secundárias.

O arquivo .MYI é específico, mas pode ser deixado de fora e regenerado REPAIR TABLEcomo as outras respostas dizem.

O objetivo desta resposta é informar que, se você tiver um despejo de esquema de suas tabelas, poderá usá-lo para gerar a estrutura da tabela e substituir esses arquivos .MYD pelos backups, excluir os arquivos MYI e repará-los. tudo. Dessa forma, você pode restaurar seus backups para outra versão do MySQL ou mover seu banco de dados completamente sem usar mysqldump. Eu achei isso super útil ao mover grandes bancos de dados.

Brent
fonte
14

Simples! Crie um banco de dados fictício (digamos abc)

Copie todos esses arquivos .myd, .myi, .frm para mysql \ data \ abc, em que mysql \ data \ é o local onde estão armazenados .myd, .myi, .frm para todos os bancos de dados.

Então vá para phpMyadmin, vá para db abc e você encontrará seu banco de dados.

Vishal
fonte
a resposta mais curta e precisa
Serak Shiferaw 31/03
A melhor maneira de recuperar os dados ... Instalei o WAMP, criei um novo banco de dados, copie os arquivos no novo diretório C: \ WAMP64 \ bin \ mysql \ mysqlxx \ data \ newdatabase, abra o phpmyadmin e seu novo banco de dados, você ver os dados
Alexandre georges
7

Eu acho que .myi você pode reparar de dentro do mysql.

Se você vir esse tipo de mensagem de erro do MySQL: Falha no banco de dados ao executar a consulta (consulta) 1016: Não é possível abrir o arquivo: 'sometable.MYI'. (errno: 145) Erro Msg: 1034: arquivo de chave incorreto para a tabela: 'sometable'. Tente consertá-lo e você provavelmente tiver uma tabela com falha ou corrompida.

Você pode verificar e reparar a tabela a partir de um prompt do mysql como este:

check table sometable;
+------------------+-------+----------+----------------------------+
| Table | Op | Msg_type | Msg_text | 
+------------------+-------+----------+----------------------------+ 
| yourdb.sometable | check | warning | Table is marked as crashed | 
| yourdb.sometable | check | status | OK | 
+------------------+-------+----------+----------------------------+ 

repair table sometable;
+------------------+--------+----------+----------+ 
| Table | Op | Msg_type | Msg_text | 
+------------------+--------+----------+----------+ 
| yourdb.sometable | repair | status | OK | 
+------------------+--------+----------+----------+

e agora sua mesa deve ficar bem:

check table sometable;
+------------------+-------+----------+----------+ 
| Table | Op | Msg_type | Msg_text |
+------------------+-------+----------+----------+ 
| yourdb.sometable | check | status | OK |
+------------------+-------+----------+----------+
Elzo Valugi
fonte
6

Encontrei uma solução para converter os arquivos em um .sqlarquivo (você pode importar o .sqlarquivo para um servidor e recuperar o banco de dados), sem precisar acessar o /vardiretório, portanto, você não precisa ser um administrador de servidor para fazer isso.

Requer XAMPP ou MAMP instalado no seu computador.

  • Depois de instalar o XAMPP, navegue até o diretório de instalação (Normalmente C:\XAMPP) e o subdiretório mysql\data. O caminho completo deve serC:\XAMPP\mysql\data
  • Dentro, você verá pastas de outros bancos de dados criados. Copie e cole a pasta cheia de .myd, .myie .frmarquivos para lá. O caminho para essa pasta deve ser

    C:\XAMPP\mysql\data\foldername\.mydfiles

  • Então visite localhost/phpmyadminem um navegador. Selecione o banco de dados que você acabou de colar na mysql\datapasta e clique em Exportar na barra de navegação. Escolhe a exportação como um .sqlarquivo. Aparecerá perguntando onde salvar o arquivo

E é isso aí! Você (deve) têm agora um .sqlarquivo que contém a base de dados que era originalmente .myd, .myie .frmarquivos. Você pode importá-lo para outro servidor através do phpMyAdmin criando um novo banco de dados e pressionando 'Importar' na barra de navegação, seguindo as etapas para importá-lo

Kaspar Lee
fonte
5

É possível copiar os arquivos em um diretório subdiretório nomeado adequadamente da pasta de dados, desde que seja a mesma versão EXATA do mySQL e você tenha mantido todos os arquivos associados nesse diretório. Se você não tiver todos os arquivos, tenho certeza de que você terá problemas.

cgp
fonte
Se eu não tenho a mesma versão EXATA do MySQL, o que devo fazer?
Jo # JoJo
2

A descrição acima não foi suficiente para fazer as coisas funcionarem para mim (provavelmente densa ou preguiçosa), por isso criei esse script assim que encontrei a resposta para me ajudar no futuro. Espero que ajude os outros

vim fixperms.sh 

#!/bin/sh
for D in `find . -type d`
do
        echo $D;
        chown -R mysql:mysql $D;
        chmod -R 660 $D;
        chown mysql:mysql $D;
        chmod 700 $D;
done
echo Dont forget to restart mysql: /etc/init.d/mysqld restart;
dny238
fonte
-2

Para aqueles que possuem o Windows XP e o servidor MySQL 5.5 instalado - o local do banco de dados é C: \ Documents and Settings \ All Users \ Application Data \ MySQL \ MySQL Server 5.5 \ data, a menos que você tenha alterado o local na instalação do MySql Workbench GUI.

Demônio
fonte
3
A questão é sobre a recuperação de tipos de arquivos específicos, não onde esses arquivos podem ser encontrados no Windows XP MySQL 5.5.
Danpe 20/10/12