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

Rory
la source
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.

Kyle Brandt
la source
8
cat DB1.myd /dev/random > DB2.myd
Matt Simmons
la source
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
Gerald Combs
la source
3

Cela devrait le faire:

cat /dev/urandom > yourdb.myd
Berkus Aurelius
la source
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.

Dan Carley
la source
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
quanta
la source
1

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

echo "aaa" > file.myd
Mark L
la source