Tabelle aus .frm- und .ibd-Datei wiederherstellen?


36

Ich habe zuvor eine Kopie des Verzeichnisses / var / lib / mysql / ddms gespeichert ("ddms" ist der Schemaname). Jetzt habe ich ein neues MySQL auf einem frisch installierten Ubuntu 10.04.3 LTS installiert apt-get install mysql-server, ich glaube Version 5.1 wurde installiert. Nachdem ich das Verzeichnis ddms unter / var / lib / mysql kopiert habe, funktionieren einige seiner Tabellen einwandfrei. Dies sind die Tabellen mit einem zugehörigen Satz von drei Dateien: eine .frm-Datei, eine .MYD-Datei und eine .MYI-Datei.

Es gibt jedoch zwei Tabellen mit unterschiedlichen Dateigruppen: eine .frm-Datei und eine .ibd-Datei. Diese beiden Tabellen wurden in der Tabellenliste in phpMyAdmin nicht angezeigt. Wenn ich mir das Fehlerprotokoll ansehe, heißt es:

[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.

Bitte helfen Sie bei der Wiederherstellung dieser beiden Tabellen. Vielen Dank.


Dieses Zitat von Rolando vom 23. April 12 ist bis heute gültig. "Nur das Kopieren der .frm- und .ibd-Dateien von einem Ort zum anderen ist problematisch." Verwenden Sie eine Alternative wie mysqldump, um Ihre alten Daten in ein Formular zu übertragen, das vor Jahren wie geplant geladen werden kann. Wird auch als Backup bezeichnet.
Wilson Hauck

Antworten:


36

InnoDB-Tabellen können nicht wie MyISAM-Tabellen kopiert werden.

Das Kopieren der .frm- und .ibd-Dateien von einem Ort an einen anderen ist problematisch. Das Kopieren der .frm- und .ibd-Datei einer InnoDB-Tabelle ist nur dann sinnvoll, wenn Sie sicherstellen können, dass die Tablespace-ID der .ibd-Datei genau mit dem Tablespace-ID-Eintrag in den Metadaten der ibdata1-Datei übereinstimmt .

Ich habe in DBA StackExchange zwei Posts über dieses Tablespace-ID-Konzept geschrieben

Hier finden Sie einen hervorragenden Link zum erneuten Anhängen von .ibd-Dateien an ibdata1 im Falle von nicht übereinstimmenden Tablespace-IDs: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Nachdem Sie dies gelesen haben, sollten Sie sofort feststellen, dass das Kopieren von .ibd-Dateien einfach verrückt ist.

Sie können die Vorschläge vom Chris-Kalender-Link übernehmen oder zur alten Installation von mysql zurückkehren, mysql starten und dann die ddmsDatenbank mysqldumpen . Importieren Sie dann diesen mysqldump in Ihre neue mysql-Instanz. Vertrauen Sie mir, das wäre viel einfacher.


Eine einzelne Tabelle ist vielleicht keine gute Idee, aber wie sieht es mit einer ganzen Datenbank aus? Ich hatte einen schlechten Absturz meiner Benutzertabelle und musste auf mysqld eine --Initialisierung durchführen. Kann ich den gesamten InoDB-Datenbankordner aus dem Ordner data_backup kopieren?
FMaz008

Rolando, nur für den Fall, dass Sie mir helfen können: serverfault.com/q/908988/224334
Ionică Bizău

Ihr Beitrag auf How to Recover an InnoDB table whose files were moved around hat mir buchstäblich das Leben gerettet. Vielen Dank.
Paulo Griettner

20

Ich habe vor kurzem das gleiche Problem erlebt. Hier sind die Schritte, mit denen ich es gelöst habe, ohne mit der Tablespace-ID herumspielen zu müssen, wie RolandoMySQLDBA oben erwähnt. Ich bin auf einem Mac und habe MAMP verwendet, um die Datenbank so weit wiederherzustellen, dass ich sie in einen MySQL-Dump exportieren kann.

Den vollständigen Blog-Beitrag dazu finden Sie hier: http://www.quora.com/Jordan-Ryan/Web-Dev/How-to-Recover-innoDB-MySQL-files-using-MAMP-on-a-Mac

Du musst haben:

-ibdata1

-ib_logfile0

-ib_logfile1

-.FRM-Dateien aus Ihrem Ordner mysql_database

-Frische Installation von MAMP / MAMP Pro, die Sie zerstören möchten (falls erforderlich)

  1. Stellen Sie eine SSH-Verbindung zu Ihrem Webserver her (Entwickler, Produktion, kein Unterschied) und navigieren Sie zu Ihrem MySQL-Ordner (meiner befand sich unter / var / lib / mysql für eine Plesk-Installation unter Linux).
  2. Komprimiere den mysql Ordner
  3. Laden Sie ein Archiv des mysql-Ordners herunter, das alle mySQL-Datenbanken enthalten soll, ob MyISAM oder innoDB (Sie können diese Datei scp oder in ein herunterladbares Verzeichnis verschieben, falls erforderlich).
  4. Installieren Sie MAMP (Mac, Apache, MySQL, PHP)
  5. Navigieren Sie zu / Applications / MAMP / db / mysql /
  6. Backup / Applications / MAMP / db / mysql in ein Zip-Archiv (nur für den Fall)
  7. Kopieren Sie alle Ordner und Dateien, die im Archiv des mysql-Ordners enthalten sind, vom Produktionsserver (in meinem Fall mt Plesk-Umgebung). AUSSER NICHT ÜBERSCHREIBEN:

    - / Programme / MAMP / db / mysql / mysql /

    - / Applications / MAMP / db / mysql / mysql_upgrade_info

    - / Applications / MAMP / db / mysql / performance_schema

  8. Und voila, du solltest jetzt in der Lage sein, von phpMyAdmin aus auf die Datenbanken zuzugreifen, was für eine Erleichterung!

Aber wir sind noch nicht fertig, Sie müssen jetzt einen mysqldump ausführen, um diese Dateien in Ihrer Produktionsumgebung wiederherzustellen, und die phpmyadmin-Schnittstelle läuft bei großen Datenbanken ab. Folgen Sie den Schritten hier:

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

Unten als Referenz kopiert. Beachten Sie, dass bei einer Standardinstallation von MAMP das Kennwort "root" lautet.

So führen Sie mysqldump for MAMP mit Terminal aus

EXPORTDATENBANK VON MAMP [1]

Erster Schritt: Öffnen Sie ein neues Terminalfenster

Schritt 2: Navigieren Sie zur MAMP-Installation, indem Sie die folgende Zeile in Terminal cd / applications / MAMP / library / bin eingeben. Drücken Sie die Eingabetaste

Schritt 3: Schreiben Sie den Dump-Befehl ./mysqldump -u [BENUTZERNAME] -p [DATA_BASENAME]> [PATH_TO_FILE] Drücken Sie die Eingabetaste

Beispiel:

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

Schnelltipp: Um schnell zu einem Ordner zu navigieren, können Sie den Ordner in das Terminalfenster ziehen und er schreibt den Speicherort des Ordners. Es war ein großartiger Tag, an dem mir jemand dies zeigte.

Schritt 4: Diese Textzeile sollte erscheinen, nachdem Sie die Eingabetaste gedrückt haben. Passwort eingeben: Ratet mal, geben Sie Ihr Passwort ein und denken Sie daran, dass die Buchstaben nicht angezeigt werden, aber sie sind da. Drücken Sie die Eingabetaste

Fünfter Schritt: Überprüfen Sie den Ort, an dem Sie Ihre Datei gespeichert haben. Falls vorhanden, ERFOLG. Jetzt können Sie die Datenbank importieren, die als nächstes beschrieben wird.

Nachdem Sie Ihre MySQL-Datenbank exportiert haben, können Sie sie in die Produktionsumgebung importieren.


1
Arbeitet noch ab 2018. Diese Antwort ist Gold. Der wichtigste Teil für mich ist die Nummer 7, das sind die Dateien, die Sie unbedingt aufbewahren müssen (bei ähnlichen Lösungen wird sie nirgendwo anders erwähnt, danke für das @jordan).
Bigood

@Bigood froh, dass es immer noch hilft!
Jordan8037310

Fehler 1146 Tabelle existiert nicht, wenn der Dump ausgeführt wird
Robert Sinclair

15

Ich habe meine MySQL 5.5 * .ibd- und * .frm-Dateien mit MySQL Utilites und MariaDB 10 wiederhergestellt.

1) Generieren von Create SQLs.
Sie können Ihre erstellten SQL-Dateien aus der Frm-Datei abrufen. Sie müssen Folgendes verwenden: https://dev.mysql.com/doc/mysql-utilities/1.5/de/mysqlfrm.html

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

andere Weise können Sie Ihre SQLs erstellen.

2) Erstellen Sie Ihre Tabellen
Erstellen Sie Ihre Tabellen in der Datenbank.

3) alter table xxx
discard tablespace Verwerfen Sie die Tabellen, die Sie durch Ihre * .ibd-Dateien ersetzen möchten.

4) Kopieren Sie Ihre * .ibd-Dateien (MySQL oder MariaDB) in den Datenpfad von MariaDB.
Zuerst versuche ich, MySQL 5.5 und 5.6 zum Wiederherstellen zu verwenden, aber die Datenbank stürzt ab und stoppt sofort, wenn ein Fehler mit der Tabellenbereichs-ID vorliegt. ( FEHLER 1030 (HY000): Fehler -1 vom Speichergerät )
Nachdem ich MariaDB 10.1.8 verwendet habe und meine Daten erfolgreich wiederhergestellt habe.

5) alter table xxx tablespace importieren
Wenn Sie diese Anweisung ausführen, warnt MariaDB vor Dateien, aber es ist nicht wichtig, Ihre Daten wiederherzustellen :) Die Datenbank wird weiterhin fortgesetzt und Sie können Ihre Daten sehen.

Ich hoffe, diese Informationen sind hilfreich für Sie.


1
Das hat bei mir funktioniert. Obwohl mysqlfrm(ausprobierte Versionen 1.3.5 und 1.6.5 mit MySQLs 5.6 und 5.7) keine korrekte CREATEDefinition lieferten , führte dies auch bei Verwendung von MySQL 5.7 ( das in MySQL 5.7.9 geänderte Standard-ROW_FORMAT ) zum Schema mismatch (Expected FSP_SPACE_FLAGS=0x21, .ibd file contains 0x0.)Import des Tablespace. Manuelles Hinzufügen ROW_FORMAT=compactam Ende der CREATEAnweisung hat den Trick getan.
Jānis Elmeris

@ JānisElmeris> Manually adding ROW_FORMAT=compact at the end of the CREATE statement did the trick.Das hat auch bei mir funktioniert. Vielen Dank! 👍
Synetech

3

Ich hatte genau das gleiche Problem, nur die Dateien als Backup zu haben.

Was ich getan habe, um es zu lösen, war, die Datenbankdateien in / var / lib / mysql / yourdb und das ibdata1 zu kopieren, das in / var / lib / mysql gelegt wird.

Ich konnte dann überprüfen, ob ich auf die Tabellen mysql -u root -p dbname zugreifen und einige der zuvor beschädigten Tabellen abfragen konnte.

Anschließend habe ich die Datenbank mit mysqldump -u root -p [root_password] [Datenbankname]> dumpfilename.sql gesichert


2

Wenn Sie MAMP verwenden und MySQL nicht starten kann, nachdem Sie Ihre Dateien kopiert haben, habe ich es innodb_force_recovery = 2reingelegt my.iniund dann konnte ich mysql dazu bringen, meine Datenbank zu starten und zu exportieren.


1

Wenn Sie die * .ibd-Datei auf dem ursprünglichen MySQL-Server wiederherstellen können, vergessen Sie nicht, auch die Dateizugriffsrechte wiederherzustellen. In meinem Fall (MySQL8 unter CentOS7) habe ich die Datei in /var/lib/mysql/db/tablename.ibd wiederhergestellt und Folgendes ausgeführt:

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

Vor dem Korrigieren der Zugriffsrechte führte der Zugriff auf die Tabelle zu dem Fehler "2006 MySQL Server ist verschwunden". Nach dem Festlegen der Zugriffsrechte funktionierte die Tabelle (auch ohne Neustart des mysqld-Dienstes).


0

Ich habe Posts zu ähnlichen Themen gesammelt (deren Antworten hier nicht gepostet wurden):

Lösung 1: https://dba.stackexchange.com/a/59978

Lösung 2: https://dba.stackexchange.com/a/71785 (+ anderer Beitrag dort)

Lösung 3: Wiederherstellungskit für Tabellen: https://twindb.com/how-to-recover-innodb-dictionary/

lösung 4: Stellen Sie die MySQL-Datenbank aus dem Datenordner ohne ibdata1 aus den ibd-Dateien wieder her

Lösung 5: mysqlfrmBefehl verwenden

Lösung 6: https://dba.stackexchange.com/a/159001

Lösung 7: https://dba.stackexchange.com/a/144573


Dies sieht verdächtig nach einer Nur-Link-Antwort aus.
Mustaccio

Da alle Links von unserer eigenen Website stammen, werden sie wahrscheinlich nicht verschwinden. Ich bin also mit diesem @mustaccio
jcolebrand einverstanden.

3
Dies scheint keinen großen Mehrwert zu bringen, da die meisten davon auch in der Liste "Verwandte Themen" auf der rechten Seite angezeigt werden.
Mustaccio

@jcolebrand danke für die Unbeschwertheit. Viele Menschen können den Nutzen selbst solcher "nicht direkten" Antworten nicht erkennen. Sie können nur Regelbrüche erkennen.
T.Todua

1
Nein, aber du musst verstehen, dass er Recht hat. Sie haben keinen Wert hinzugefügt. Ich antwortete mit einem Regelurteil, ohne Ihre Antwort zu dulden. Das ist eigentlich eine ziemlich schlechte Antwort.
Jcolebrand

0

Ich möchte nur noch eine Sache für Macos El Capitan-Benutzer hinzufügen. MySQL-Dienstprogramme werden für diese Version nicht unterstützt, daher ist der Befehl mysqlfrm nicht hilfreich. Ich habe meine Tabellenstrukturen mit dbsake wiederhergestellt, wie in diesem Link gezeigt: https://www.percona.com/blog/2015/12/16/recovering-table-structure-from-files-using-dbsake/

Alles was Sie tun müssen, ist dbsake zu installieren:

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

Verwenden Sie dann den Befehl frmdump und geben Sie den Pfad zu Ihrer .frm-Datei an:

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

Sie erhalten die Anweisung create. Sobald ich dies getan habe, habe ich einfach die Schritte 2 bis 5 befolgt, die bereits von @Ecd erwähnt wurden. Hoffe es hilft jemandem.


0

Ich schätze Ecd sehr. Was hat bei mir funktioniert:

1.- Ich hatte vor ein paar Monaten ein Backup der Basis. Dies hat mir geholfen, dieses Backup in xampp in Windows 10 zu heben und die Tabellen mit der Struktur zu erstellen (Konfiguration: Windows 10, xampp-windows-x64-7.1.30- 5-VC14) mysql my.ini Konfigurationsdatei am Ende

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.- Mit der alten Datenbank habe ich fortgefahren, alter table xxx discard tablespace für jede Tabelle in der Datenbank auszuführen, die ich wiederherstellen wollte, und dann die .ibd-Dateien des Datenordners in C: / xampp / mysql / data / system wurde gelöscht (in diesem Fall ist es dieser Pfad)

3.- Ich kopierte die .ibd-Dateien von der Datenbank, die ich wiederherstellen wollte, in den xampp-Ordner der alten Datenbank

4.- Nachdem die Dateien kopiert wurden, führen Sie Folgendes aus: alter table xxx import tablespace Für jede Tabelle in der Datenbank wird eine Warnung angezeigt, die jedoch ignoriert wird. Die Daten werden in die Tabelle geladen und können später exportiert werden.

5.- Exportieren Sie die gesamte Datenbank in eine SQL-Datei und bauen Sie diese erfolgreich auf!

# 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

Ich hoffe es hilft jemandem, der diese Situation hat, Grüße.

Englisch bereitgestellt von Google


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.