Rov qab MySQL ntxhuav thaum xwb tus .frm ntaub ntawv hab. ibd no muaj

Yuav kom daws tau li cas “Yuam kev Mysql #1146 -Cov lus ntawd tsis nyob ua ib ke” tshwm sim los ntawm kev siv cov ntaub ntawv .IDB (InnoDB) ntawm Wage (tablespace).

logo_mysql

Teeb meem

Muitos dos problema que temos são problemas que criamos. Eu tinha acabado de preparar um Site usando WordPress e pensei: que tal ver como isso funciona no PHP 7? ua li, como meu WampServer usava PHP 5.6, então tive afelizideia de fazer um upgrade do WampServer 2.5 (Apache-2.4.9, Mysql-5.6.17, Php5.5.12) rau WampServer 3.0.6 (Apache2.4.23, Mysql5.7.14, Php5.6.25 e Php 7.0.10).

tau mas, comecei pelo backup, mas meu grande vacilo foi optar por não exportar o SQL do tal Site, ao invés disto, apenas fiz uma cópia dos arquivos do MySQL (mysql/data) e da aplicação (www/site). Estava confiante que iria funcionar, como das outras vezes.

Após a instalação do novo WampServer com PHP 7, coloquei os arquivos de backup do MySQL e da aplicação lá de volta, só que quando fui testar pelo navegador, não apareceu o Site, 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 Yuam kev #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 files between database directories tus you can with MyISAM table files. 
  The table definition stored in the InnoDB shared tablespace includes the database name. 
  The transaction IDs and log sequence numbers stored in the tablespace files also differ between databases.

Tov

Cheguei a ver algumas soluções simples, mas vou descrever aqui a única que realmente funcionou para mim, apesar de parecer bem mais complexa, encontrada no PostRestoring table(s) in MySQL database when frm or ibd files are available only“.

Antes, Txawm li cas los, a 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, vamos ao que interessa!

Kauj ruam 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. Qhov no, baixe oMySQL Utilities” (algo como mysql-utilities-1.6.4-winx64.msi) e instale-o.

Abra o console (Hais kom ua / 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. Nias lub pob kom qhov “Browser…” e selecione seu arquivo .frm; thiab
4. Nias lub pob kom qhov “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 (nyob rau hauv rooj plaub, (C):).

Kauj ruam 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

Hauv kuv tsev neeg, esses arquivos foram criados em (C):\wamp64\bin\mysql\mysql5.7.14\data\<Kuv lub rooj>. IE, procure sua instalação do MySQL e note que no diretório hnub haverá sua base de dados e os dois arquivos citados.

Kauj ruam 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.

Kauj ruam 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.

Kauj ruam 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, Txawm li cas los, 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.)

Qhov no, 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.

Li ntawd, 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

Outros erros

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.  Ceem txheej txheem = 6648.
  YUAM KEV: Neeg rau zaub mov zov me nyuam ua tsis tau tejyam ntses nteg qe. Neeg rau zaub mov clone yuam kev: Unable to communicate with tshiab instance. Process id = 6648.. Mus tshawb nrhiav, run the utility again and siv tus --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", kab 27, in <module>
  File "scripts\mysqlfrm.py", kab 422, in <module>
  File ".\mysql\utilities\command\read_frm.py", kab 439, in read_frm_files
  File ".\mysql\utilities\command\read_frm.py", kab 166, in _spawn_server
  File ".\mysql\utilities\command\serverclone.py", kab 180, in clone_server
  File ".\mysql\utilities\common\tools.py", kab 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 (default) inválido para 'comment_date'

Tus ntawd yog nws!

Fonts

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

Tag nrho hits: 21481

12 lus rau “Rov qab MySQL ntxhuav thaum xwb tus .frm ntaub ntawv hab. ibd no muaj

  1. Rodrigo Txawm hais tias:

    Yuav tau ua thaum kev ua yuam kev hais hauv qab no saib koj: #1815 – Yuam kev nrog. Tsis tau pib dua LSNs nyob rau hauv lub rooj “Kuv lub rooj”.”myTable”: Kev noj nyiaj txiag qauv ntaub ntawv.
    Kuv hiav tau lub cev ntas ntawm cov ntaub ntawv manually? Como fazer isso?
    Desde já te agradeço.

  2. Cristian U Txawm hais tias:

    Kuv tuaj los Taylor,

    Koj ua tau tsis yuam kev no li cas:
    YUAM KEV: Neeg rau zaub mov zov me nyuam ua tsis tau tejyam ntses nteg qe. Neeg rau zaub mov clone yuam kev: Tsis tau sib txuas lus nrog cov tshiab lom. Ceem txheej txheem = 6648.. Mus tshawb nrhiav, lub chaw tso dej khiav dua thiab siv lub –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.

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

    Thanks

  3. Jothaz Txawm hais tias:

    Qho zoo kawg thiab buddy.

    tau mas, cos, tiav thiab yuav txhim khu kev qha.

    Sib pab heev.

  4. Reginaldo Luiz de Freitas Txawm hais tias:

    Taylor pab koj zoo siab, didactic, tab sis tsis yooj yim sua!! koj nyob nraum tus qub txiv leej tub!

    puag thiab ua tsaug rau sib qhia koj kev!

sau ntawv cia

Qhov koj email chaw nyob yuav tsis muab luam tawm. Search yog cim muaj *