Come posso forzare la corruzione di una tabella MySQL?


17

Ho scritto un semplice plug-in Nagios che chiama mysqlcheck (che verifica la presenza di tabelle danneggiate) e fornirà un avviso se sono danneggiati.

Tuttavia nessuno dei miei tavoli è corrotto adesso. Quindi non sono sicuro al 100% che il mio plugin funzioni correttamente. Ho un server di sviluppo che non è misson critico. Come posso forzare uno (o uno) dei tavoli lì per essere corrotto in modo da poter testare il mio avviso nagios?

Per la cronaca, il server è Ubuntu Dapper e mysql è la versione 5.0


interessante .......
Sander Versluys,

3
Supponendo che siano tavoli MyISAM immagino che potresti semplicemente aprire una finestra. Una leggera violazione dovrebbe essere sufficiente per causare il crash di quei tavoli senza ACID, ribaltarsi e prendere fuoco;)
David

Risposte:


1

Generalmente non è possibile eseguire il backup dei database copiandoli da / var / lib / mysql e copiandoli nuovamente perché danneggiati, è invece necessario utilizzare mysqldump.

Quindi se vai in una delle cartelle per il database in / var / lib / mysql, cioè / var / lib / mysql / myDB / e confondi con alcuni dei file che dovrebbero farlo :-)

Quindi consiglierei di copiare uno dei file, modificandolo un po 'con un editor esadecimale e copiandolo indietro.


8
cat DB1.myd /dev/random > DB2.myd

Mi piace questo!
Kyle Brandt,

1
Non continuerà a estrarre dati da / dev / random fino a quando il mio hard disk non si riempie? : P
Rory,

2
Ehi, hai detto corrotto, vero? ;-)
Matt Simmons,

Rory, Ya, ma hai appena premuto Ctrl-C ad un certo punto
Kyle Brandt il

Rory, oppure usa head / dev / urandom, su un file e poi cat quelli
Kyle Brandt

3

È possibile utilizzare uno strumento di fuzzing come zzuf per fuzz un file di database preesistente, ad es

zzuf < good.myd > fuzzed.myd

3

Questo dovrebbe farlo:

cat /dev/urandom > yourdb.myd

Ciò continuerà fino a quando il mio disco rigido si riempie.
Rory,

2

Suggerirei che un modo più realistico per simulare l'errore sarebbe quello di estrarre il tappeto da sotto i piedi di MySQL mentre esegue un aggiornamento intensivo. L'invio di SIGKILL al mysqldprocesso dovrebbe essere sufficiente. È probabile che al riavvio di MySQL le tabelle in questione vengano contrassegnate come bloccate.

In alternativa, suggerirei di applicare i suggerimenti di altre persone ma al .MYIfile indec anziché al file di dati.


2

esempio:

mysql> repair table Transactions;
^CQuery aborted by Ctrl+C
+-----------------------------------+--------+----------+-----------------------+
| Table                             | Op     | Msg_type | Msg_text              |
+-----------------------------------+--------+----------+-----------------------+
| test.Transactions | repair | error    | 137 when fixing table |
| test.Transactions | repair | status   | Operation failed      |
+-----------------------------------+--------+----------+-----------------------+
2 rows in set (17.84 sec)

mysql> select * from Transactions limit 1;
ERROR 144 (HY000): Table './test/Transactions' is marked as crashed and last (automatic?) repair failed

1

forse un'esecuzione di comando che fa qualcosa del genere:

echo "aaa" > file.myd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.