En raison du problème suivant:
mysql> desc reportingdb.v3_zone_date_cpm7k;
ERROR 1146 (42S02): Table 'reportingdb.v3_zone_date_cpm7k' doesn't exist
/ var/journal/mysqld.log
120927 16:57:04 [ERROR] Cannot find or open table reportingdb/v3_zone_date_cpm7k#P#pcurrent_2012926 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.
See http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting.html
how you can resolve the problem.
(Je n'ai pas encore trouvé la raison)
Les fichiers de la table existent toujours dans le Datadir:
-rw-rw---- 1 mysql mysql 8932 Sep 26 16:50 /var/lib/mysql/reportingdb/v3_zone_date_cpm7k.frm
-rw-rw---- 1 mysql mysql 84 Sep 26 16:50 /var/lib/mysql/reportingdb/v3_zone_date_cpm7k.par
-rw-rw---- 1 mysql mysql 9437184 Sep 13 17:56 /var/lib/mysql/reportingdb/v3_zone_date_cpm7k#P#MERGER_2012828.ibd
-rw-rw---- 1 mysql mysql 1048576 Sep 27 15:42 /var/lib/mysql/reportingdb/v3_zone_date_cpm7k#P#MERGER_2012926.ibd
C'est la table DDL à partir d'une sauvegarde antérieure d'un mois (afin que les partitions ont changé), mais pour référence:
CREATE TABLE `v3_zone_date_cpm7k` (
`campaignid` mediumint(9) NOT NULL DEFAULT '0' COMMENT 'sub_campaignid',
`zoneid` smallint(6) NOT NULL DEFAULT '0',
`bannerid` mediumint(9) NOT NULL DEFAULT '0',
`totalclick` mediumint(9) unsigned NOT NULL DEFAULT '0',
`realclick` mediumint(9) unsigned NOT NULL DEFAULT '0',
`clickcharge` mediumint(9) NOT NULL DEFAULT '0',
`totalview` mediumint(9) unsigned NOT NULL DEFAULT '0',
`viewcharge` mediumint(9) unsigned NOT NULL DEFAULT '0',
`dt` date NOT NULL DEFAULT '0000-00-00',
`partnerid` smallint(6) unsigned NOT NULL DEFAULT '0',
KEY `ix_zoneid` (`zoneid`,`dt`),
KEY `ix_dt` (`dt`),
KEY `ix_campaignid` (`bannerid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (TO_DAYS(dt))
(PARTITION p00 VALUES LESS THAN (0) ENGINE = InnoDB,
PARTITION p04 VALUES LESS THAN (734965) ENGINE = InnoDB,
PARTITION p05 VALUES LESS THAN (735025) ENGINE = InnoDB,
PARTITION MERGER_2012822 VALUES LESS THAN (735102) ENGINE = InnoDB,
PARTITION pcurrent_2012822 VALUES LESS THAN (735103) ENGINE = InnoDB,
PARTITION pcurrent_2012823 VALUES LESS THAN (735104) ENGINE = InnoDB)*/
Je vais récupérer cette table Suivre this guide. Mais à 2c. Étape, je reçois les erreurs ci-dessous:
mysql> alter table v3_zone_date_cpm7k_restore discard tablespace;
ERROR 1031 (HY000): Table storage engine for 'v3_zone_date_cpm7k_restore' doesn't have this option
http://bugs.mysql.com/bug.php?id=52422
Que puis-je faire maintenant?
MISE À JOUR
Je restaure de la sauvegarde, quelle est la bonne procédure pour se débarrasser de ce problème?
Ce que j'ai essayé (sur le serveur d'un autre):
Table de chute -> Toujours obtenir le "n'existe pas"
Arrêter mysql
Déplacez toutes les fichiers de la table vers un autre emplacement
Copier les fichiers de sauvegarde sur la base de données correspondante
Démarrer mysql:
120927 19:12:07 InnoDB: Error: table 'reportingdb/v3_zone_date_cpm7k#P#MERGER_2012828'
InnoDB: in InnoDB data dictionary has tablespace id 741528,
InnoDB: but tablespace with that id or name does not exist. Have
InnoDB: you deleted or moved .ibd files?
InnoDB: This may also be a table created with CREATE TEMPORARY TABLE
InnoDB: whose .ibd and .frm files MySQL automatically removed, but the
InnoDB: table still exists in the InnoDB internal data dictionary.
InnoDB: Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting-datadict.html
InnoDB: for how to resolve the issue.
InnoDB: We removed now the InnoDB internal data dictionary entry
InnoDB: of table `reportingdb`.`v3_zone_date_cpm7k` /* Partition `MERGER_2012828` */.
120927 19:12:07 InnoDB: error: space object of table 'reportingdb/v3_zone_date_cpm7k#P#MERGER_2012926',
InnoDB: space id 921829 did not exist in memory. Retrying an open.
120927 19:12:07 InnoDB: Error: table `reportingdb`.`v3_zone_date_cpm7k` /* Partition `pcurrent_2012926`
*/ does not exist in
the InnoDB internal
InnoDB: data dictionary though MySQL is trying to drop it.
InnoDB: Have you copied the .frm file of the table to the
InnoDB: MySQL database directory from another database?
InnoDB: You can look for further help from
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting.html
Mise à jour du vendredi 28 septembre 08:21:49 ICT 2012
Suivez votre suggestion, j'ai:
a importé le fichier .SQL et a obtenu l'erreur:
Erreur 1050 (42S01) à la ligne 25: Tableau 'reportingdb
.v3_zone_date_cpm7k
/* Cloison p00
*/' existe déjà
le journal d'erreur indique:
120928 8:26:42 InnoDB: Warning: trying to init to the tablespace memory cache
InnoDB: a tablespace 932889 of name './reportingdb/v3_zone_date_cpm7k#P#p00.ibd',
InnoDB: but a tablespace 932783 of the same name
InnoDB: already exists in the tablespace memory cache!
InnoDB: We assume that InnoDB did a crash recovery, and you had
InnoDB: an .ibd file for which the table did not exist in the
InnoDB: InnoDB internal data dictionary in the ibdata files.
InnoDB: We assume that you later removed the .ibd and .frm files,
InnoDB: and are now trying to recreate the table. We now remove the
InnoDB: conflicting tablespace object from the memory cache and try
InnoDB: the init again.
et le .idb
Le fichier est créé automatiquement après le redémarrage:
# ls -l /var/lib/mysql/reportingdb/v3_zone_date_cpm7k#P#p00.ibd
-rw-rw---- 1 mysql mysql 65536 Sep 28 08:35 /var/lib/mysql/reportingdb/v3_zone_date_cpm7k#P#p00.ibd
J'ai passé un peu de temps à essayer de reproduire l'erreur sur le schéma de partition, mais je ne peux pas obtenir l'erreur exacte avec la table orpheline.
120927 16:57:04 [Erreur] Impossible de trouver ou d'ouvrir la table Reportingingdb/v3_zone_date_cpm7k # p # pcurrent_2012926 à partir du dictionnaire de données interne de Innodb bien que le fichier .frm pour la table existe.
En déplaçant le fichier .ibd pour la partition hors du répertoire de données (ce qui semble en quelque sorte est arrivé), je reçois une erreur attendue:
[Erreur] MySQL tente d'ouvrir une poignée de table mais le fichier .ibd pour la table FOO/v3_zone_date_cpm7k # p # pcurrent_2012822 n'existe pas.
D'une discussion de discussion, je sais que vous avez un fichier de sauvegarde obsolète. En réalité en train de pouvoir forcer la partition 'pcurrent_2012926' (une perte de données), les étapes à suivre pour restaurer cette sauvegarde sont les suivantes (par mois de perte de données malheureusement):
mysqldump -uuser -p reportingdb v3_zone_date_cpm7k > v3_zone_date_cpm7k.sql
DROP TABLE reportingdb.v3_zone_date_cpm7k
mysql -uuser -p reportingdb < v3_zone_date_cpm7k.sql
Qui devrait restaurer ce tableau (avec une table omble de mois)DROP TABLE
Ne fonctionne pas, essayez de déplacer le v3_zone_date_cpm7k.frm
Et d'autres fichiers à un emplacement différent et redémarrez le serveur. Puis importer le fichier de vidageLa dernière étape concerne le message d'erreur vous indiquant que vous avez une table orphelinée:
Cela signifie qu'il y a un fichier orphelin .frm sans une table correspondante à l'intérieur de l'innovation. Vous pouvez déposer le fichier orpheliné .frm en le supprimant manuellement. [SRC]
J'espère vraiment que cela n'est pas nécessaire et vous pouvez restaurer la partition par un autre moyen. Ceci est une dernière méthode du complexe.
J'ai finalement reproduit votre erreur initiale. Bien qu'il faudra peu pour restaurer la partition, il peut être utile de comprendre que cela se produise à l'avenir (problème potentiel dans la manière dont le processus de sauvegarde/restauration est manipulé ou comment les partitions sont créées):
DROP TABLE v3_zone_date_cpm7k
copiez les fichiers v3_zone_date_cpm7k à la suite du Datadir
desc v3_zone_date_cpm7k;
ERROR 1146 (42S02): Table 'v3_zone_date_cpm7k' doesn't exist
[Erreur] Impossible de trouver ou d'ouvrir la table v3_zone_date_cpm7k # p # p00 du dictionnaire de données interne de Innodb Bien que le fichier .frm pour la table existe.
Il existe un numéro spécial enregistré avec chaque table InnoDB. Ça s'appelle l'ID de tablespace. C'est un nombre attribué à la création de table et enregistré dans le dictionnaire de données à l'intérieur d'IBDATA1.
Il y a un moyen de faire disparaître ce problème, mais vous devez sauter à travers de nombreux cerceaux pour y parvenir. N'oubliez pas que si vous copiez une table InnoDb sur un autre disque, effectuez n'importe quel type de DDL et essayez de recopier les données de la table, il existe une petite possibilité de provoquer une incompatibilité des ID de tampon.
La seule personne que j'ai jamais lue à propos de cette récupération est Chris Calender , qui est le guide que vous avez fait référence à. J'ai déjà écrit cela auparavant.
Mar 25, 2012
: Pourquoi InnoDB stocke toutes les bases de données dans un fichier?Apr 23, 2012
: Restaurer la table de .frm et .ibd fichier?Sep 28, 2011
: Comment récupérer une table InnoDB dont les fichiers ont été déplacésJe pense que votre problème peut avoir à voir avec l'ID de table lui-même. Dans le 28 septembre, j'ai mentionné, j'ai aidé un client d'hébergement de DB qui a trouvé cette même référence. Son problème était ceci:
Le tablespace_id de cette table était de 912. Il a essayé de restaurer une ancienne copie de l'.ibd
fichier. Il avait unespace_id de table de tables de 912. Voici ce que je l'ai aidé à faire:
.ibd
fichierLe client avait 30 tables qu'il a dû faire. J'ai seulement écrit la procédure stockée pour lui. Je n'ai pas tenu pour les détails de Gory. Pourtant, le client a récupéré toutes les tables InnoDb, correspondant correctement à tous les tables de table.
Dans votre cas, je ne sais honnêtement pas si la méthode de Chris Calender fonctionnerait correctement sur une table partitionnée. Je suppose que l'idée serait d'obtenir tout .ibd
Fichiers dans la partition d'avoir des espaces de table identiques.