restaurar tabela de arquivos .frm e .ibd?

36

Eu salvei anteriormente uma cópia do diretório / var / lib / mysql / ddms ("ddms" é o nome do esquema). Agora instalei um novo MySQL em um Ubuntu 10.04.3 LTS recém-instalado apt-get install mysql-server, executando , acredito que a versão 5.1 foi instalada. Depois de copiar o diretório ddms em / var / lib / mysql, algumas de suas tabelas funcionam bem. Essas são as tabelas com um conjunto associado de três arquivos: um arquivo .frm, um arquivo .MYD e um arquivo .MYI.

No entanto, existem duas tabelas com um conjunto diferente de arquivos: um arquivo .frm e um arquivo .ibd. Essas duas tabelas não apareceram na lista de tabelas no phpMyAdmin. Quando olho para o log de erros, ele diz:

[ERROR] Cannot find or open table ddms/dictionary_item from
the internal data dictionary of InnoDB though the .frm file for the
table exists. Maybe you have deleted and recreated InnoDB data
files but have forgotten to delete the corresponding .frm files
of InnoDB tables, or you have moved .frm files to another database?
or, the table contains indexes that this version of the engine
doesn't support.

Por favor, ajude a restaurar essas duas tabelas. Obrigado.

Tong Wang
fonte
Essa citação de 23 de abril de 12 por Rolando ainda é válida hoje. 'Apenas copiar os arquivos .frm e .ibd de um local para outro está causando problemas.' Use alternativas como o mysqldump para obter seus dados antigos em um formulário que possa ser carregado como planejado anos atrás. Também conhecido como backup.
Wilson Hauck

Respostas:

37

As tabelas InnoDB não podem ser copiadas da mesma maneira que as tabelas MyISAM.

Apenas copiar os arquivos .frm e .ibd de um local para outro está causando problemas. A cópia do arquivo .frm e .ibd de uma tabela do InnoDB só é boa se, e somente se, você puder garantir que o ID do espaço de tabela do arquivo .ibd corresponda exatamente à entrada do ID do espaço de tabela nos metdados do arquivo ibdata1 .

Escrevi duas postagens no DBA StackExchange sobre esse conceito de identificação de espaço de tabela

Aqui está um link excelente sobre como reconectar qualquer arquivo .ibd ao ibdata1 no caso de IDs de espaço de tabela incompatíveis: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Depois de ler isso, você deve perceber imediatamente que copiar arquivos .ibd é simplesmente louco.

Você pode aplicar as sugestões no link Calendário do Chris ou voltar à instalação antiga do mysql, inicializando o mysql e depois mysqldump no ddmsbanco de dados. Em seguida, importe esse mysqldump para sua nova instância do mysql. Confie em mim, isso seria muito mais fácil.

RolandoMySQLDBA
fonte
Portanto, uma única tabela pode não ser uma boa ideia, mas e um banco de dados inteiro no momento? Minha tabela de usuários estava com um travamento ruim e tive que inicializar no mysqld. Posso copiar toda a pasta do banco de dados InoDB da pasta data_backup?
precisa saber é o seguinte
Rolando, caso você possa me ajudar: serverfault.com/q/908988/224334
Ionică Bizău
Sua postagem How to Recover an InnoDB table whose files were moved around literalmente salvou minha vida. Muito obrigado.
Paulo Griiettner 13/03
20

Recentemente, experimentei esse mesmo problema. Aqui estão as etapas que eu usei para resolvê-lo sem ter que mexer com o ID do espaço de tabela, como menciona RolandoMySQLDBA acima. Estou em um Mac e usei o MAMP para restaurar o banco de dados a um ponto em que pudesse exportá-lo em um despejo do MySQL.

Você pode ler a postagem completa do blog aqui: http://www.quora.com/Jordan-Ryan/Web-Dev/How-to-Recover-innoDB-MySQL-files-using-MAMP-on-a-Mac

Você deve ter:

-ibdata1

-ib_logfile0

-ib_logfile1

Arquivos -.FRM da sua pasta mysql_database

Instalação -Fresh do MAMP / MAMP Pro que você está disposto a destruir (se necessário)

  1. SSH no seu servidor web (dev, produção, sem diferença) e navegue até a pasta mysql (a minha estava em / var / lib / mysql para uma instalação do Plesk no Linux)
  2. Comprima a pasta mysql
  3. Faça o download de um arquivo da pasta mysql que deve conter todos os bancos de dados mySQL, sejam MyISAM ou innoDB (você pode scp esse arquivo ou movê-lo para um diretório para download, se necessário)
  4. Instale o MAMP (Mac, Apache, MySQL, PHP)
  5. Navegue para / Aplicativos / MAMP / db / mysql /
  6. Backup / Aplicativos / MAMP / db / mysql em um arquivo zip (apenas no caso)
  7. Copie todas as pastas e arquivos incluídos no arquivo da pasta mysql do servidor de produção (ambiente mt Plesk no meu caso), EXCETO NÃO SUBSTITUI:

    - / Aplicativos / MAMP / db / mysql / mysql /

    - / Aplicativos / MAMP / db / mysql / mysql_upgrade_info

    - / Aplicativos / MAMP / db / mysql / performance_schema

  8. E pronto, agora você deve conseguir acessar os bancos de dados do phpMyAdmin, que alívio!

Mas não terminamos, agora você precisa executar um mysqldump para restaurar esses arquivos no seu ambiente de produção, e a interface phpmyadmin atinge o tempo limite para grandes bancos de dados. Siga os passos aqui:

http://nickhardeman.com/308/export-import-large-database-using-mamp-with-terminal/

Copiado abaixo para referência. Observe que em uma instalação padrão do MAMP, a senha é "root".

Como executar o mysqldump para MAMP usando o Terminal

BASE DE DADOS DE EXPORTAÇÃO DO MAMP [1]

Passo um: Abrir uma nova janela do terminal

Passo dois: Navegue até a instalação do MAMP digitando a seguinte linha no terminal cd / applications / MAMP / library / bin Pressione a tecla Enter

Passo três: Escreva o comando dump ./mysqldump -u [USERNAME] -p [DATA_BASENAME]> [PATH_TO_FILE] Pressione a tecla Enter

Exemplo:

./mysqldump -u root -p wp_database > /Applications/MAMP/htdocs/symposium10_wp/wp_db_onezero.sql

Dica rápida: para navegar rapidamente para uma pasta, você pode arrastar a pasta para a janela do terminal e ela gravará o local da pasta. Foi um ótimo dia quando alguém me mostrou isso.

Etapa quatro: Essa linha de texto deve aparecer após você pressionar Enter. Digite a senha: Então, adivinhe, digite sua senha, lembre-se de que as letras não aparecerão, mas elas estão lá. Pressione a tecla Enter

Etapa 5: verifique o local onde você armazenou seu arquivo, se ele estiver lá, SUCESSO Agora você pode importar o banco de dados, que será descrito a seguir.

Agora que você tem uma exportação do seu banco de dados mysql, pode importá-lo no ambiente de produção.

jordan8037310
fonte
11
Ainda trabalhando a partir de 2018. Esta resposta é ouro. A parte importante para mim é o número 7, esses são os arquivos que você absolutamente tem que manter (não é mencionado em nenhum outro lugar em soluções semelhantes, obrigado por esse @jordan).
Bigood
@Bigood feliz que ainda está ajudando!
jordan8037310
tabela de obtenção de erro 1146 não existe ao fazer o despejo
Robert Sinclair
15

Recuperei meus arquivos MySQL 5.5 * .ibd e * .frm usando o MySQL Utilites e o MariaDB 10.

1) Gerando Criar SQLs.
Você pode obter seu sql de criação a partir do arquivo frm. Você deve usar: https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqlfrm.html

shell> mysqlfrm --server = root: pass @ localhost: 3306 c: \ MY \ t1.frm - -port = 3310

contrário, você pode criar seus sql's.

2) Crie suas tabelas
Crie suas tabelas no banco de dados.

3) alter table xxx descartar tablespace
Descarte suas tabelas que você deseja substituir seus arquivos * .ibd.

4) Copie seus arquivos * .ibd (MySQL ou MariaDB) para o caminho de dados do MariaDB
Primeiro eu tento usar o MySQL 5.5 e 5.6 para restaurar, mas o banco de dados trava e para imediatamente sobre o erro de identificação de espaço de tabela. ( ERRO 1030 (HY000): erro -1 do mecanismo de armazenamento )
Depois de usar o MariaDB 10.1.8 e recuperar meus dados com êxito.

5) alterar tabela xxx importar espaço de tabela
Quando você executa esta instrução, o MariaDB avisa sobre o arquivo, mas não é importante que recuperar seus dados :) O banco de dados ainda continua e você pode ver seus dados.

Espero que esta informação seja útil para você.

Ecd
fonte
11
Isso funcionou para mim. Embora mysqlfrm(versões experimentadas 1.3.5 e 1.6.5 com MySQLs 5.6 e 5.7) não tenham dado a CREATEdefinição correta , mesmo quando o MySQL 5.7 ( o ROW_FORMAT padrão foi alterado no MySQL 5.7.9 ) resultando na Schema mismatch (Expected FSP_SPACE_FLAGS=0x21, .ibd file contains 0x0.)importação do espaço de tabela. A adição manual ROW_FORMAT=compactno final da CREATEdeclaração fez o truque.
Jānis Elmeris
@ JānisElmeris> Manually adding ROW_FORMAT=compact at the end of the CREATE statement did the trick.Isso funcionou para mim também. Obrigado! 👍
Synetech
3

Eu tive exatamente o mesmo problema apenas com os arquivos como backup.

O que fiz para resolvê-lo foi copiar os arquivos do banco de dados em / var / lib / mysql / yourdb e ibdata1, que é colocado em / var / lib / mysql.

Pude verificar se consegui acessar as tabelas mysql -u root -p dbname e consultar algumas das tabelas que estavam corrompidas anteriormente.

Fiz um despejo do banco de dados posteriormente com mysqldump -u root -p [root_password] [database_name]> dumpfilename.sql

ter
fonte
2

Se você estiver usando o MAMP e não conseguir iniciar o MySQL depois de copiar seus arquivos, coloquei o arquivo innodb_force_recovery = 2dentro my.inie consegui que o mysql iniciasse e exportasse meu banco de dados.

Peter Wakeman
fonte
1

Se você conseguir restaurar o arquivo * .ibd no servidor MySQL original, não se esqueça de restaurar também os direitos de acesso ao arquivo. No meu caso (MySQL8 no CentOS7), restaurei o arquivo para /var/lib/mysql/db/tablename.ibd e executei:

chown mysql tablename.ibd
chgrp mysql tablename.ibd
chmod 0640 tablename.ibd

Antes de corrigir os direitos de acesso, o acesso à tabela resultou no erro "O servidor MySQL 2006 foi desativado". Após corrigir os direitos de acesso, a tabela funcionou (mesmo sem a reinicialização do serviço mysqld).

Samuraj
fonte
0

Reuni postagens de tópicos semelhantes (cujas respostas não foram publicadas aqui):

solução 1: https://dba.stackexchange.com/a/59978

solução 2: https://dba.stackexchange.com/a/71785 (+ outro post lá)

solução 3: kit de recuperação para tabelas: https://twindb.com/how-to-recover-innodb-dictionary/

solução 4: recuperar banco de dados MySQL da pasta de dados sem ibdata1 dos arquivos ibd

solução 5: usando mysqlfrm comando

solução 6: https://dba.stackexchange.com/a/159001

solução 7: https://dba.stackexchange.com/a/144573

T.Todua
fonte
Isso parece suspeito como uma resposta somente de link.
mustaccio
Porque todos os links são do nosso próprio site, eles não são susceptíveis de desaparecer, então eu estou bem com isso @mustaccio
jcolebrand
3
Isso não parece agregar muito valor, pois a maioria deles também aparece na lista "Relacionados" alguns pixels à direita.
mustaccio
@jcolebrand obrigado por ser leve. muitas pessoas não conseguem ver a utilidade mesmo de respostas "não diretas". Eles só podem detectar a quebra de regras.
T.Todua
11
Não, mas você deve entender que ele está certo. Você não adicionou nenhum valor. Eu estava respondendo com um julgamento de regras, não tolerando sua resposta. Na verdade, é uma resposta muito ruim.
jcolebrand
0

Eu só quero adicionar mais uma coisa para os usuários do macos El Capitan. Os utilitários MySQL não são suportados para esta versão, portanto, o comando mysqlfrm não é útil. O que fiz foi recuperar minhas estruturas de tabela com o dbsake, como mostrado neste link: https://www.percona.com/blog/2015/12/16/recovering-table-structure-from-frm-files-using-dbsake/

Tudo que você precisa fazer é instalar o dbsake:

# curl -s http://get.dbsake.net > dbsake
# chmod u+x dbsake

use o comando frmdump e forneça o caminho para o seu arquivo .frm:

# ./dbsake frmdump /var/lib/mysql/sakila/staff.frm

você receberá a instrução create. Depois de fazer isso, simplesmente segui as etapas 2 a 5 já mencionadas pelo @Ecd. Espero que ajude alguém.

user2804064
fonte
0

Eu realmente aprecio Ecd. O que funcionou para mim:

1.- Eu tinha um backup da base há alguns meses, isso me ajudou a levantar esse backup no xampp no ​​Windows 10 e criar as tabelas para ter a estrutura (configuração: Windows 10, xampp-windows-x64-7.1.30- 5-VC14) arquivo de configuração mysql my.ini no final

NOTE: Some tables did not have ROW_FORMAT = COMPACT, so I went to operations on each 
    table and changed it manually.
    (If I did not do that, an error appeared and I did not let the import).

NOTE2: I had the backup of months ago but it should also work by first recovering 
    the structure of the .frm files in case of not having a backup at hand.
    (You can try this link:
    https://www.percona.com/blog/2014/01/02/recover-table-structure-frm-files-mysql- 
    utilities/)

2.- Com o banco de dados antigo ativado, continuei executando a alteração da tabela xxx para descartar o espaço de tabela para cada tabela no banco de dados que desejava recuperar e, em seguida, os arquivos .ibd da pasta de dados em C: / xampp / mysql / data / system foi excluído (neste caso, é este caminho)

3.- Continuei copiando os arquivos .ibd do banco de dados que desejava recuperar para a pasta xampp do banco de dados antigo

4.- Após copiar os arquivos, execute: alter table xxx import tablespace Para cada tabela no banco de dados, um aviso aparecerá, mas nós o ignoraremos, os dados serão carregados na tabela e poderão ser exportados posteriormente.

5.- Exporte todo o banco de dados para um arquivo sql e prossiga para construí-lo em produção e sucesso!

# Example MySQL config file for small systems.
#
# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it's important that the mysqld daemon
# doesn't use much resources.
#
# You can copy this file to
# C:/xampp/mysql/bin/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is C:/xampp/mysql/data) or
# ~/.my.cnf to set user-specific options.
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.

# The following options will be passed to all MySQL clients
[client] 
# password       = your_password 
port            = 3306 
socket          = "C:/xampp/mysql/mysql.sock"


# Here follows entries for some specific programs 

# The MySQL server
[mysqld]
port= 3306
socket = "C:/xampp/mysql/mysql.sock"
basedir = "C:/xampp/mysql" 
tmpdir = "C:/xampp/tmp" 
datadir = "C:/xampp/mysql/data"
pid_file = "mysql.pid"
# enable-named-pipe
key_buffer = 160M
max_allowed_packet = 300M
sort_buffer_size = 1204K
net_buffer_length = 80K
read_buffer_size = 512K
read_rnd_buffer_size = 1024K
myisam_sort_buffer_size = 8M
log_error = "mysql_error.log"

# Change here for bind listening
# bind-address="127.0.0.1" 
# bind-address = ::1          # for ipv6

# Where do all the plugins live
plugin_dir = "C:/xampp/mysql/lib/plugin/" 

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
# 
# commented in by lampp security
#skip-networking
#skip-federated

# Replication Master Server (default)
# binary logging is required for replication
# log-bin deactivated by default since XAMPP 1.4.11
#log-bin=mysql-bin

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id   = 1

# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
#    the syntax is:
#
#    CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
#    MASTER_USER=<user>, MASTER_PASSWORD=<password> ;
#
#    where you replace <host>, <user>, <password> by quoted strings and
#    <port> by the master's port number (3306 by default).
#
#    Example:
#
#    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
#    MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
#    start replication for the first time (even unsuccessfully, for example
#    if you mistyped the password in master-password and the slave fails to
#    connect), the slave will create a master.info file, and any later
#    change in this file to the variables' values below will be ignored and
#    overridden by the content of the master.info file, unless you shutdown
#    the slave server, delete master.info and restart the slaver server.
#    For that reason, you may want to leave the lines below untouched
#    (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id       = 2
#
# The replication master for this slave - required
#master-host     =   <hostname>
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user     =   <username>
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =   <password>
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port     =  <port>
#
# binary logging - not required for slaves, but recommended
#log-bin=mysql-bin


# Point the following paths to different dedicated disks
#tmpdir = "C:/xampp/tmp"
#log-update = /path-to-dedicated-directory/hostname

# Uncomment the following if you are using BDB tables
#bdb_cache_size = 40M
#bdb_max_lock = 10000

# Comment the following if you are using InnoDB tables
#skip-innodb
innodb_data_home_dir = "C:/xampp/mysql/data"
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = "C:/xampp/mysql/data"
#innodb_log_arch_dir = "C:/xampp/mysql/data"
## You can set .._buffer_pool_size up to 50 - 80 %
## of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 16M
## Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 50M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 600

## UTF 8 Settings
#init-connect=\'SET NAMES utf8\'
#collation_server=utf8_unicode_ci
#character_set_server=utf8
#skip-character-set-client-handshake
#character_sets-dir="C:/xampp/mysql/share/charsets"
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION
log_bin_trust_function_creators = 1

[mysqldump]
quick
max_allowed_packet = 160M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

Espero que ajude alguém que tenha essa situação, cumprimentos.

Inglês fornecido pelo Google

Yersskit
fonte