Domanda

Così ho un server di prova db che è stato installato su un flusso di replica. Sul nome di un optimize è venuto attraverso che rapidamente riempito lo spazio sulla schiavi datadir. Mysql doverosamente era solo in attesa di un po 'di spazio.

Questa datadir è un file system utilizzato solo come datadir di mysql quindi non c'era niente altro da liberare.

Ho avuto un 4 giga tabella di test InnoDB che non era parte del flusso di replica in modo ho pensato di provare qualcosa per vedere se avrebbe funzionato, e di essere un ambiente di test non ero troppo preoccupato se le cose sono andate terribilmente sbagliato.

Ecco i passi che ho fatto

  1. Flushed tavolo stavo per spostare
  2. Situato un blocco di lettura su di esso (anche se nulla è stato scritto ad esso e non era nel flusso replica)
  3. Copiato il .frm e .ibd verso un filesystem w / certa stanza di ricambio
  4. Sbloccato tabella
  5. troncato quel tavolo -. Questa liberato abbastanza spazio per l'optimize alla fine hanno replica iniziare chugging lungo di nuovo
  6. Arresto asservimento / spegnimento mysql
  7. Copiare il file di tmp di nuovo ai dati dir
  8. Riavvia mysql

mostra nulla nel log .err, le cose sembrano buone. I collegare e utilizzare mydb; e vedere la tabella che avrei dovuto vedermela con a mostrare le tabelle. Ma, se provo

select * from testtable limit 10;

ottengo l'errore

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

Da quello che posso dire finora posso leggere da tutti gli altri tavoli proprio bene e replica iniziato back up w / o eventuali reclami.

C'è qualcosa che posso fare per recuperare da questo punto? Posso ricostruire da zero, se ha bisogno di essere, ma era curioso di ciò che gli altri pensavano di questa impresa in generale. C'era nulla circa la serie di passaggi ho preso che avrebbe finito per w / risultati più perfetti?

E se questo non era un server di test non ho potuto solo 'farlo vivere' e vedere cosa succede? Che cosa sarebbe il modo migliore per liberare spazio temporaneamente uno schiavo di produzione se dovessi genere?

È stato utile?

Soluzione

La cosa più importante la maggior parte delle persone dimenticare TRUNCATE TABLE è che TRUNCATE TABLE è DDL e DML non . Nel InnoDB, i metadati all'interno di ibdata1 contiene un elenco numerato di tabelle InnoDB. Utilizzando TRUNCATE TABLE provoca l'id metadati interni della tabella InnoDB di spostamento. Questo accade perché TRUNCATE TABLE fa effettivamente la seguente:

Esempio: Per troncare una tabella InnoDB chiamato mydb.mytb

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

La nuova mytb avrebbe quindi un diverso metadati ID interno.

Quando è stato copiato il file .ibd in qualche altro luogo, il .ibd contiene al suo interno l'originale metadati ID interno. Basta mettere la parte posteriore del file .ibd non causa una riconciliazione dei metadati id interna con quella di quella di ibdata1.

Che cosa si dovrebbe hai fatto è questo:

Copiare il file .ibd della tabella InnoDB. Quindi, eseguire questo

ALTER TABLE tablename DISCARD TABLESPACE;

Per riportarlo in seguito, copiare il file di schiena .ibd in datadir e quindi eseguire

ALTER TABLE tablename IMPORT TABLESPACE;

Questo avrebbe conservato i metadati ID interno.

Assicurarsi .frm è sempre presente.

Una volta ho aiutato un cliente a ripristinare 30 tabelle InnoDB ha hosed nello stesso modo. Ho dovuto usare un altro server DB e giocare alcuni giochi con aggiunta e l'eliminazione tabelle InnoDB per dare la caccia e la correttezza dei metadati ID interno.

Il cliente ha trovato questo articolo: http://www.chriscalender.com/ ? tag = InnoDB-error-tablespace-id-in-file . Abbiamo usato e mi ha aiutato molto. Spero che ti aiuta.

Altri suggerimenti

ho sperimentato con il mio Mac, prima di vendere ad un amico semplicemente copiare la cartella XAMPP solo per il mio disco rigido. (Non il successo) Purtroppo, stava portando guai a me, perché ho provato le seguenti operazioni: - installo fresca XAMPP e copiare l'intero \ httdocs e var \ mysql al mio nuovo Mac, quelli db solo con il .frm e .ibd, non funziona, non posso ancora accedere ai tavoli interni PHPMyAdmin ... - Ho provato ad installare la stessa versione XAMPP e ripetere i passaggi precedenti, ancora non funziona. -. Abbiamo deciso di andare a letto

(successo) - Questa mattina, ho portato il mio disco di backup e cerco con Windows 7. - Installare fresca ultimo XAMPP per Windows, C: \ xampp - Ho uno di sito (cartella) dal mio backup \ httdocs e del database corrispondono cartella all'interno \ var \ mysql sono pronti a mie finestre 7, voglio solo provare con un sito web allora provare il resto perché ho molti progetti all'interno httdocs \ e \ var \ mysql - copio la menzione httdocs \ cartella di Windows c: \ xampp \ httdocs e copiare il \ var \ mysql in c: \ xampp \ mysql \ data

NON ULTIMA ANCORA Copio l'ib_logfile0, ib_logfile1, ibdata1 dal mio file di backup di Windows XAMPP c: \ xampp \ mysql \ data

http: // localhost / MyWebSite

WOW WOW fatto ... che stia funzionando ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top