Comment puis-je forcer une table MySQL à être corrompue?


17

J'ai écrit un simple plugin Nagios qui appelle mysqlcheck (qui vérifie les tables corrompues) et donnera un avertissement si certains sont corrompus.

Cependant, aucune de mes tables n'est corrompue maintenant. Je ne suis donc pas sûr à 100% que mon plugin fonctionne bien. J'ai un serveur de développement qui n'est pas misson critique. Comment puis-je forcer une (ou n'importe laquelle) des tables à être corrompue afin de pouvoir tester mon alerte nagios?

Pour mémoire, le serveur est Ubuntu Dapper et le mysql est la version 5.0


intéressant .......
Sander Versluys

3
En supposant que ce sont des tables MyISAM, j'imagine que vous pourriez simplement ouvrir une fenêtre. Une légère brise devrait suffire à faire planter, basculer et prendre feu ces tables sans ACID;)
David

Réponses:


1

Généralement, vous ne pouvez pas sauvegarder les bases de données en les copiant à partir de / var / lib / mysql puis en les copiant à nouveau car elles sont corrompues, vous devez utiliser mysqldump à la place.

Donc, si vous allez dans l'un des dossiers de la base de données dans / var / lib / mysql, c'est-à-dire / var / lib / mysql / myDB / et que vous jouez avec certains des fichiers qui devraient le faire :-)

Je recommanderais donc de copier l'un des fichiers, de le modifier un peu avec un éditeur hexadécimal et de le recopier.


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

J'aime celui la!
Kyle Brandt

1
Cela ne continuera-t-il pas à extraire des données de / dev / random jusqu'à ce que mon disque dur se remplisse? : P
Rory

2
Hé, tu as dit corrompu, non? ;-)
Matt Simmons

Rory, Ya, mais vient de frapper Ctrl-C à un moment donné
Kyle Brandt

Rory, ou utilisez head / dev / urandom, dans un fichier, puis cat ceux-ci
Kyle Brandt

3

Vous pouvez utiliser un outil de fuzzing comme zzuf pour fuzzer un fichier de base de données préexistant, par exemple

zzuf < good.myd > fuzzed.myd

3

Cela devrait le faire:

cat /dev/urandom > yourdb.myd

Cela continuera jusqu'à ce que mon disque dur se remplisse.
Rory

2

Je suggérerais qu'une façon plus réaliste de simuler la faute serait de retirer le tapis sous les pieds de MySQL pendant qu'il effectue une mise à jour intensive. L'émission de SIGKILL au mysqldprocessus devrait être suffisante. Il y a de fortes chances que lorsque vous redémarrez MySQL, les tables en question seront marquées comme plantées.

Sinon, je suggérerais d'appliquer les suggestions d'autres personnes mais au .MYIfichier indec plutôt qu'au fichier de données.


2

exemple:

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

peut-être une exécution de commande qui fait quelque chose comme ceci:

echo "aaa" > file.myd
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.