web-dev-qa-db-fra.com

Meilleure pratique pour archiver les anciennes données dans MySQL

J'utilise une base de données MySQL pour stocker les journaux de plusieurs serveurs. La croissance de la base de données est en moyenne de 50 Go par jour. Sa taille totale est désormais de 1,7 To.

Il a ID et datetime colonnes.

Je souhaite déplacer des données de plus d'une semaine vers une autre base de données sur le même serveur.

Quelles sont les étapes nécessaires pour cela?

À partir de maintenant, je fais ceci:

  1. Créez la base de données d'archives et la table.
  2. Insert into ArchiveDB.table select * from old_tbl where datetime <= Archivedate
  3. Alors DELETE FROM old_tbl WHERE datetime <= Archivedate

Je veux implémenter cela avec les conditions suivantes:

  • Insérez et supprimez via des lots.
  • Récupérez l'espace après la suppression de l'ancienne base de données.
  • Mettez à jour les statistiques sans temps d'arrêt.

... Ou si vous connaissez une bonne pratique, faites le moi savoir.

6
Bhuvanesh

Avec InnoDB et PARTITIONs, vous pouvez configurer quotidiennement PARTITION BY RANGE(TO_DAY(...)) et utiliser des "espaces de table transportables" pour dissocier un jour de la table et le déplacer séparément. Ce sera beaucoup plus rapide que les requêtes qu'il faudrait pour faire le INSERT...SELECT et DELETE. Une fois détachée, la partition (maintenant une table à part entière) peut être déplacée vers une autre base de données ou serveur sans impact sur l'ingestion de plus de données.

Un inconvénient: l'encombrement du disque d'InnoDB est beaucoup plus que celui d'Archive.

Quels types de requêtes appliquez-vous aux journaux?

Blogs: partitionnement et segmentation de longues suppressions

6
Rick James

Je suggère d'utiliser une combinaison de pt-archiver de Percona (utilisé pour archiver les lignes d'une table MySQL dans une autre table ou un fichier) et pt-online-schema-change de Percona ( peut être exécuté "en ligne" avec un ALTER neutre pour récupérer l'espace disque, en supposant que vous exécutez avec innodb_file_per_table=ON).

3
Riedsio