Tables MySQL corrompues

WRInaute impliqué
Salut,

J'ai un petit souci sur mon serveur : j'ai des tables qui se corromptent presque immédiatement après les avoir réparée... Avez vous une idée de ce qui peut se passer? Qu'est ce qui peut provoquer ce genre de phénomène?

Merci
 
WRInaute accro
des addslashes oubliés ? et donc des caractères foireux dans les champs peut être ? enfin je sais pas si ca peut corrompre ainsi mais c'est à vérifier en premier peut etre ?
 
WRInaute impliqué
Nan, en fait ca fait 10 mois que ces tables tournent sans pb, et les champs sont de type int (11)...
 
WRInaute impliqué
PHPMyAdmin et maintenant j'ai fait un script php avec mysql_query("repair table sessions "); par exemple
 
WRInaute passionné
Es-tu sûr que ta table est réellement corrompu ?
Normalement les tables sessions passent leur temps à enregistrer/supprimer ce qui fait des pertes.

Tu peux tenter de passer ta table en innoDB, sinon tu peux essayer cette méthode de réparation:
-https://admin-serv.net/blog/622/table-phpbb_posts-is-marked-as-crashed-and-last-automatic-repair-failed/
Mais je pense que c'est un "faux" problème.
 
WRInaute impliqué
Voici le genre de logs dans le syslog :

Code:
May 29 13:34:00 de11 mysqld[18079]: 110529 13:34:00 [ERROR] /usr/sbin/mysqld: Table './monsite/sessions' is marked as crashed and should be repaired

Sous PHPMyadmin j'ai la table marqué en "utilisé"

Je ne pense pas qu'il y ait un problème de réparation, car juste après avoir été réparée la table est ok et refonctionne... :(
 
WRInaute passionné
Recif a dit:
Voici le genre de logs dans le syslog :

Code:
May 29 13:34:00 de11 mysqld[18079]: 110529 13:34:00 [ERROR] /usr/sbin/mysqld: Table './monsite/sessions' is marked as crashed and should be repaired

Sous PHPMyadmin j'ai la table marqué en "utilisé"

Je ne pense pas qu'il y ait un problème de réparation, car juste après avoir été réparée la table est ok et refonctionne... :(
Tout refonctionne mais pas longtemps donc pour moi il y a un problème :p

Tu peux tenter de passer la table en innoDB, ça pourrait peut-être fixé le problème, mais il faudrait trouver la cause de la corruption de cette table.
 
WRInaute passionné
Et la commande REPAIR tente une réparation sur une base de données activée.
myisamchk fait une vraie réparation sur les fichiers en eux mêmes.
 
WRInaute impliqué
Donc tu penses que, même après un repair et que la table se comporte bien (jusqu'au prochain crash...) elle n'est pas efficace?...
 
WRInaute passionné
Recif a dit:
Donc tu penses que, même après un repair et que la table se comporte bien (jusqu'au prochain crash...) elle n'est pas efficace?...
Je pense qu'il y a un problème.
Ton automatic repair par PHPMyAdmin ne fonctionne qu'un certain temps. Tu peux tenter en SSH, ça fera la même chose mais peut-être en mieux.
 
WRInaute impliqué
Moi je pense que ça vient d'autre chose, là on essaye de réparer mais je pense qu'il faudrait que je trouve d'où vient le problème. Toutes les tables de tous les sites contenant une table "sessions" ont cette maladie...
 
WRInaute impliqué
Je ne pense pas que ce soit la solution. Il y a plus de 400 bases. Et le problème apparait sur une bonnde 20aine... Donc ça ne doit pas être un problème sur une base en particulier...
 
WRInaute impliqué
Petite info supplémentaire, j'ai attendu qu'une table soit sorrompue pour essayer la méthode:

Code:
 mysqlcheck mabase --auto-repair

Mais il passe sur la ptable notée corrompue et ne la voit pas corrompue... Il la voit "ok"... Bizarre...
 
WRInaute impliqué
Autre info : les processus apache sont souvent plus sollicités que MySQL quand je fais un "top". Hors d'habitude c'est toujours MySQL qui est en haut...
 
WRInaute impliqué
Voici la réponse que j'ai de l'hébergeur :

Aucun problème de disque a été remonté dans les fichiers de log du serveur ce week-end.
Par contre pour la journée de Dimanche par exemple virtuozzo a remonté beaucoup de kill de processus pour dépassement de mémoire. Dans ces logs il y a par exemple mysql et apache .
Il est possible que si virtuozzo est killé mysql sur un traitement SQL , certaine table ai été corrompu
Le graphe mémoire :

virtuozzomemoryweek.png
 
WRInaute impliqué
Une autre réponse de l'hébergeur :

voici les log des kill de mysql pour dépassement mémoire

May 29 04:08:17 vz10 kernel: OOM killed process mysqld (pid=31139, ve=101) exited, free=271798 gen=5340.
May 29 04:24:11 vz10 kernel: OOM killed process mysqld (pid=16942, ve=101) exited, free=200048 gen=5341.
May 29 16:13:12 vz10 kernel: OOM killed process mysqld (pid=28688, ve=101) exited, free=427927 gen=5355.
May 29 17:12:42 vz10 kernel: OOM killed process mysqld (pid=2166, ve=101) exited, free=392178 gen=5356.
May 29 18:01:14 vz10 kernel: OOM killed process mysqld (pid=21435, ve=101) exited, free=339665 gen=5357.
May 29 18:32:15 vz10 kernel: OOM killed process mysqld (pid=10963, ve=101) exited, free=280987 gen=5358.


Il n'est pas normal d'avoir plus de 10 connexions pour une IP sur votre serveur. Une visite d'un site par un internaute c'est une connexion.
Sachant que depuis dimanche, où nous sommes intervenu sur votre serveur, vous avez eut à des moments plus de 100 connexions sur des IP ( dont certaines de chine )

Comment puis-je détecter et identifier les ips qui attaquent?...
 
WRInaute impliqué
et le résultat de la commande

Code:
netstat -tapun | grep :80 | awk '{ print $5}' | cut -d : -f 1 | sort | uniq -c | sort -g | tail -n 100

44666618.jpg
 
WRInaute passionné
Si MySQL te fait un out of memory (OOM), il suffit de réduire sa charge mémoire. Je ne pense pas que ça réellement de là pour l'histoire de corruption.
Pour l'histoire de trop de connexion, voir ton autre topic, mais je ne pense pas que la source du problème soit là: si tu as 10 images sur une page et que tu n'as pas de keepalive, j'ouvrirais 10 connexions pour les télécharger.
 
WRInaute impliqué
J'ai banni la totalité de la Chine et de la Russie et mes graphes semblent redevenir normaux, et plus de corruption de table ...
 
WRInaute passionné
Ouais enfin MySQL qui te fait des OOM suite à un (d?)Dos ça reste pas génial.
A noter qu'Apache a un mod nommé evasive qui te permet de ne pas faire de "grossièreté" (bannir un pays c'est mal car un résident français peut vouloir surfer de là bas).
(grossièreté: à ne pas prendre mal, je banni moi même tout AFRINIC de la plupart de mes serveurs (et je suis conscients que c'est mal)).
 
WRInaute impliqué
Oui, je suis à 2 doigts de le faire aussi en ce qui conerne afrinic!

Pour ce qui est de OOM et MySQL, y a t'il une config particulière à mettre en place?
 
WRInaute passionné
Recif a dit:
Oui, je suis à 2 doigts de le faire aussi en ce qui conerne afrinic!

Pour ce qui est de OOM et MySQL, y a t'il une config particulière à mettre en place?
Il faudrait regarder en fonction de la RAM dont tu disposes et de la taille de tes bases. C'est pas particulier, c'est "ajusté". Après si tu as 1Go de RAM et 50Go de data SQL, là tu auras souvent ça :p
 
WRInaute accro
oui, mais en fait c'est la taille des bases appelées qu'il faut voir : les index bien structurés des tables ont, dans ce cas une grande importance
 
WRInaute impliqué
J'ai de nouveau les processus apache qui s'emballent... Comment puis-je voir qui ou quel site consomme ces ressources?

sansre1de.jpg
 
WRInaute passionné
Tu as 3480 bases et autant de sites ?
Ca commence à faire très gros pour n'importe quel serveur.
Je trouve la consommation de ton Apache plutôt importante mais bon, si tu as plus de 3000 sites et que certains sont bien visités c'est "normal".
Tu pourrais faire un strace sur l'un des process Apache pour voir ce qu'il consomme (et ainsi avoir son utilisation) mais à mon avis tu arrives au bout de ce qu'il peut tenir.
 
WRInaute accro
Ton MaxClients est très faible (10)
Par contre ton MaxKeepAliveRequests est trop grand (1000)
 
WRInaute impliqué
Julia41 a dit:
Tu as 3480 bases et autant de sites ?
Ca commence à faire très gros pour n'importe quel serveur.
Je trouve la consommation de ton Apache plutôt importante mais bon, si tu as plus de 3000 sites et que certains sont bien visités c'est "normal".
Tu pourrais faire un strace sur l'un des process Apache pour voir ce qu'il consomme (et ainsi avoir son utilisation) mais à mon avis tu arrives au bout de ce qu'il peut tenir.

Non, j'ai une 40aine de sites dessus. Plusieurs d'entre eux nécessitent parfois plus de 1000 bases de données, mais les principaux non.

Comment utiliser "strace"?...
 
WRInaute impliqué
Je crois que j'ai trouvé pour strace...

strace -p 5600

Code:
fstat(98, {st_mode=S_IFREG|0666, st_size=2015, ...}) = 0
lseek(98, 0, SEEK_CUR)                  = 0
read(98, "<?php if (!defined(\'IN_PHPBB\')) "..., 8192) = 2015
read(98, "", 8192)                      = 0
read(98, "", 8192)                      = 0
close(98)                               = 0
rt_sigaction(SIGPIPE, {SIG_IGN}, {SIG_IGN}, 8) = 0
poll([{fd=97, events=POLLIN|POLLPRI}], 1, 0) = 0
setsockopt(97, SOL_SOCKET, SO_SNDTIMEO, "\2003\341\1\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
write(97, "\1\0\0\0\1", 5)              = 5
shutdown(97, 2 /* send and receive */)  = 0
close(97)                               = 0
rt_sigaction(SIGPIPE, {SIG_IGN}, {SIG_IGN}, 8) = 0
writev(96, [{"HTTP/1.1 200 OK\r\nDate: Tue, 31 M"..., 276}, {"<!DOCTYPE html PUBLIC \"-//W3C//D"..., 13509}], 2) = 11680
poll([{fd=96, events=POLLOUT, revents=POLLOUT}], 1, 30000) = 1
writev(96, [{"m.\r\n\tThis not only gives respect"..., 2105}], 1) = 2105
chdir("/")                              = 0
umask(022)                              = 022
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
write(56, "109.230.251.74 - - [31/May/2011:"..., 205) = 205
times({tms_utime=415, tms_stime=42, tms_cutime=0, tms_cstime=0}) = 76815157
shutdown(96, 1 /* send */)              = 0
poll([{fd=96, events=POLLIN, revents=POLLIN|POLLHUP}], 1, 2000) = 1
read(96, "", 512)                       = 0
close(96)                               = 0
read(4, 0x7fffd7005c77, 1)              = -1 EAGAIN (Resource temporarily unavailable)
accept(3, {sa_family=AF_INET, sin_port=htons(42667), sin_addr=inet_addr("127.0.0.1")}, [17179869200]) = 96
getsockname(96, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("127.0.0.1")}, [17179869200]) = 0
fcntl(96, F_GETFL)                      = 0x2 (flags O_RDWR)
fcntl(96, F_SETFL, O_RDWR|O_NONBLOCK)   = 0
read(96, "GET / HTTP/1.0\r\nUser-Agent: Apac"..., 8000) = 66
lseek(94, 0, SEEK_SET)                  = 0
read(94, "\1\0\0\2\0\0\3\0\0\4\0\0j\232)k\232)\5\0\0\6\0\0G\256\10"..., 4096) = 4096
lseek(94, 4096, SEEK_SET)               = 4096
lseek(94, 4096, SEEK_SET)               = 4096
lseek(94, 3411968, SEEK_SET)            = 3411968
read(94, "G\tXBX\255\10Y\255\10b\255\10\273iEZ\255\10[\255\10_\255"..., 4096) = 4096
lseek(94, 14946304, SEEK_SET)           = 14946304
read(94, "\2&\266\2&\267\2&\256\2&/\205A\262\2&\263\2&\257\2&\260"..., 4096) = 4096
lseek(94, 15753216, SEEK_SET)           = 15753216
read(94, "\311f\4qSK\2\20(\3\20(\3PK\4\20(\7\20(\3PK\3PK\5\20(\3"..., 4096) = 4096
lseek(94, 15912960, SEEK_SET)           = 15912960
read(94, "\2x(\3x(\4x(\5x(\204\224J\316\0\4uvKr\1\4\204\224JP;j\6"..., 4096) = 4096
lseek(94, 16121856, SEEK_SET)           = 16121856
read(94, "\232\"(\365RH\r\5\4\31!J\372\5\4\312TKWyL\365RH\6\0)\7"..., 4096) = 4096
stat("/home/www/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/.htaccess", O_RDONLY)            = -1 ENOENT (No such file or directory)
open("/home/.htaccess", O_RDONLY)       = -1 ENOENT (No such file or directory)
open("/home/www/.htaccess", O_RDONLY)   = -1 ENOENT (No such file or directory)
stat("/home/www/index.html", 0x7fffd70058d0) = -1 ENOENT (No such file or directory)
lstat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www/index.html", 0x7fffd70058d0) = -1 ENOENT (No such file or directory)
stat("/home/www/index.cgi", 0x7fffd70058d0) = -1 ENOENT (No such file or directory)
lstat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www/index.cgi", 0x7fffd70058d0) = -1 ENOENT (No such file or directory)
stat("/home/www/index.pl", 0x7fffd70058d0) = -1 ENOENT (No such file or directory)
lstat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www/index.pl", 0x7fffd70058d0) = -1 ENOENT (No such file or directory)
stat("/home/www/index.php", 0x7fffd70058d0) = -1 ENOENT (No such file or directory)
lstat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www/index.php", 0x7fffd70058d0) = -1 ENOENT (No such file or directory)
stat("/home/www/index.xhtml", 0x7fffd70058d0) = -1 ENOENT (No such file or directory)
lstat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www/index.xhtml", 0x7fffd70058d0) = -1 ENOENT (No such file or directory)
open("/home/www/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|0x80000) = 97
fstat(97, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/www/HEADER.html", 0x7fffd7003610) = -1 ENOENT (No such file or directory)
lstat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www/HEADER.html", 0x7fffd7003610) = -1 ENOENT (No such file or directory)
getdents(97, /* 2 entries */, 4096)     = 48
lstat("/home/www/.", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www/..", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
getdents(97, /* 0 entries */, 4096)     = 0
close(97)                               = 0
stat("/home/www/README.html", 0x7fffd70035e0) = -1 ENOENT (No such file or directory)
lstat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat("/home/www/README.html", 0x7fffd70035e0) = -1 ENOENT (No such file or directory)
writev(96, [{"HTTP/1.1 200 OK\r\nDate: Tue, 31 M"..., 190}, {"<!DOCTYPE HTML PUBLIC \"-//W3C//D"..., 455}], 2) = 645
times({tms_utime=416, tms_stime=42, tms_cutime=0, tms_cstime=0}) = 76815538
shutdown(96, 1 /* send */)              = -1 ENOTCONN (Transport endpoint is not connected)
close(96)                               = 0
read(4, "!", 1)                         = 1
close(95)                               = 0
close(94)                               = 0
munmap(0x2ae4c5e39000, 4096)            = 0
close(5)                                = 0
close(4)                                = 0
exit_group(0)                           = ?
Process 5620 detached

J'y comprends pas grand chose, mais au passage "/home/www" n'existe pas sur mon serveur...
 
WRInaute passionné
Recif a dit:
YoyoS a dit:
Ton MaxClients est très faible (10)
Par contre ton MaxKeepAliveRequests est trop grand (1000)

Quelles seraient les valeurs correctes?...
MaxClients tu peux le monter
MaxKeepAliveRequests ça dépends du nombre de visiteurs en même temps que tu as mais 100 est normalement bon.
 
WRInaute passionné
Si ton /home/www/ n'existe pas, pourquoi tu as :
DocumentRoot "/home/www"

Dans ton apache.conf ?
 
WRInaute passionné
Tu peux le créer et mettre un index.html vide dedans (ou plutôt mets le en "dévidoir" ailleurs) ça évitera des scans incéssants.
 
WRInaute impliqué
Comment faire un script .sh qui détecte une certaine valeur du load server et redémarre apache? J'essaye de trouver une solution paliative en attendant de traiter la source du problème...
Merci
 
WRInaute passionné
Sur :
12:36:38 up 41 days, 14:54, 2 users, load average: 0.28, 0.20, 0.16
Si tu veux récupérer le 1.28:
uptime | cut -d "," -f 5| cut -d " " -f 2
Si tu veux récupérer le "1":
uptime | cut -d "," -f 5| cut -d " " -f 2| cut -d "." -f 1

Après il te suffit de faire un petit IF > 2 alors on restart et tu mets ça en cron.
Je te conseillerais toutefois de te baser sur le serveur status plutôt que sur le load complet car ça peut venir d'autre chose un load élevé (backup en cours ou autre).
 
WRInaute impliqué
Merci Julia41.

J'ai fais ça :

Code:
#!/bin/bash
 loadavg=`uptime | awk '{print $10}'`
 thisloadavg=`echo $loadavg|awk -F \. '{print $1}'`
 if [ "$thisloadavg" -ge "40" ]; then
 /etc/init.d/apache2 restart
 
else
 echo "";
 fi
 
WRInaute passionné
Ouais enfin si ton Apache fait monter à plus de 40, c'est quand même énorme :p
Attention aussi car ça peut ne pas être lié à ton apache à certains moment.
 
WRInaute impliqué
Ah, 40? Non, ça c'est dans ses bons jours... :D C'est plutôt 110/120 !
Je suis en train de bannir range ip après range ip (Us, Ukraine, Russie, Chine,...) et ça a l'air de lui plaire, il fait de moins en moins de pics... C'est peut être tout de même une attaque finalement...
 
WRInaute impliqué
2 petites questions à propos de ça d'ailleurs:

- Y a t-il un moyen plus rapide que de faire des "iptables -A INPUT -s 217.199.224.0/20 -j DROP"?
- Est ce normal qu'une ip compris dans une fourchette bannie par ce moyen apparaisse lorsque je fais un "netstat"?...
 
WRInaute passionné
Recif a dit:
2 petites questions à propos de ça d'ailleurs:

- Y a t-il un moyen plus rapide que de faire des "iptables -A INPUT -s 217.199.224.0/20 -j DROP"?
Tu peux faire un ptit script
Code:
#!/bin/bash
iptables -A INPUT -s $1 -j DROP
./script.sh 1.1.1.1

[/quote]
- Est ce normal qu'une ip compris dans une fourchette bannie par ce moyen apparaisse lorsque je fais un "netstat"?...[/quote]
Si la connexion n'a pas été coupé (genre apache non redémarré), la connexion reste établie. Oui c'est normal.

As-tu essayé le mod_evasive d'apache ?
 
WRInaute impliqué
Ok, merci.
Je viens d'installer le mod_evasive car ça fait 10 jours que je lutte et je n'arrive pas à m'en sortir... Le serveur s'emballe de plus en plus souvent maintenant, je n'arrive plus à gérer. J'ai mis le mod_evasive avec :

Code:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 3
DOSSiteCount 50
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 300
DOSEmailNotify "admin@majorxtrem.be"
DOSLogDir "/var/log/mod_evasive/"
#DOSSystemCommand "/sbin/iptables -I INPUT -s %s -j DROP"
DOSSystemCommand "/bin/echo %s >> /var/log/mod_evasive/dos_evasive.log && /bin/date >> /var/log/mod_evasive/dos_evasive.log"
DOSWhiteList 127.0.0.1
DOSWhitelist 66.249.65.*
DOSWhitelist 66.249.66.*
DOSWhitelist 66.249.67.*
</IfModule>

J'ai déjà pleins d'adresses bloquées, mais la plupart sont des ips françaises, docn je me demande si il ne me bloque pas de mauvaises ips... :(
 
WRInaute passionné
Tu as des trucs dans:
/var/log/mod_evasive/dos_evasive.log
?

Ton mod evasive est un peu configuré en mod "j'ai copié ce que j'ai vu" :p

Pour ton "centaine de ligne apache" c'est normal c'est que ça tourne.
 
WRInaute impliqué
Bonjour Julia41,

Oui, le dos_evasive était pleins d'ips. Je l'ai retiré mais à force de bannier des ranges d'adresses étrangères (pays de l'est, afrique, US, russier, etc.), l'attaque semble s'être calmée... Je n'ai plus que quelques pointes à 20 de temps à autre, et le graphe mémoire sous munin est redevenu normal... Merci en tout cas pour toutes tes réponses!
 
WRInaute passionné
Justement le evasive "devrait" (bon, je suis pas fan de ce mod mais il fait quand même un peu de ménage) t'éviter d'avoir à bannir des pays entier.
20 reste trop élevé, sans un serveur un peu plus puissant tu n'arriveras pas à encaisser l'attaque facilement je pense.
 
WRInaute impliqué
C'est un bi xeon quadcore... C'est bizarre parce que lorsqu'il est à 20 je ne note aucun ralentissement sur les sites...
 
WRInaute passionné
Recif a dit:
C'est un bi xeon quadcore... C'est bizarre parce que lorsqu'il est à 20 je ne note aucun ralentissement sur les sites...
Le load n'indique pas que le processeur, c'est "l'ensemble" du serveur (et c'est pour ça que linux rocks).

En tout cas je pense que tu aurais du travail à faire, tu dois avoir un point bloquant sur ton serveur/site
 
Discussions similaires
Haut