Commenti riparati :)

Prima di tutto, bentornati!
E` passato un intenso quasi-mese dall’ultima volta che ho scritto – sono successe molte cose tra cui l’uscita di Leopard (che ho installato il giorno dopo il LinuxDay), giochi con l’iPhone, e diverse escursioni interessanti (flickr mi e` testimone)
[Adesso che l’ho finito, so che questo post e` troppo lungo, ma dopo un mese spero nella vostra pazienza… n.d.a.]

Dovete sapere che l’ultima volta che ho tentato di dare uno sguardo ai settaggi di Spam Karma per questo blog, l’allegro MySQL ha deciso di morirmi addosso. La cosa non mi ha sorpreso piu` di tanto, dato che come sapete in passato accadeva abbastanza di frequente, pero` negli ultimi tempi mi pareva che le cose fossero andate a posto.
Cercando di approfondire, ho notato che nella tabella dei commenti c’erano 2700 righe: questo invece mi ha sorpreso parecchio, mi aspettavo di trovarci quelle poche centinaia che ci avevamo scritto insieme…

Facciamo breve una storia lunga: la ragione di un numero cosi` alto di commenti nella tabella e` il fatto che SK non cancella i commenti, ma semplicemente li marca come spam. La vera ragione della morte di MySQL era il fatto che la tabella poggiasse in parte su una pagina di db corrotta (cosi` almeno diceva innochecksum).
Il problema vero e` stato trovare il modo di ripristinare la tabella senza perdere i commenti vecchi, visto che
– il db copiato su un’altra macchina andava in crash con certe query, e con altre no (tipicamente quelle che richiedevano uno scan dell’intera tabella, direi)
– non so niente di SQL
– non ci volevo perdere delle settimane
– i classici “check table”, “delete from” e svariate altre operazioni crashavano mysqld, che prontamente veniva resuscitato da mysql_safe, e che prontamente crashava di nuovo e cosi` via in una rutilante girandola di luci e suoni (quali fossero e` lasciato come esercizio al fantasioso lettore)

Quindi (wordpress manual table purge picohowto):
installato un mysql uguale su un’altra macchina (e smadonna perche` va piano, e cerca un altro mirror, …)
copia di tutta la dir mysql (stop di mysql qui, tar|gz|scp sull’altra macchina|start di mysql qui e la`)
– scoperto che si legge tranquillamente file binari anche di architetture di endianness diversa (fico!)
– scoperto come fa wp a capire se un commento e` buono, da approvare o spam
trovati i commenti “buoni”, riversati un un file di testo chenonsisamai e salvati i rispettivi comment_id

select comment_id from wp_comments where comment_approved = '1';

– studiato 23 modi di spostarli senza fare troppa fatica usando sapienti mix di shell, awk, perl e anche modula-2
– appurato che era una strada piu` in salita che imparare tre righe di SQL (stima)
– scoperto come si vede la struttura di una tabella e applicato a wp_comments
show create table wp_comments;
creata una tabella wp_comments2 usando l’output del comando precedente, e la funzione source
assemblato un file sql a colpi di shell fatto cosi`

insert into wp_comments2 select * from wp_comments where comment_id = id_commento_buono;

da una riga per comment_id, e lanciato da dentro mysql. (source muovi.sql)
DROP della fo*$$*a tabella corrotta, e rename della nuova come la vecchia

rename table wp_comments2 to wp_comments;

dump in formato testo della tabella|gzip|scp qui
source del file sql, con conseguente drop e ripopolamento della tabella corrotta
backup del tutto che sai mai che muoia di nuovo domani

Alla fine, sembra andare… (e per natale forse mi regalo la Nikon D40x)

Author: zen

Geek of all trades, having fun with *NIX, the Internet and computer security since 1995.

5 thoughts on “Commenti riparati :)”

  1. Per la prossima volta,

    create table wpcomm2 select * from wp_comments where comment_approved = '1';

    Giusto perch¬® il simpatico mysql non supporta select … into, ma questa ¬® un’altra storia… :P

  2. @nextie: quando vuoi o quasi :)
    @negro: grazie! in effetti “a naso” avevo tentato un select…into ma poi ho googlato per la Risposta Giusta… (o dovrei dire “Domanda”, per via di “query”?)

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.