** Pratique pour communiquer des variables à un tiers sans se faire chier. ** mysql -uroot -e 'SHOW GLOBAL STATUS\G' -p`cat /root/.rootdbpass` > /tmp/GLOBALSTATUS.txt mysql -uroot -e 'SHOW GLOBAL VARIABLES\G' -p`cat /root/.rootdbpass` > /tmp/GLOBALVARIABLES.txt mysql -uroot -e 'SHOW ENGINE INNODB STATUS\G' -p`cat /root/.rootdbpass` > /tmp/INNODBSTATUS.txt ** définir more ou less ou grep en tant que pager dans le MySQLcli peut être très pratique ! ** mysql>PAGER more mysql>NOPAGER ** /tmp doit être sur la partition rapide du datadir. verification : ** mysql> show variables like '%tmpdir%'; ** Restarter un MySQLd proprement ! ** mysqladmin -uroot -p`cat /root/.rootdbpass` shutdown && tail -f /var/log/mysql/mysqld.err ** Chopper les queries pourries qui passe dans le processlist ** while true; do mysql -uroot -p`cat /root/.rootdbpass` -e'show full processlist' | grep -vi sleep | grep -v replicator; sleep 2; done ** Restauration d'une replication innodb : ** #!/bin/bash mysqldump -uroot -p`cat /root/.rootdbpass` \ --triggers --routines --hex-blob --add-locks --add-drop-table --master-data \ --single-transaction \ --all-databases \ >/root/dumpdbmysql.sql ** Flusher le query cache, car il fragmente : ** flush query cache; ** sur les systemes a très forte charge il vaut mieux finalement couper le query cache. ** mysql> set global query_cache_size=0; ** Activer les slow query ** mysql>set global slow-query-log=1; ** Verifier une variables ** mysql> show variables like '%trans%'; ** Purger les logs binaire d'un MySQL Master (après avoir vérifié la position du slave.) ** mysql> show master logs; mysql> purge master logs to 'mysqld-bin.000080'; ** Stoper une réplication MySQL sur un salve de manière propre et safe : ** STOP SLAVE SQL_THREAD; show status WHERE `Variable_Name` = 'Slave_open_temp_tables'; STOP SLAVE IO_THREAD; ** Analyser une slow querie la lancer dans un explain : ** mysql> explain requete SQL; ** Recupérer la position binaire d'un master de manière safe : ** flush tables with read lock; show master status; unlock tables; ** Killer tous les process d'un user d'un coup (pratique sur les MySQL mutualisé)** SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='poulpe'; SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='poulpe' INTO OUTFILE '/tmp/poulpe.txt'; source /tmp/poulpe.txt ** Lancer MySQLD dans gdb pour voir ou Mysql sucks ** gdb -ex "set pagination 0" -ex "thread apply all bt" --batch -p $(pidof mysqld) ** Simulation de charge sur du select sur le slave a partir des select du master ** sur le master mysql> show variables like '%log%'; mysql> set global log=1; mysql> show variables like '%log%'; mysql> set global log=0; puis scp /var/run/mysqld/mysqld.log slave: puis on traite le fichier pour ne garder que les select : cat mysqld.log | perl -n -e 'if ( /^\s*\d+\s+Query\s+(select .+)\s*$/ ) { print $1 . ";\n"; }' > queryselect.txt Puis on lance le stress : /usr/local/mysql/bin/mysqlslap --create-schema=truc --query=queryselect.txt --concurrency=16 -i100 -uroot -p`cat /root/.rootdbpass` * reparer toutes les tables d'une base : DATABASENAME="db_name" echo 'SHOW TABLES;' \ | mysql -uroot -p`cat /root/.rootdbpass` ${DATABASENAME} \ | awk '!/^Tables_in_/ {print "REPAIR TABLE `"$0"`;"}' \ | column -t \ | mysql -uroot -p`cat /root/.rootdbpass` ${DATABASENAME} * cuttable.pl #!/usr/bin/perl my ($file, $from, $to) = @ARGV; my $fh; my $matching = 0; open($fh, $file) or die $!; while(<$fh>) { if(/\Q$from\E/) { $matching = 1; } if($matching) { print $_; } if($matching && /\Q$to\E/) { last; } } close($fh); * exemple utilisation : perl cuttable.pl 'db-backup.sql' '-- Table structure for table `table`' 'UNLOCK TABLES;' > table.sql * creer user + db CREATE USER 'poulpe'@'%' IDENTIFIED BY '*****'; GRANT USAGE ON * . * TO 'poulpe'@'%' IDENTIFIED BY '*****' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; CREATE DATABASE IF NOT EXISTS `poulpe` ; GRANT ALL PRIVILEGES ON `poulpe` . * TO 'poulpe'@'%'; GRANT REPLICATION CLIENT ON * . * TO 'sdfrance'@'%' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; * Maatkit : ##### preparation de la bascule #### Utilisation de maatkit pour virifier le checksum des bases : create database checksum use checksum CREATE TABLE checksum ( db char(64) NOT NULL, tbl char(64) NOT NULL, chunk int NOT NULL, boundaries char(100) NOT NULL, this_crc char(40) NOT NULL, this_cnt int NOT NULL, master_crc char(40) NULL, master_cnt int NULL, ts timestamp NOT NULL, PRIMARY KEY (db, tbl, chunk) ); mk-table-checksum -u root -p`cat /root/.rootdbpass` --replicate checksum.checksum --chunk-size=10M localhost puis sur le slave : SELECT db, tbl, chunk, this_cnt-master_cnt AS cnt_diff, this_crc <> master_crc OR ISNULL(master_crc) <> ISNULL(this_crc) AS crc_diff FROM checksum WHERE master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc);