Une histoire sur la suppression physique de 300 millions d'enregistrements dans MySQL

Introduction

Bonjour. Je suis ningenMe, développeur web.

Comme indiqué dans le titre, mon histoire est celle de la suppression physique de 300 millions d'enregistrements dans MySQL.

Je me suis intéressé à ce sujet, alors j'ai décidé de rédiger une note (mode d'emploi).

Début - Alerte

Dans le lot le serveur, que j'utilise et maintiens, il existe un processus régulier qui collecte les données du mois dernier dans MySQL une fois par jour.

En général, ce processus se termine en environ 1 heure, mais cette fois, il n'a pas abouti pendant 7 ou 8 heures, et l'alerte a continué à apparaßtre...

Recherche de la cause

J'ai essayé de redémarrer le processus, de vérifier les logs, mais je n'ai rien vu d'inquiétant.
La requĂȘte Ă©tait correctement indexĂ©e. Mais en rĂ©flĂ©chissant Ă  ce qui pourrait clocher, j'ai rĂ©alisĂ© que la taille de la base de donnĂ©es Ă©tait assez grande.

hoge_table | 350'000'000 |

350 millions d'enregistrements. Il semble que l'indexation fonctionnait correctement, juste trĂšs lentement.

La collecte de données pour le mois requiÚrait environ 12 000 000 d'enregistrements. Il semble que la commande select ait pris beaucoup de temps, et la transaction n'a pas été exécutée pendant longtemps.

DB

En fait, il s'agit d'une table qui augmente d'environ 400 000 enregistrements chaque jour. La base de données aurait dû collecter uniquement les données du mois dernier, donc on s'attendait à ce qu'elle puisse gérer ce volume, mais malheureusement, l'opération de rotation n'était pas activée.

Cette base de données n'a pas été développée par moi. Je l'ai reçue d'un autre développeur, donc il reste un sentiment de dette technique.

Il est arrivĂ© un moment oĂč le volume des donnĂ©es insĂ©rĂ©es quotidiennement est devenu important et a finalement atteint la limite. On suppose que lorsqu'on travaille avec un grand volume de donnĂ©es, il faudrait les diviser, mais cela n'a pas Ă©tĂ© fait.

Et c'est lĂ  que j'interviens.

Correction

Il Ă©tait plus judicieux de rĂ©duire la base de donnĂ©es elle-mĂȘme et de diminuer le temps de traitement plutĂŽt que de changer la logique.

La situation devrait changer considérablement si je supprime 300 millions d'enregistrements, donc j'ai décidé de le faire... Ah, je pensais que cela fonctionnerait certainement.

Action 1

AprĂšs avoir prĂ©parĂ© une sauvegarde fiable, j'ai enfin commencĂ© Ă  envoyer des requĂȘtes.

「Envoi de la requĂȘte」

DELETE FROM hoge_table WHERE create_time <= 'YYYY-MM-DD HH:MM:SS';

「
」

「
」

“Hmm
 Pas de rĂ©ponse. Peut-ĂȘtre que le processus prend beaucoup de temps ?” — pensais-je, mais par prĂ©caution, j'ai jetĂ© un Ɠil sur Grafana et vu que la charge du disque augmentait trĂšs rapidement.
«C'est risqué» — pensais-je encore une fois et j'ai immĂ©diatement arrĂȘtĂ© la requĂȘte.

Action 2

AprÚs avoir analysé le tout, j'ai réalisé que le volume de données était trop important pour tout supprimer d'un coup.

J'ai décidé d'écrire un script qui pourrait supprimer environ 1 000 000 d'enregistrements et je l'ai lancé.

「je rĂ©alise le script」

«Ça va fonctionner cette fois», pensais-je.

Action 3

La deuxiÚme méthode a fonctionné, mais s'est avérée trÚs laborieuse.
Pour tout faire proprement, sans stress, cela prendrait environ deux semaines. Cependant, ce scénario ne correspondait pas aux exigences de service, donc j'ai dû abandonner.

Donc, voici ce que j'ai décidé de faire :

Nous copions la table et la renommons.

À partir de l'Ă©tape prĂ©cĂ©dente, j'ai compris que la suppression d'un si grand volume de donnĂ©es crĂ©e une charge tout aussi importante. Par consĂ©quent, j'ai dĂ©cidĂ© de crĂ©er une nouvelle table Ă  partir de zĂ©ro avec insert et d'y dĂ©placer les donnĂ©es que je comptais supprimer.

| hoge_table     | 350'000'000|
| tmp_hoge_table |  50'000'000|

Si je crĂ©e une nouvelle table de la mĂȘme taille que celle indiquĂ©e ci-dessus, la vitesse de traitement des donnĂ©es devrait Ă©galement ĂȘtre 1/7 plus rapide.

AprÚs avoir créé la table et l'avoir renommée, j'ai commencé à l'utiliser comme table maßtresse. Maintenant, si je supprime la table avec 300 millions d'enregistrements, tout devrait bien se passer.
J'ai appris que truncate ou drop crée moins de charge que delete, et j'ai décidé d'utiliser cette méthode.

Exécution

「Envoi de la requĂȘte」

INSERT INTO tmp_hoge_table SELECT FROM hoge_table create_time > 'YYYY-MM-DD HH:MM:SS';

「
」
「
」
「euhâ€ŠïŒŸă€

Action 4

Je pensais que l'idĂ©e prĂ©cĂ©dente fonctionnerait, mais aprĂšs avoir envoyĂ© la requĂȘte d'insertion, un message d'erreur multiple est apparu. MySQL ne fait pas de cadeaux.

J'étais tellement fatigué que j'ai commencé à penser que je ne voulais plus m'en occuper.

J'ai rĂ©flĂ©chi un moment et pensĂ© que peut-ĂȘtre pour une seule fois, il y avait trop de requĂȘtes d'insertion

J'ai essayĂ© d'envoyer une requĂȘte d'insertion pour le volume de donnĂ©es que la base doit traiter en un jour. Ça a fonctionnĂ© !

Eh bien, aprĂšs cela, nous continuons Ă  envoyer des requĂȘtes pour le mĂȘme volume de donnĂ©es. Comme il faut supprimer le volume mensuel de donnĂ©es, nous rĂ©pĂ©tons cette opĂ©ration environ 35 fois.

Renommage de la table

Ici, la chance était de mon cÎté : tout s'est bien passé.

Les alertes ont disparu.

La vitesse de traitement par lots a augmenté.

Auparavant, ce processus prenait environ une heure, maintenant il ne prend plus qu'environ 2 minutes.

AprÚs avoir vérifié que tous les problÚmes étaient résolus, j'ai supprimé 300 millions d'enregistrements. J'ai effacé la table et je me suis senti renaßtre.

Résumé

J'ai compris que lors du traitement par lots, le traitement des rotations avait été négligé, et c'était là le principal problÚme. Une telle erreur d'architecture conduit à un gaspillage de temps.

Vous demandez-vous quelle sera la charge lors de la rĂ©plication des donnĂ©es en supprimant des enregistrements de la base ? Évitons de surcharger MySQL.

Ceux qui ont une bonne maßtrise des bases de données ne rencontreront certainement pas ce problÚme. J'espÚre que cet article a été utile au reste.

Merci pour votre lecture !

Nous serions trÚs heureux que vous nous disiez si cet article vous a plu, si la traduction est claire et si elle vous a été utile ?

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster