Για να εγκαταστήσουμε την mysql εκτελούμε
aptitude install mysql-server mysql-client
Αρχικά θα πρέπει να αλλάξουμε τον κωδικό του διαχειριστή της mysql. Εκτελούμε λοιπόν
mysql -u root
Στην προτροπή “mysql>” πληκτρολογούμε:
mysql> set password = password("yournewpassword");
Στην συνέχεια θα συνδεόμαστε με την παράμετρο -p ώστε να μας ζητείται κωδικός
mysql -u root -p
Για να ορίσουμε σωστά τα ελληνικά στην κονσόλα της mysql αλλά και να ορίσουμε utf-8 κωδικοποίηση στις νέες βάσεις που δημιουργούμε μπορούμε να εισάγουμε ένα αρχείο με όνομα greek.cnf στον φάκελο /etc/mysql/conf.d/ με τα παρακάτω περιεχόμενα
[client] default-character-set=utf8
[mysql] default-character-set=utf8
Κατεβάζουμε το MySQLTuner
wget http://mysqltuner.com/mysqltuner.pl
Το κάνουμε εκτελέσιμο
chmod +x mysqltuner.pl
και το εκτελούμε (προσοχή καλό είναι να το κάνουμε μετά από 2-3 μέρες συνεχούς λειτουργίας της mysql)
./mysqltuner.pl
Από τις προτάσεις του
Ακολουθούμε γενικά τις προτάσεις του αρχείου /usr/share/doc/mysql-server-5.0/examples/my-huge.cnf.gz που αφορά σύστημα με 1-2GB μνήμη
key_buffer = 384M max_allowed_packet = 1M table_cache = 512 sort_buffer_size = 2M read_buffer_size = 2M read_rnd_buffer_size = 8M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size = 32M
και στο τέλος του αρχείου
[isamchk] key_buffer = 256M sort_buffer_size = 256M read_buffer = 2M write_buffer = 2M # [myisamchk] key_buffer = 256M sort_buffer_size = 256M read_buffer = 2M write_buffer = 2M
Με την παρακάτω εντολή κάνουμε defrag
mysqlcheck -Aao --auto-repair -u root -p
Ο πιο απλός τρόπος είναι μια εντολή στο crontab του root. Εάν παρακολουθούμε τα e-mail του root θα ενημερωνόμαστε για τυχόν προβλήματα
Εκτελούμε ως root
crontab -e
και εισάγουμε την παρακάτω γραμμή
0 8 * * * cat /var/log/syslog.0 | grep mysqld
Στις 8:00am κάθε μέρα θα ελέγχεται το αρχείο syslog της προηγούμενης μέρας.
Εάν δεν υπάρχει έξοδος από την εντολή δεν θα λαμβάνουμε κανένα μήνυμα
Η ώρα μπορεί να επιλεχθεί βλέπωντας κάθε πότε γίνεται rotate στο σρχείο syslog
ls -al /var/log/syslog* -rw-r----- 1 root adm 245701 2008-12-28 16:20 /var/log/syslog -rw-r----- 1 root adm 3088106 2008-12-28 06:27 /var/log/syslog.0 -rw-r----- 1 root adm 34882 2008-12-27 06:25 /var/log/syslog.1.gz -rw-r----- 1 root adm 23928 2008-12-26 06:25 /var/log/syslog.2.gz -rw-r----- 1 root adm 13909 2008-12-25 06:25 /var/log/syslog.3.gz ..
Αυτό μας δείχνει ότι μπορούμε να επιλέξουμε μια ώρα μετά τις 6:25am
Για να εμφανίσουμε εγγραφές με τα πεδία αριστερά και τις τιμές δεξιά εκτελούμε με την παράμετρο \G π.χ
mysql> select * from mysql.user\G
Ακολουθούμε τα βήματα από : http://www.howtoforge.com/mysql5_master_master_replication_debian_etch
Για την περίπτωση που σταματήσει το replication και αργήσουμε να το αντιληφθούμε μπορούμε να αυξήσουμε τις μέρες που κρατιώνται τα logs από 10 σε 30.
Τροποποιούμε το αρχείο /etc/mysql/my.cnf
expire_logs_days = 30
Καλό είναι επίσης να ορίσουμε την αυτόματη παράκαμψη κάποιων προβληματικών sql επερωτήσεων που μπορούν να προκύψουν κατά το replication (βλ http://www.ducea.com/2008/02/13/mysql-skip-duplicate-replication-errors/).
slave-skip-errors = 1062,1146 #1062 : duplicate inserts (common in joomla) #1146 : table does not exist
Εάν η εντολή
mysqladmin -h s1.myserver.com -p -u root password <password>
μας βγάλει μήνυμα λάθους
error: 'Access denied for user 'root'@'s1.myserver.com' (using password: YES)
Θα πρέπει να ορίσουμε τον χρήστη 'root'@'s1.myserver.com' με πλήρη δικαιώματα mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON *.* to 'root'@'s1.myserver.com' identified by 'password'; mysql> quit
Εάν κατά την εκκίνηση της mysql η εντολή
tail -f /var/log/syslog
μας βγάλει το ακόλουθο μήνυμα λάθους
[ERROR] Could not find target log during relay log initialization
αρκεί να σβήσουμε ή να τροποποιήσουμε το αρχείο relay-log.info. Τέτοιου είδους πρόβλημα μπορεί να συμβεί και σε αλλαγή του ονόματος του μηχανήματος (hostname)
Εάν μας βγάλει το ακόλουθο μήνυμα
/usr/bin/mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
θα πρέπει να τοποθετήσουμε το σωστό κωδικό για τον debian-sys-maint στο αρχείο /etc/mysql/debian.cnf. Τον κωδικό θα τον βρούμε κρυπτογραφημένο στο αντίστοιχο αρχείο του υπολογιστή από τον οποίο πήραμε backup της βάσης mysql
Εάν κάποιος από τους 2 servers σταματήσει την λειτουργία προσωρινά στην επαναφορά ελέγχουμε πάντα για τυχόν λάθη με
tail -f /var/log/syslog
Εάν μας εμφανιστεί το παρακάτω λάθος
Error_code: 145 Dec 27 16:50:25 s1 mysqld[4420]: 071227 16:50:25 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000544' position 18245
Για να δούμε την κατάσταση εκτελούμε
mysql>SHOW SLAVE STATUS \G
Ακολουθούμε με την σειρά τις παρακάτω προτεινόμενες μεθόδους.
Μετά από κάθε προτεινόμενη διαδικασία επίλυσης, ελέγχουμε εάν το πρόβλημα λύθηκε
mysql> START SLAVE; mysql> SHOW SLAVE STATUS \G
Ελέγχουμε τις Slave_IO_Running και Slave_SQL_Running να είναι Yes καθώς και το Last_Erro να είναι κενό
Εναλλακτικά επανεκκινούμε την mysql
/etc/init.d/mysql restart
Και τσεκάρουμε από το syslog ότι όλα συνεχίστηκαν κανονικά
tail -f -n 100 /var/log/syslog
Τα mysql-bin logs αποθηκεύονται στον φάκελο /var/log/mysql/
Αν αφορά απλή περίπτωση διπλοεγγραφής τότε από το phpmyadmin την διαγράφουμε. Επανεκκινώντας και πάλι τους 2 servers από τα replication logs του ενός θα ξαναεκτελεστεί
Αλλιώς μπορούμε να προσπεράσουμε την προβληματική εντολή ακολουθώντας τις οδηγίες εδω : http://www.brandonchecketts.com/archives/2008/09
mysql> stop slave; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; start slave; Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec)
Για να δούμε αν όλα είναι ok
mysql> SHOW SLAVE STATUS \G
Αν δούμε κάποιο μήνυμα λάθους επαναλαμβάνουμε την διαδικασία Καλό είναι να κάνουμε και μια επανεκκίνηση για να σιγουρευτούμε ότι όλα είναι ok
/etc/init.d/mysql restart
Τσεκάρωντας πάλι από το syslog ή με
mysql> SHOW SLAVE STATUS \G
Εάν οι προβληματικές sql επερωτήσεις αφορούν μία βάση μόνο και είναι δεκάδες τότε μπορούμε προσωρινά να ρυθμίσουμε το replication να αγνοεί αυτή τη βάση ώστε να προχωρήσει.
Τροποποιούμε το αρχείο my.cnf ώστε να αγγνοεί την βάση testdb
replicate-ignore-db = testdb
Στην συνέχεια επανεκκινούμε την mysql
/etc/init.d/mysql restart
Ελέγχουμε πάλι αν όλα είναι ok
mysql> SHOW SLAVE STATUS \G
Στον server που υπάρχει η βάση testdb χωρίς πρόβλημα θα πρέπει να κρατήσουμε backup και ύστερα να την διαγράψουμε.
mysqldump -e --force --quick --quote-names -h localhost -u testdbuser -pPassword testdb > /backup/various/testdb-$(date +%Y-%m-%d).sql mysql -uroot -e"DROP DATABASE testdb;"
Στην συνέχεια τροποιούμε πάλι το αρχείο my.cnf βάζωντας σε σχόλια
#replicate-ignore-db = testdb
Eπανεκκινούμε την mysql
/etc/init.d/mysql restart
Δημιουργούμε ξανά την βάση testdb στον άλλο server επαναφέροντας τα δεδομένα της από το backup
mysql -uroot -e"CREATE DATABASE testdb;" mysql --force --quick -h localhost -u testdbuser -pPassword testdb < /backup/various/testdb-$(date +%Y-%m-%d).sql
Ελέγχουμε πάλι αν όλα είναι ok στον server που είχε προηγουμένως το πρόβλημα
mysql> SHOW SLAVE STATUS \G
Ως τελευταία λύση (που δεν ενδείκνυται γιατί πιθανόν ΘΑ ΧΑΘΟΥΝ σημαντικές εγγραφές) για να παρακάμψουμε το replication από παλιά logs σε περιπτώσεις πολλών συνεχώμενων διπλοεγγραφών από εκεί που ξεκινάει τα logs μετά την επανεκκίνηση ο 2ος server (εκτελούμε στον 2ο server)
mysql> show master status;
Καταγράφουμε το master log file και log position π.χ. mysql-bin.000544 και position 77465 (εκτελούμε στον 1ο server)
mysql> stop slave; Query OK, 0 rows affected (0.00 sec)
Συνεχίζουμε στο mysql-bin.000545 (Xάνοντας πολλές εντολές, δυστυχώς)
mysql> CHANGE MASTER TO MASTER_HOST='server.domainname.gr', MASTER_USER='slave2_user', MASTER_PASSWORD='mypasswprd', MASTER_LOG_FILE='mysql-bin.000545', MASTER_LOG_POS=4; Query OK, 0 rows affected (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec)
Ακολουθούμε τις οδηγίες στο link http://www.spiration.co.uk/post/1221 mysql> use databasename;
mysql> check table table_name;
αν επιμένει το λάθος εκτελούμε
/usr/bin/myisamchk -r /var/lib/mysql/database_name/table_name.MYI