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:
Insert into ArchiveDB.table select * from old_tbl where datetime <= Archivedate
DELETE FROM old_tbl WHERE datetime <= Archivedate
Je veux implémenter cela avec les conditions suivantes:
... Ou si vous connaissez une bonne pratique, faites le moi savoir.
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
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
).