Comment faire pour récupérer une table InnoDB dont les dossiers ont été déplacés

dba.stackexchange https://dba.stackexchange.com/questions/6268

  •  16-10-2019
  •  | 
  •  

Question

Alors j'ai un serveur db de test qui a été installé sur un flux de réplication. Sur le nom d'un optimize est venu à travers qui remplissait rapidement l'espace sur le datadir des esclaves. Mysql docilement vient attendre un peu plus d'espace.

Ce datadir est un système de fichiers utilisé uniquement comme datadir de MySQL donc il n'y avait rien d'autre à libérer.

J'ai eu une table de test InnoDB 4 gig qui ne faisait pas partie du flux de réplication, donc je pensais que je vais essayer quelque chose à voir si elle travaillerait, et d'être un environnement de test, je n'étais pas trop inquiet si les choses se sont horriblement mal.

Voici les étapes de mon

  1. Flushed la table, j'étais sur le point de se déplacer
  2. un verrou placé sur lecture (même si rien n'écrivait à lui et il n'a pas été dans le flux de réplication)
  3. Copié .frm et .ibd vers un système de fichiers w / une pièce de rechange
  4. Unlocked la table
  5. tronquées cette table -. Cette mesure a libéré suffisamment d'espace pour l'optimiser à la fin ont la réplication commencer cahin-caha à nouveau
  6. Arrêter asservissement / arrêt mysql
  7. Copiez le fichier de tmp Retour aux données dir
  8. Redémarrez mysql

Rien ne montre dans le journal .err, les choses semblent bonnes. Je mydb connecter et à utiliser; et voir le tableau que je déconner avec dans les tables d'exposition. Mais, si j'essaie

select * from testtable limit 10;

Je reçois l'erreur

ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist

D'après ce que je peux dire jusqu'à présent, je peux lire toutes les autres tables très bien et la réplication a commencé en w / o des plaintes.

Est-ce que je peux faire pour récupérer de ce point? Je peux reconstruire à partir de zéro si besoin est, mais était curieux ce que les autres pensaient de cette entreprise en général. Y avait-il quoi que ce soit au sujet de la série d'étapes de mon travail qui aurait fini avec des résultats plus / sans faille?

Et si ce n'était pas un serveur de test, je ne pouvais pas « faire vivre » et voir ce qui se passe? Que serait-il le meilleur moyen de libérer de l'espace temporairement sur un esclave de production si je devais comme ça?

Était-ce utile?

La solution

La plus grande chose que la plupart des gens oublient TRUNCATE TABLE est que TRUNCATE TABLE est et non DML LDD . Dans InnoDB, les métadonnées au sein ibdata1 contient une liste numérotée des tables InnoDB. Utilisation TRUNCATE TABLE provoque l'ID de métadonnées interne de la table InnoDB à décalage. Cela se produit parce que TRUNCATE TABLE réalise effectivement ce qui suit:

Exemple: Pour tronquer un tableau InnoDB appelé mydb.mytb

USE mydb
CREATE TABLE newtb LIKE mytb;
ALTER TABLE mytb RENAME oldtb;
ALTER TABLE newtb RENAME mytb;
DROP TABLE oldtb;

Le nouveau mytb aurait donc un identifiant de métadonnées internes différents.

Lorsque vous avez copié le fichier .ibd à un autre endroit, le .ibd contient en elle l'identifiant interne des métadonnées d'origine. Il suffit de mettre le dos de fichier .ibd ne provoque pas un rapprochement de l'identifiant interne des métadonnées avec celle de celui ibdata1.

Qu'est-ce que vous auriez dû faire est la suivante:

Copiez le fichier .ibd de la table InnoDB. Ensuite, exécutez

ALTER TABLE tablename DISCARD TABLESPACE;

Pour le ramener plus tard, copiez le dos de fichier .ibd dans datadir puis exécutez

ALTER TABLE tablename IMPORT TABLESPACE;

Cela aurait conservé l'id de métadonnées internes.

Assurez-vous que .frm est toujours présent.

Une fois, j'aidé un client à restaurer 30 tables InnoDB il Hosed de la même manière. Je devais utiliser un autre serveur DB et jouer à des jeux avec l'ajout et la suppression de tables InnoDB pour traquer l'ID de métadonnées interne correcte.

Le client a trouvé cet article: http://www.chriscalender.com/ ? tag = InnoDB-error-tablespace-id-in-file . Nous l'avons utilisé et il m'a beaucoup aidé. J'espère que cela vous aide.

Autres conseils

J'ai vécu avec mon Mac, avant de le vendre à un ami il suffit de copier le dossier XAMPP uniquement sur mon disque dur. (Pas le succès) Malheureusement, il apportait à me troubler, parce que j'ai essayé les étapes suivantes: - installer et frais XAMPP copier l'ensemble \ httdocs et var \ mysql à mon nouveau Mac, les db seulement avec .frm et .ibd, PAS DE TRAVAIL, je ne peux pas toujours accéder aux tables à l'intérieur PHPMyAdmin ... - J'ai essayé d'installer la même version xampp et répétez les étapes ci-dessus, ne fonctionne toujours pas. -. Nous avons décidé d'aller au lit

(SUCCESS) - Ce matin, j'ai apporté mon disque de sauvegarde et d'essayer avec Windows 7. - Installer frais dernière XAMPP pour Windows, c: \ xampp - Je l'un des site (dossier) de ma sauvegarde \ httdocs et le dossier base de données correspondent à l'intérieur \ var \ mysql sont prêts dans mes windows 7, je veux juste essayer avec un site Web puis essayer le reste parce que j'ai beaucoup de projets dans httdocs \ et \ var \ mysql - aux fenêtres c je copie la mention httdocs \ dossier: \ xampp \ httdocs et copiez le \ var \ mysql à c: \ xampp \ mysql \ data

DURE PAS ENCORE Je copie le ib_logfile0, ib_logfile1, ibdata1 de mon fichier de sauvegarde Windows c: \ xampp \ mysql \ data

Je http: // localhost / monsiteweb

WOW WOW fait ... il fonctionne ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top