web-dev-qa-db-fra.com

restaurer la table à partir du fichier .frm et .ibd?

J'ai précédemment enregistré une copie du répertoire/var/lib/mysql/ddms ("ddms" est le nom du schéma). Maintenant, j'ai installé un nouveau MySQL sur un Ubuntu 10.04.3 LTS fraîchement installé en exécutant apt-get install mysql-server, Je crois que la version 5.1 a été installée. Après avoir copié le répertoire ddms sous/var/lib/mysql, certaines de ses tables fonctionnent correctement, ce sont les tables avec un ensemble associé de trois fichiers: un fichier .frm, un fichier .MYD et un fichier .MYI.

Cependant, il existe deux tables avec un ensemble de fichiers différent: un fichier .frm et un fichier .ibd. Ces deux tables n'apparaissent pas dans la liste des tables dans phpMyAdmin. Quand je regarde le journal des erreurs, il dit:

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

Veuillez aider à restaurer ces deux tableaux. Merci.

38
Tong Wang

Les tables InnoDB ne peuvent pas être copiées de la même manière que les tables MyISAM.

La simple copie des fichiers .frm et .ibd d'un emplacement à un autre pose problème. La copie des fichiers .frm et .ibd d'une table InnoDB n'est bonne que si et seulement si vous pouvez garantir que l'ID d'espace de table du fichier .ibd correspond exactement à l'ID d'espace de table entrée dans les métdonnées du fichier ibdata1.

J'ai écrit deux articles dans DBA StackExchange sur ce concept d'ID d'espace de table

Voici un excellent lien sur la façon de rattacher n'importe quel fichier .ibd à ibdata1 en cas d'ID d'espace de table incompatibles: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Après avoir lu ceci, vous devriez vous rendre compte immédiatement que la copie de fichiers .ibd est tout simplement folle.

Vous pouvez appliquer les suggestions du lien Chris Calendar, ou vous pouvez revenir à l'ancienne installation de mysql, démarrer mysql, puis mysqldump la base de données ddms. Ensuite, importez ce mysqldump dans votre nouvelle instance mysql. Croyez-moi, ce serait beaucoup plus facile.

38
RolandoMySQLDBA

J'ai récemment rencontré ce même problème. Voici les étapes que j'ai utilisées pour le résoudre sans avoir à jouer avec l'ID d'espace de table comme le mentionne RolandoMySQLDBA ci-dessus. Je suis sur un Mac et j'ai donc utilisé MAMP afin de restaurer la base de données à un point où je pouvais l'exporter dans un vidage MySQL.

Vous pouvez lire le blog complet à ce sujet ici: http://www.quora.com/Jordan-Ryan/Web-Dev/How-to-Recover-innoDB-MySQL-files-using-MAMP-on -a-Mac

Vous devez avoir:

-ibdata1

-ib_logfile0

-ib_logfile1

-.FRM à partir de votre dossier mysql_database

- Nouvelle installation de MAMP/MAMP Pro que vous êtes prêt à détruire (si nécessaire)

  1. Connectez-vous à votre serveur Web (dev, production, aucune différence) et accédez à votre dossier mysql (le mien se trouvait dans/var/lib/mysql pour une installation Plesk sous Linux)
  2. Compressez le dossier mysql
  3. Téléchargez une archive du dossier mysql qui devrait contenir toutes les bases de données mySQL, que ce soit MyISAM ou innoDB (vous pouvez scp ce fichier, ou le déplacer vers un répertoire téléchargeable, si nécessaire)
  4. Installer MAMP (Mac, Apache, MySQL, PHP)
  5. Accédez à/Applications/MAMP/db/mysql /
  6. Sauvegarde/Applications/MAMP/db/mysql dans une archive Zip (juste au cas où)
  7. Copiez dans tous les dossiers et fichiers inclus dans l'archive du dossier mysql du serveur de production (environnement mt Plesk dans mon cas) SAUF NE PAS ÉCRASER:

    -/Applications/MAMP/db/mysql/mysql /

    -/Applications/MAMP/db/mysql/mysql_upgrade_info

    -/Applications/MAMP/db/mysql/performance_schema

  8. Et voila, vous devriez maintenant pouvoir accéder aux bases de données depuis phpMyAdmin, quel soulagement!

Mais nous n'avons pas terminé, vous devez maintenant effectuer un mysqldump afin de restaurer ces fichiers dans votre environnement de production, et l'interface phpmyadmin expire pour les grandes bases de données. Suivez les étapes ici:

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

Copié ci-dessous pour référence. Notez que sur une installation MAMP par défaut, le mot de passe est "root".

Comment exécuter mysqldump pour MAMP à l'aide de Terminal

EXPORTER LA BASE DE DONNÉES DE MAMP [1]

Première étape: Ouvrez une nouvelle fenêtre de terminal

Deuxième étape: Accédez à l'installation MAMP en entrant la ligne suivante dans le terminal cd/applications/MAMP/bibliothèque/bin Appuyez sur la touche Entrée

Troisième étape: Écrivez la commande de vidage ./mysqldump -u [USERNAME] -p [DATA_BASENAME]> [PATH_TO_FILE] Appuyez sur la touche Entrée

Exemple:

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

Astuce rapide: pour accéder rapidement à un dossier, vous pouvez faire glisser le dossier dans la fenêtre du terminal et il écrira l'emplacement du dossier. Ce fut une belle journée quand quelqu'un m'a montré cela.

Quatrième étape: Cette ligne de texte devrait apparaître après avoir tapé sur Enter Enter password: Alors devinez quoi, tapez votre mot de passe, gardez à l'esprit que les lettres ne seront pas apparaissent, mais ils sont là Appuyez sur la touche Entrée

Cinquième étape: Vérifiez l'emplacement où vous avez stocké votre fichier, s'il est là, SUCCÈS Vous pouvez maintenant importer la base de données, qui sera décrite ci-dessous.

Maintenant que vous avez une exportation de votre base de données mysql, vous pouvez l'importer dans l'environnement de production.

20
jordan8037310

J'ai récupéré mes fichiers MySQL 5.5 * .ibd et * .frm en utilisant MySQL Utilites et MariaDB 10.

1) Génération de SQL de création
Vous pouvez obtenir vos sql de création à partir du fichier frm. Vous devez utiliser: 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

Vous pouvez également créer vos sql de création.

2) Créez vos tables
Créez vos tables sur la base de données.

3) alter table xxx discard tablespace
Jetez vos tables qui souhaitez-vous remplacer vos fichiers * .ibd.

4) Copiez vos fichiers * .ibd (MySQL ou MariaDB) dans le chemin de données de MariaDB
D'abord, j'essaie d'utiliser MySQL 5.5 et 5.6 pour restaurer, mais la base de données se bloque et s'arrête immédiatement à propos de l'erreur cassée de l'ID de l'espace de table. ( ERREUR 1030 (HY000): Erreur -1 du moteur de stockage)
Après avoir utilisé MariaDB 10.1.8 et avoir réussi à récupérer mes données.

5) alter table xxx import tablespace
Lorsque vous exécutez cette instruction, MariaDB met en garde contre le fichier, mais ce n'est pas important que de récupérer vos données :) La base de données continue et vous pouvez voir vos données.

J'espère que ces informations vous seront utiles.

15
Ecd

J'ai eu exactement le même problème que d'avoir les fichiers en tant que sauvegarde.

Ce que j'ai fait pour le résoudre, c'était de copier les fichiers de la base de données dans/var/lib/mysql/yourdb et l'ibdata1 qui est placé dans/var/lib/mysql.

J'ai alors pu vérifier que je pouvais accéder aux tables mysql -u root -p dbname et l'interrogation de certaines des tables précédemment corrompues.

J'ai ensuite fait un vidage de la base de données avec mysqldump -u root -p [root_password] [database_name]> dumpfilename.sql

3
Tue

Si vous utilisez MAMP et que vous ne pouvez pas faire démarrer MySQL après avoir copié vos fichiers, je mets innodb_force_recovery = 2 à l'intérieur my.ini puis j'ai pu obtenir mysql pour lancer et exporter ma base de données.

2
Peter Wakeman

Si vous pouvez restaurer le fichier * .ibd sur le serveur MySQL d'origine, n'oubliez pas de restaurer également les droits d'accès au fichier. Dans mon cas (MySQL8 sur CentOS7), j'ai restauré le fichier dans /var/lib/mysql/db/tablename.ibd et exécuté:

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

Avant de fixer les droits d'accès, l'accès à la table entraînait l'erreur "2006 MySQL server has gone away". Après avoir fixé les droits d'accès, la table a fonctionné (même sans redémarrage du service mysqld).

1
Samuraj

Je veux juste ajouter une chose pour les utilisateurs de macos El Capitan. Les utilitaires MySQL ne sont pas pris en charge pour cette version, la commande mysqlfrm n'est donc pas utile. Ce que j'ai fait, c'est récupérer mes structures de table avec dbsake comme indiqué dans ce lien: https://www.percona.com/blog/2015/12/16/recovering-table-structure-from-frm-files- using-dbsake /

Tout ce que vous devez faire est d'installer dbsake:

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

puis utilisez la commande frmdump et indiquez le chemin d'accès à votre fichier .frm:

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

vous obtiendrez l'instruction create. Une fois que j'ai fait cela, j'ai simplement suivi les étapes 2 à 5 déjà mentionnées par @Ecd. J'espère que cela aide quelqu'un.

0
user2804064

J'apprécie vraiment Ecd. Ce qui a fonctionné pour moi:

1 .- J'ai eu une sauvegarde de la base il y a quelques mois, cela m'a aidé à lever cette sauvegarde dans xampp dans Windows 10 et à créer les tables pour avoir la structure (configuration: Windows 10, xampp-windows-x64-7.1.30-5-VC14) Fichier de configuration mysql my.ini à la fin

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 .- Ayant l'ancienne base de données en place, j'ai continué à exécuter alter table xxx discard tablespace pour chaque table de la base de données que je voulais récupérer, puis les fichiers .ibd du dossier de données en C:/xampp/mysql/data/system avait été supprimé (dans ce cas c'est ce chemin)

.- J'ai procédé à la copie des fichiers .ibd de la base de données que je voulais récupérer dans le dossier xampp de l'ancienne base de données

4 .- Après avoir copié les fichiers, exécutez: alter table xxx import tablespace Pour chaque table de la base de données, un avertissement apparaîtra mais nous l'ignorerons, les données seront chargées dans la table et pourront être exporté plus tard.

5 .- Exportez la base de données entière dans un fichier sql et continuez à la construire en production et en succès!

# 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

J'espère que cela aide quelqu'un qui a cette situation, salut.

Anglais fourni par Google

0
Yersskit

J'ai collecté des messages sur des sujets similaires (dont les réponses n'ont pas été publiées ici):

solution 1: https://dba.stackexchange.com/a/59978

solution 2: https://dba.stackexchange.com/a/71785 (+ autre poste là-bas)

solution 3: kit de récupération pour les tables: https://twindb.com/how-to-recover-innodb-dictionary/

solution 4: récupérer la base de données MySQL à partir du dossier de données sans ibdata1 à partir des fichiers ibd

solution 5: en utilisant la commande mysqlfrm

solution 6: https://dba.stackexchange.com/a/159001

solution 7: https://dba.stackexchange.com/a/14457

0
T.Todua