Προς το περιεχόμενο

Συντήρηση βάσης MySQL, τι να διαλέξω;


nikolaos_

Προτεινόμενες αναρτήσεις

Έχω μια ΒΔ γραμμένη σε MySQL 5.5 που συλλέγει μέσα σε ένα μήνα περίπου 15 εκατομμύρια μηνύματα.

 

Από αυτά ουσιαστικά ένα 10-12% είναι αξιοποιήσιμο πέρα από το μήνα, ενώ τα υπόλοιπα μπορούν να διαγραφούν. Στην πραγματικότητα, μερικά από αυτά μπορούν να αρχίσουν να διαγράφονται ήδη μόλις συμπληρώσουν 24-48 ώρες "ζωής" μέσα στην ΒΔ. Ωστόσο ένα άλλο πολύ μικρό ποσοστό (1-5%) θα παραμείνει για 1-2 χρόνια.

 

Τα κριτήρια για το ποια μηνύματα θα παραμένουν και ποια θα διαγράφονται υπάρχουν, αλλά δεν είναι ακριβώς σταθερά, μπορεί να αλλάξουν μέσα σε ένα εξάμηνο και ουσιαστικά η απόφαση, για το ποια θα είναι τα μεν ή τα δέ, γίνεται τελευταία στιγμή. Δηλαδή κάθε έξι μήνες περίπου θα αναπροσαρμόζουμε το σκριπτάκι.

 

Η MySQL πατάει πάνω σε Linux. Η πρώτη σκέψη είναι να κάνω ένα ή πολλά bash scripts που να συνδέονται στη MySQL και θα κάνουν τις προβλεπόμενες διαγραφές, και θα τα βάλω να εκτελούνται με cron (σε crontab user root ή user mysql όμως?) μέχρι να περάσει το εξάμηνο, οπότε και θα αλλάξω τα scripts.

 

Μια δεύτερη σκέψη είναι να φτιάξω μια δεύτερη ΒΔ που να αποθηκεύει τα κριτήρια για τις διαγραφές από την πρώτη ΒΔ και να φτιάξω μερικά SQL triggers τα οποία να εκτελούνται σε περιοδικά χρονικά διαστήματα, όπως θα έκανα και με το cron δηλαδή. Ένα trigger θα κάνει query στην δεύτερη "μικρή" βάση για τα κριτήρια και μετά "DELETE FROM (Πίνακας_Μηνυμάτων_πρώτης_ΒΔ) WHERE (κριτήρια=TRUE);"

 

Το δεύτερο δεν το έχω δουλέψει. Μου έγινε πρόταση να χρησιμοποιήσω τα triggers, ώστε να είναι μέσα στον ίδιο server της ΒΔ, κι εγώ την πήγα ένα βήμα μπροστά, να φτιάξω δεύτερη "μικρή" ΒΔ για να μπορώ να παρέχω σε έναν ανειδίκευτο χρήστη μέσω μιας φόρμας τη δυνατότητα να κάνει μόνος του την περιγραφή των κριτηρίων για τα μηνύματα που θα διαγράφονται. Υπάρχει και αυτού του είδους ο χρήστης.

 

Από την άλλη μεριά, σκέφτομαι "δε βαριέσαι, μια φορά στο εξάμηνο να παιδεύομαι με cron δεν είναι βάσανο".

 

Πώς συγκρίνετε την μια και την άλλη σκέψη; Εγώ δεν βλέπω καμιά από τις δυο καλύτερη, αλλά θέλω να συγκεντρώσω τα συν και τα πλην κάθε μιας.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλησπέρα,

 

Στην 5.5 έκδοση υπάρχει ο event scheduler.. Μπορείς να βάλεις query σε event να τρέχει περιοδικά..  Δες τα παρακάτω:

 

http://www.infotuts.com/schedule-sql-query-using-phpmyadmin-mysql-events/?PageSpeed=noscript

 

http://dev.mysql.com/doc/refman/5.1/en/events.html

 

 

Άρα τα cron jobs στο λειτουργικό τα αποφεύγεις.

 

Τώρα αν θέλεις να κάνεις πιο "σοφιστικέ" τη διαγραφή δεν χρειάζεται άλλη βάση μικρή..Φτιάξε ένα πίνακα στην ίδια βάση βάζοντας τα κριτήρια ανά ημερομηνία διαγραφής και το query που θα τρέχει στο event θα κάνει join με τον πίνακα αυτόν για να πάρει τα κριτήρια..

Γιατί θα πρέπει να συντηρείς δύο βάσεις ?

.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κατ' αρχάς, αν δεν έχεις σοβαρό λόγο να βάλεις τον trigger σε διαφορετική βάση, δεν βλέπω γιατί να μην είναι στην ίδια.

 

Δεύτερον, ενώ ο cron είναι λύση εξαρτώμενη μόνο από το χρόνο, ο trigger είναι γενικότερος και πιο ευέλικτος. Για παράδειγμα, μπορεί να αποφασίσεις ότι δεν είναι προτιμώτερο να τρέχει το σκριπτάκι σου σε τακτά χρονικά διαστήματα, αλλά μετά από κάποιο event (το insert στον εν λόγω πίνακα είναι το πρώτο που μου έρχεται κατά νου).

 

Τρίτον, ενώ ο cron θα τρέχει κάτι "εξωτερικό" της εφαρμογής, ο trigger είναι μία τελείως εσωτερική διαδικασία, και μάλιστα όσο πιο βαθιά πάει: στη ΒΔ! Κατά συνέπεια, θα λειτουργήσει ακόμα κι αν πχ κάνεις insert από κάποιο άλλο interface (πχ phpmyadmin) για κάποιο λόγο. Με άλλα λόγια, κρατάς τη βάση σου αυτόνομη και αυτο-συντήρητη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Να 'σαι καλά. Σε πρώτη φάση θα διαβάσω τα links που δίνεις.

 

Το event είναι κάτι που ενεργοποιείται κι απ' έξω από τη MySQL/ΒΔ, ή μόνο η ΒΔ μπορεί να κάνει throw event;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Να 'σαι καλά. Σε πρώτη φάση θα διαβάσω τα links που δίνεις.

 

Το event είναι κάτι που ενεργοποιείται κι απ' έξω από τη MySQL/ΒΔ, ή μόνο η ΒΔ μπορεί να κάνει throw event;

 

Γιατί πρέπει να το καλέσεις απεξω? Δεν ήθελες στη βάση να τρέξεις κάτι για συντήρηση?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορεί να χρειαστεί να γίνει κάτι έκτακτο, οπότε κάπως να ζητήσω από τη ΒΔ να ενεργοποιήσει τη λειτουργία. Τεσπα θα το ψάξω.

 

Sent from my iPhone using Insomnia

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...

Χρησιμοποιούμε  cookies για να απολαμβάνεις το insomnia προσωποποιημένο στις ανάγκες σου αλλά και για την παροχή στοιχείων επισκεψιμότητας για να βελτιώσουμε την ποιότητα των υπηρεσιών μας