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);