Atkurti MySQL lenteles, kai tik .frm failus ir ibd

Kaip spręsti “MySQL klaida #1146 -Stalo neegzistuoja” sukelia .IDB failų perkėlimo (InnoDB) tiesiogiai tarp katalogų (lentelės erdvės).

logo_mysql

Problema

Daugelis problemų, mes turime yra problemų, mes sukūrėme. Aš tiesiog įkurti svetainę, naudojant WordPress ir maniau: Kaip apie pamatyti kaip tai veikia php 7? gerai, kaip mano WampServer naudojami PHP 5.6, Taigi man teko “laimingas” idėja atnaujinti, WampServer 2.5 (Apache 2.4.9, MySQL-5.6.17, PHP 5.5.12) už WampServer 3.0.6 (Apache 2.4.23, MySQL 5.7.14, 5.6.25 PHP, Php 7.0.10).

žinoma, pradėjo iš atsarginės kopijos, bet mano didelis slydimo buvo pasirinkti neeksportuoti SQL iš tokios svetainės, Vietoj to, tiesiog padarė MySQL failų kopija (MySQL/duomenys) ir paraiškos (www svetainės). Buvau įsitikinęs, ji dirba, kaip ir kitais atvejais.

Įdiegus naują WampServer su PHP 7, atsarginių kopijų failai ir programos atgal, tik, kai aš atvykau į bandymų į naršyklę, nerodo svetainės, mas sim a tela de instalação do WordPress como se fosse um novo Site. Gelei! Abri o PHPMyAdmin para checar se o banco de dados estava Ok e vi que, apesar de ser listada a base de dados, quando se clicava em cima da tabela para visualizar os dados surgia a seguinte mensagem de erro:

  MySQL Error #1146 – Table <NOME_DA_TABELA> doesn’t exist

Fui pesquisar e acabei descobrindo que só se pode copiar ou mover os arquivos do MySQL diretamente para outra diretório MySQL se os arquivos forem do tipo MyISAM, aqueles com extensão .frm .MYD .MYI. Eu não sei bem o que houve, mas minha base de dados aparecia como InnoDB (.frm e .idb). Infelizmente, só depois do ocorrido vi que a documentação do MySQL já alertava:

  You cannot freely move .IBD failus iš duomenų bazės katalogai kaip Jūs galite su MyISAM lentelės failus. 
  Saugomi InnoDB pasidalino tablespace lentelės apibrėžimas apima ir duomenų bazės pavadinimas. 
  Operacijos ID ir žurnalo eilės numeriai tablespace failų taip pat skiriasi duomenų bazių.

Tirpalas

Cheguei La algumas soluções Simple, mas vou descrever aqui única que realmente funcionou pusiau mim, apesar de parecer bem mais complexa, encontrada Jokia pareigybė “Atkurti lentelės(s) MySQL duomenų bazės, kai frm arba ibd failai pasiekiami tik“.

Antes, porém, título de conhecimento, Vale lembrar que em relação ao tipo InnoDB, o MySQL guarda sua estrutura em arquivos .frm e seus dados em .ibd. Chega de teoria, Leiskite supjaustyti į Chase!

Žingsnis 1: Recrie a estrutura dos arquivos .frm

Como disse, o .frm contém a estrutura da sua tabela. Primeiramente precisamos recuperar essa estrutura para então depois popular os dados. Você pode fazer isso de 3 métodos diferentes descritos abaixo, mas antes, deixa eu te falar uma coisa sobre oMySQL Utilities”.

MySQL Utilities | mysqlfrm

Se você não pretende usar o 1º Método proposto (Online) então você precisará usar a ferramentamysqlfrmfornecida peloMySQL Utilities“.

Esta ferramenta irá extrair a estrutura de dados e gerar o script SQL de criação da tabela. Para isto, baixe oMySQL Utilities” (algo como mysql-utilities-1.6.4-winx64.msi) e instale-o.

Abra o console (Komanda / DOS) 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. Spustelėkite mygtuką “Browser…” e selecione seu arquivo .frm; ir
4. Spustelėkite mygtuką “Uploade 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 caso, (C):).

Žingsnis 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

Mano atveju, esses arquivos foram criados em (C):\wamp64\bin\mysql\mysql5.7.14\data\<mano vieta>. IE, procure sua instalação do MySQL e note que no diretório data haverá sua base de dados e os dois arquivos citados.

Žingsnis 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.

Žingsnis 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.

Žingsnis 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, porém, 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.)

Šiuo atveju, 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.

Taigi, 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

Kitos klaidos

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 naujas instance. Process id = 6648.. To diagnose, run the utility again and naudoti į --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, į <module>
  File "scripts\mysqlfrm.py", line 422, į <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 (Numatytasis) inválido para 'comment_date'

Štai ir viskas!

Šriftai

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

Iš viso atitikimų: 21433

12 komentuoja “Atkurti MySQL lenteles, kai tik .frm failus ir ibd

  1. Rodrigo sakė:

    Ką daryti, kai matote šį klaidos pranešimą: #1815 – Vidinė klaida. Negalima iš naujo nustatyti LSNs lentelės “mano vieta”.”myTable”: Sugadinta duomenų struktūra.
    Ar galiu paleisti įterpia duomenis rankiniu būdu? Como fazer isso?
    Desde já te agradeço.

  2. Cristian U sakė:

    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 sakė:

    Sveikiname Taylor, bet didaktinių neįmanoma!! tu esi tas pats žmogus!

    apkabinti ir Dėkojame už pasidalinti savo patirtimi!

palik atsakymą

Į jūsų el. pašto adresas nebus skelbiamas. Būtini laukai yra pažymėti su *