Berreskuratu MySQL taulak denean .frm soilik eta .ibd fitxategiak dira eskuragarri

nola konpondu “MySQL Akatsa #1146 - Mahai ez da existitzen” fitxategiak mugitzea eragindako .idb (InnoDB) zuzenean zerrendak arteko (tablespace).

logo_mysql

arazoa

arazo asko arazo sortzen dugu dira ditugun. Besterik ez nuen webgune batean WordPress eta pentsamendu erabiliz prestatu: hala nola ulertu nola egin PHP lan egiten du 7? Ondo da, Nire WampServer erabili PHP gisa 5.6, orduan izan nuen “zoriontsu” ideia berritu WampServer 2.5 (Apache 2.4.9, Mysql-5.6.17, Php5.5.12) egiteko WampServer 3.0.6 (Apache2.4.23, Mysql5.7.14, Php5.6.25 e Php 7.0.10).

argi, Hasteko backup by I, baina nire misstep big ez aukeratu zuten SQL esaterako gunea esportatzeko, Horren ordez, besterik MySQL fitxategiak kopia bat egin (mysql / data) eta aplikazio (www / gune). Ziur lan litzateke nengoen, lehen bezala.

the WampServer berria instalatu PHP ondoren 7, MySQL backup fitxategi eta aplikazioa jarri dut ez atzera, denean bakarrik nabigatzaileak nuen probatzen zen, Ez agertu gunea, baina, WordPress instalazio-pantaila balitz bezala web berri bat bailitzan. gozoki! Open PHPMyAdmin datu-basea Ok zen bada, eta ikusi zuen ikusteko, ari zerrendatu datu-basea arren, denean mahai datuak ikusteko klik agertu honako error message:

  MySQL Akatsa #1146 - Table <table_name> ez da existitzen

bilatuta izan dut eta hori baino ezin duzu kopiatu edo eraman fitxategiak zuzenean beste MySQL MySQL direktorioa fitxategi mota MyISAM badira aurkitu dut, luzapena .frm .MYD .MYI dituztenei. Ez dakit zer gertatu, baina nire datu-basea InnoDB bezala agertu (.frm e .idb). tamalez, Gertaera MySQL dokumentazioa ikusi ondoren bakarrik dagoeneko ohartarazi:

  Ezin duzu askatasunez mugitzeko .IBD datu-basea guneak artean fitxategiak gisa Ahal MyISAM mahai fitxategiekin duzu. 
  the InnoDB elkarbanatu tablespace gordeta mahai definizioa datu-basearen izena hartzen ditu. 
  transakzio identifikazioak eta saioa hasi tablespace fitxategiak gordetako sekuentzia zenbakiak ere base desberdinak.

konponbidea

Zenbait irtenbide sinpleak egin dut, baina hemen deskribatuko dut inor benetan niretzat lan egin, nahiz konplexuak askoz badirudi, Post aurkitu “zaharberritzea taula(s) MySQL datu-basean denean frm edo IBD artxibo erabilgarriak dira soilik“.

aurretik, ordea, jakintza bidez, gogora dezagun konparatu InnoDB duten, MySQL bere egitura mantentzen .frm fitxategi eta datuak .ibd batean. Larreina teoria, aukera ematen eskuratu behera!

urrats 1: Berriro sortu .frm egitura

esan dudan bezala, .frm mahai baten egitura dauka. Lehen egitura eta ondoren berreskuratzeko popular datuak ondoren behar dugu. Egin dezakezu 3 ondoren deskribatzen metodo ezberdinak, baina aurretik, utzi tell me buruz zerbait “MySQL Utilities”.

MySQL Utilities | mysqlfrm

Ez baduzu nahi, proposatutako metodoa erabili 1 (Online) Orduz tresna erabili behar duzu “mysqlfrm” emandako arabera “MySQL Utilities“.

Tresna honek datu egitura atera egingo du eta SQL mahaia sortzea gidoia sortzen. horretarako, deskargatu “MySQL Utilities” (algo como mysql-utilitateak-1.6.4-winx64.msi) eta instalatu.

Ireki edo kontsola (Komando / DE) e utilize comando CD para mover-se o diretório padrão da instalação (algo como C:\Program Files\MySQL\MySQL Utilities 1.6\). Note que dentro deste diretório existe o executável mysqlfrm.exe.

  cd "C:\Program Files\MySQL\MySQL Utilities 1.6"

Escolha somente um dos métodos abaixo para extrair a estrutura da sua tabela contido nos arquivos .frm:

1º Método | Online

1. Acesse o site https://recovery.twindb.com/;
2. Clique no menuRecover Structuree a seguir emfrom .frm file“;
3. Clique no botãoBrowser…” e selecione seu arquivo .frm; e
4. Clique no botãoUploade o script de criação da tabela será exibido na tela.

É possível enviar múltiplos arquivos .frm de uma só vez gerando um único script com todas as tabelas. Basta que você crie um .zip com todos seus .frm antes deBrowser/Upload”.

2º Método | Utilizando diagnostic

/* Exemplo genérico */
   mysqlfrm –diagnostic "<source/path>/mytable.frm" > "<destination/path/recovered_mytable.sql>"
 
/* Exemplo na prática com a tabela wp_posts.frm do WordPress */
   mysqlfrm --diagnostic "C:\wamp\bin\mysql\mysql5.6.17\data\meubanco\wp_posts.frm" > "C:\recovered_wp_posts.sql"

3º Método | Utilizando server

/* Exemplo genérico */
  mysqlfrm –server=root:mypassword@localhost –port=3311 "<source/path>/mytable.frm" > "<destination/path>/recovered_mytable.sql"
 
/* Exemplo na prática com a tabela wp_posts.frm do WordPress */
  mysqlfrm --server=root@localhost --port=3307 ""C:\wamp\bin\mysql\mysql5.6.17\data\meubanco\wp_posts.frm" > "C:\recovered_wp_posts.sql"

Não use a porta do MySQL! Escolha qualquer outra disponível. Note que o comando redireciona a saída para um arquivo .sql que é salvo no caminho especificado (no kasu, C:).

urrats 2: Recrie a tabela no seu Banco de Dados

Em uma base de dados nova, crie uma tabela com o script gerado no Passo 1. Eu particularmente instalei uma versão limpa do WampServer e utilizei o PHPMyAdmin (http://localhost/phpmyadmin/) para criar a base de dados e importar o script SQL criado no passo 1 (recovered_wp_posts.sql). Este script irá criar 2 arquivos no diretório da sua base de dados MySQL:

  SUA_TABELA.frm
  SUA_TABELA.idb

Nire kasuan, esses arquivos foram criados em C:\wamp64\bin\mysql\mysql5.7.14\data\<meubanco>. bestela esanda, procure sua instalação do MySQL e note que no diretório data haverá sua base de dados e os dois arquivos citados.

urrats 3: Remova o novo arquivo .idb

Para remover o novo arquivo .idb, execute o seguinte comando SQL:

/* Exemplo genérico */
  ALTER TABLE mytable DISCARD TABLESPACE;
 
/* Exemplo na prática com a tabela wp_posts do WordPress */
  ALTER TABLE wp_posts DISCARD TABLESPACE;

Este comando remove o link entre a tabela e o tablespace (Local onde são armazenados fisicamente os arquivos do banco de dados), e remover o arquivo .idb.

urrats 4: Copiar o antigo arquivo .idb

O arquivo .idb original (o que contém os dados) precisa ser copiado para o lugar do .idb que foi deletado no Passo 3. Use Ctrl+C e Ctrl+V mesmo ou se mate pela linha de comando.

urrats 5: Reativar a tabela

O link quebrado no Passo 3 precisa ser restaurado com o seguinte comando:

/* Exemplo genérico */
  ALTER TABLE mytable IMPORT TABLESPACE;
 
/* Exemplo na prática com a tabela wp_posts do WordPress */
  ALTER TABLE wp_posts IMPORT TABLESPACE;

Não se preocupe se receber alguns avisos, ordea, pode ser que dê pane geral aparecendo o seguinte erro:

  #1808 - Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)

Kasu honetan, isso aconteceu devido a forma diferente que o mysql5.7.14 (NOVO) cria a tabela padrão em relação ao Mysql-5.6.17 (ANTIGO), sem o ROW_FORMAT=compact.

gero, se você está usando MySQL >= ao mysql5.7.14, tudo que você precisa fazer é acrescentar ROW_FORMAT=compact na definição de criação da tabela.

  CREATE TABLE `wp_posts` (. . .) ENGINE=InnoDB ROW_FORMAT=compact

beste huts

Apenas para deixar registrado, antes de obter sucesso na extração de dados do .frm, tive alguns erros:

  # Source on localhost: ... connected.
  # Starting the spawned server on port 3304 ... ERROR Attempting to stop failed spawned server.  Process id = 6648.
  ERROR: Spawn server operation failed. Clone server error: Unable to communicate with berriaren instance. Process id = 6648.. To diagnose, run the utility again and use the --verbosity option to view the messages from the spawned server and correct any errors presented then run the utility again.
  SUCCESS: The process with PID 6648 (child process of PID 7264) has been terminated.
Traceback (most recent call last):
  File "G:\ade\build\sb_0-19921351-1470074463.97\Python-2.7.6-windows-x86-64bit\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module>
  File "scripts\mysqlfrm.py", line 422, in <module>
  File ".\mysql\utilities\command\read_frm.py", line 439, in read_frm_files
  File ".\mysql\utilities\command\read_frm.py", line 166, in _spawn_server
  File ".\mysql\utilities\command\serverclone.py", line 180, in clone_server
  File ".\mysql\utilities\common\tools.py", line 273, in get_mysqld_version
IOError: [Errno 13] Permission denied: 'version_check'

No caso específico do WordPress, você precisa remover do script que gerou o SQL obtidos em .frm, todas as entradas ‘DEFAULT ‘0000-00-00 00:00:00, caso contrário, vai pegar o erro:

  #1067 - Valor padrão (lehenetsi) inválido para 'comment_date'

hori!

iturri

http://www.voxteneo.com/restoring-tables-mysql-database-frm-ibd-files-available/

https://medium.com/@alexquick/transporting-mysql-tablespaces-from-5-6-to-5-7-517c01345fbb#.72zermd8b

http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html

https://lanmenezesbr.wordpress.com/2014/10/21/mysql-erro-1146-table-doesnt-exist/

http://stackoverflow.com/questions/7759170/mysql-table-doesnt-exist-but-it-does-or-it-should

denera: 21510

12 berrikuspen “Berreskuratu MySQL taulak denean .frm soilik eta .ibd fitxategiak dira eskuragarri

  1. Rodrigo esan:

    O que fazer quando aparecer a seguinte mensagem de erro: #1815 – Internal error. Cannot reset LSNs in tablemeubanco”.”minhatabela”: Data structure corruption.
    É possível eu executar as inserções dos dados manualmente? Como fazer isso?
    Desde já te agradeço.

  2. Cristian U esan:

    Hi Taylor,

    How did you solve this error:
    ERROR: Spawn server operation failed. Clone server error: Unable to communicate with new instance. Process id = 6648.. To diagnose, run the utility again and use theverbosity option to view the messages from the spawned server and correct any errors presented then run the utility again.
    SUCCESS: The process with PID 6648 (child process of PID 7264) has been terminated.

    I keep receiving the same message and I don´t know how to solve it.

    Thanks

  3. Reginaldo Luiz de Freitas esan:

    parabens Taylor, baina didaktikoa ezinezkoa!! zara tipo bera!

    besarkada eta zure esperientzia partekatzeko esker!

Utzi erantzuna

Zure e-posta helbidea ez da argitaratuko. Beharrezko eremuak markatuta daude *