Ripristina il database MySQL dalla cartella dati senza ibdata1 dai file ibd


15

La mia directory WAMP viene accidentalmente cancellata da un altro utente. Sono disponibili solo cartelle di dati in MySQL. E, in quanto sono disponibili solo le cartelle di database (cartelle in "\ bin \ mysql \ mysql5.6.12 \ data \" con il nome dei database). Tutti i file tra cui " ibdata1 " nella radice di "\ bin \ mysql \ mysql5.6.12 \ data \" vengono anch'essi eliminati.

Le cartelle del database contengono solo file con le seguenti estensioni.

* .frm, * .ibd

e file "db.opt".

Come possono essere recuperati i database?

Ho già provato a recuperare bdata1. Ma, incapace di riaverlo. Inoltre, alcuni database contengono anche MYISAM.

Risposte:


16

MyISAM

Per una tabella MyISAM mydb.mytable, dovresti avere tre file

  • \bin\mysql\mysql5.6.12\data\mydb\mytable.frm
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYD
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYI

Dovrebbero già essere accessibili come tabella poiché ogni file contiene i dati necessari, i metadati e le informazioni sull'indice. Collettivamente, formano il tavolo. Non ci sono meccanismi esterni di memorizzazione del motore di archiviazione.

InnoDB

Dai un'occhiata a questa rappresentazione pittorica di InnoDB

Architettura di InnoDB

L'unica cosa che collega ibdata1 ai .ibdfile è il dizionario dei dati.

La tua missione, se decidi di accettarla, è quella di creare ogni tabella e scambiare il file .ibd

Prima di fare qualsiasi cosa, crea una copia completa di "\ bin \ mysql \ mysql5.6.12 \ data" su un altro

Ecco un esempio

Supponiamo di avere un database mydbcon la tabella mytable. Questo significa

  • Hai la cartella \bin\mysql\mysql5.6.12\data\mydb
  • All'interno di quella cartella, hai
    • mytable.frm
    • mytable.ibd

Hai bisogno di .frm. Se guardi il mio post Come posso estrarre lo schema della tabella solo dal file .frm? , è possibile scaricare un'utilità MySQL in grado di generare l'SQL necessario per creare la tabella.

Ora dovresti fare quanto segue

  • Sposta mytable.ibdin\bin\mysql\mysql5.6.12\data
  • Esegui l'SQL per creare la tabella InnoDB
  • Accedi a mysql ed esegui ALTER TABLE mydb.mytable DISCARD TABLESPACE;(questo eliminerà \bin\mysql\mysql5.6.12\data\mydb\mytable.ibd)
  • Copia \bin\mysql\mysql5.6.12\data\mytable.ibdin\bin\mysql\mysql5.6.12\data\mydb
  • Accedi a mysql ed esegui ALTER TABLE mydb.mytable IMPORT TABLESPACE;(questo si registrerà \bin\mysql\mysql5.6.12\data\mydb\mytable.ibdnel dizionario dei dati)

Successivamente, la tabella mydb.mytabledovrebbe essere completamente accessibile. È possibile verificare tale accessibilità semplicemente eseguendo:

SELECT * FROM mydb.mytable LIMIT 10;

Provaci !!!

BEVANDA (il recupero dei dati comprende le conoscenze necessarie) in modo responsabile


Per completare questa grande risposta, per innodb dovrai rimuovere qualsiasi vincolo FK che fa riferimento alla tabella prima di scartare il suo tablespace. Dopo l'importazione, è necessario ricreare l'FK.
SebaGra,

dopo l'importazione del tablespace information_schema.key_column_usage(probabilmente anche altre tabelle) non verranno restituiti dati sul primo, selectquindi è necessario eseguire almeno una query e attendere alcuni secondi prima che la query successiva possa funzionare. (mysql Ver 14.14 Distrib 5.7.19, per linux-glibc2.12 (x86_64) usando il wrapper EditLine)
user3338098
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.