it-swarm-eu.dev

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

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, indem ich apt-get install mysql-server Ausgeführt habe. 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: einer .frm-Datei, einer .MYD-Datei und einer .MYI-Datei.

Es gibt jedoch zwei Tabellen mit unterschiedlichen Dateien: 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 beim Wiederherstellen dieser beiden Tabellen. Vielen Dank.

38
Tong Wang

InnoDB-Tabellen können nicht auf die gleiche Weise wie MyISAM-Tabellen kopiert werden.

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

Ich habe zwei Beiträge in DBA StackExchange über dieses Tablespace-ID-Konzept geschrieben

Hier finden Sie einen hervorragenden Link zum erneuten Anhängen einer .ibd-Datei an ibdata1 bei 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 über den Chris-Kalender-Link anwenden oder zur alten Installation von mysql zurückkehren, mysql starten und dann die Datenbank ddms mysqldump. Importieren Sie dann diesen mysqldump in Ihre neue mysql-Instanz. Vertrauen Sie mir, das wäre viel einfacher.

38
RolandoMySQLDBA

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. SSH in Ihren Webserver (Entwickler, Produktion, kein Unterschied) und navigieren Sie zu Ihrem MySQL-Ordner (meiner war unter/var/lib/mysql für eine Plesk-Installation unter Linux)
  2. Komprimieren Sie den MySQL-Ordner
  3. Laden Sie ein Archiv des MySQL-Ordners herunter, das alle mySQL-Datenbanken enthalten sollte, ob MyISAM oder innoDB (Sie können diese Datei scp oder bei Bedarf in ein herunterladbares Verzeichnis verschieben).
  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:

    -/Anwendungen/MAMP/db/mysql/mysql /

    -/Applications/MAMP/db/mysql/mysql_upgrade_info

    -/Applications/MAMP/db/mysql/performance_schema

  8. Und voila, du solltest jetzt von phpMyAdmin aus auf die Datenbanken zugreifen können, 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. Befolgen Sie die Schritte hier:

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

Unten als Referenz kopiert. Beachten Sie, dass bei einer Standard-MAMP-Installation das Kennwort "root" lautet.

So führen Sie mysqldump für MAMP mit Terminal aus

EXPORTDATENBANK VON MAMP [1]

Erster Schritt: Öffnen Sie ein neues Terminalfenster

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

Schritt drei: Schreiben Sie den Befehl dump ./mysqldump -u [USERNAME] -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

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

Vierter Schritt: Diese Textzeile sollte erscheinen, nachdem Sie die Eingabetaste drücken: Ratet mal, geben Sie Ihr Passwort ein und denken Sie daran, dass die Buchstaben dies nicht tun erscheinen, aber sie sind da Drücken Sie die Eingabetaste

Fünfter Schritt: Überprüfen Sie den Speicherort Ihrer Datei, 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.

20
jordan8037310

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

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

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

Auf andere Weise können Sie SQLs erstellen.

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

3) Tabelle ändern xxx Tabellenbereich verwerfen
Verwerfen Sie Ihre Tabellen, die Ihre * .ibd-Dateien ersetzen sollen.

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 wegen eines fehlerhaften Tablespace-ID-Fehlers. ( FEHLER 1030 (HY000): Fehler -1 von der Speicher-Engine erhalten)
Nachdem ich MariaDB 10.1.8 verwendet habe und meine Daten erfolgreich wiederhergestellt habe.

5) Tabelle ändern xxx Tabellenbereich importieren
Wenn Sie diese Anweisung ausführen, warnt MariaDB vor einer Datei, aber es ist nicht wichtig, als Ihre Daten wiederherzustellen :) Die Datenbank wird weiterhin fortgesetzt und Sie können Ihre Daten sehen.

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

15
Ecd

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

Um dies zu lösen, habe ich die Datenbankdateien in/var/lib/mysql/yourdb und die ibdata1 in/var/lib/mysql kopiert.

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

Ich habe danach einen Dump der Datenbank mit mysqldump -u root -p [root_password] [database_name]> dumpfilename.sql erstellt

3
Tue

Wenn Sie MAMP verwenden und MySQL nicht starten kann, nachdem Sie Ihre Dateien kopiert haben, setze ich innodb_force_recovery = 2 Innerhalb my.ini und dann konnte ich mysql zum Starten und Exportieren meiner Datenbank bringen.

2
Peter Wakeman

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 Festlegen 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).

1
Samuraj

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-frm-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
user2804064

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

1 .- Ich hatte vor einigen 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) Konfigurationsdatei mysql my.ini 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 .- Nachdem die alte Datenbank eingerichtet war, führte ich die Änderungstabelle xxx für jede Tabelle in der Datenbank aus, 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)

.- Ich habe die .ibd-Dateien aus der Datenbank, die ich wiederherstellen wollte, in den xampp-Ordner der alten Datenbank kopiert

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 wir jedoch ignorieren. Die Daten werden in die Tabelle geladen und können es sein später exportiert.

5 .- Exportieren Sie die gesamte Datenbank in eine SQL-Datei und bauen Sie sie in Produktion und Erfolg 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

0
Yersskit

Ich habe Beiträge zu ähnlichen Themen gesammelt (deren Antworten hier nicht veröffentlicht 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: MySQL-Datenbank aus Datenordner ohne ibdata1 aus ibd-Dateien wiederherstellen

lösung 5: Verwenden des Befehls mysqlfrm

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

lösung 7: https://dba.stackexchange.com/a/14457

0
T.Todua