¿Cómo puedo forzar que una tabla MySQL se corrompa?

17

He escrito un simple complemento de Nagios que llama a mysqlcheck (que comprueba las tablas dañadas) y dará una advertencia si alguna está dañada.

Sin embargo, ninguna de mis tablas está corrupta ahora. Así que no estoy 100% seguro de que mi complemento funcione bien. Tengo un servidor de desarrollo que no es crítico para la misión. ¿Cómo puedo forzar que una (o cualquiera) de las tablas estén corruptas para poder probar mi alerta de nagios?

Para el registro, el servidor es Ubuntu Dapper y mysql es la versión 5.0

Rory
fuente
interesante .......
Sander Versluys
3
Suponiendo que son tablas MyISAM, me imagino que podrías abrir una ventana. Una pequeña brecha debería ser suficiente para hacer que esas mesas libres de ACID se estrellen, se vuelquen y se incendien;)
David

Respuestas:

1

En general, no puede hacer una copia de seguridad de las bases de datos copiándolas de / var / lib / mysql y luego volviéndolas a copiar porque se corrompen, debe usar mysqldump en su lugar.

Entonces, si va a una de las carpetas de la base de datos en / var / lib / mysql, es decir / var / lib / mysql / myDB / y se mete con algunos de los archivos que deberían hacerlo :-)

Por lo tanto, recomendaría copiar uno de los archivos, editar un poco con un editor hexadecimal y volver a copiarlo.

Kyle Brandt
fuente
8
cat DB1.myd /dev/random > DB2.myd
Matt Simmons
fuente
¡Me gusta este!
Kyle Brandt
1
¿No seguirá sacando datos de / dev / random hasta que se llene mi disco duro? : P
Rory
2
Oye, dijiste corrupto, ¿verdad? ;-)
Matt Simmons
Rory, Ya, pero solo presionó Ctrl-C en algún momento
Kyle Brandt
Rory, o el uso de cabeza / dev / urandom, en un archivo y luego los gatos
Kyle Brandt
3

Puede usar una herramienta de fuzzing como zzuf para fuzzear un archivo de base de datos preexistente, por ejemplo

zzuf < good.myd > fuzzed.myd
Gerald Peines
fuente
3

Esto debería hacerlo:

cat /dev/urandom > yourdb.myd
Berkus Aurelius
fuente
Eso continuará hasta que mi disco duro se llene.
Rory
2

Sugeriría que una forma más realista de simular fallas sería sacar la alfombra de debajo de los pies de MySQL mientras realiza una actualización intensiva. Emitir SIGKILL al mysqldproceso debería ser suficiente. Lo más probable es que cuando reinicie MySQL las tablas en cuestión se marcarán como bloqueadas.

Alternativamente, sugeriría aplicar las sugerencias de otras personas, pero al .MYIarchivo indec en lugar del archivo de datos.

Dan Carley
fuente
2

ejemplo:

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
quanta
fuente
1

quizás una ejecución de comando que haga algo como lo siguiente:

echo "aaa" > file.myd
Mark L
fuente