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