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