¿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


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.


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

¡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


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.


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

1

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

echo "aaa" > file.myd
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.