CodeSnippetsMySQL

Exploitation Applicative

Configuration mysql des CMS courants

Alors parceque dés fois c'est super relou de retrouver les bonnes infos, on fait le point ici:

  • Drupal: sites/default/settings.php
  • Spip: conf/connect.php
  • Typo3: sysext/adodb/adodb
  • Wordpress: wp-config.php
  • Symphonie: config/databases.yml
  • MediaWiki: LocalSettings.php

Exploitation Interne

Quick Win mother fucker !

Création rapide d'une BDD et d'un user dédié:
CREATE DATABASE db
GRANT ALL PRIVILEGES ON db.* to  'user'@'localhost' IDENTIFIED BY 'mon mdp'

Exécuter une commande SQL sur toutes les tables d'une base

Cette commande sort un court extrait de chaque table. Génial pour faire du reverese engeerneering sur une appli ;-):for i in $(ls -1 /var/lib/mysql/centreonprod | sed 's/\..*//' | sort | uniq); do echo "mysql centreonprod -e select * from $i limit 0,10" ; done

La version suivante est la meilleur:
for i in $(ls -1 /var/lib/mysql/centreonprod | sed 's/\..*//' | sort | uniq);  do echo -en "\n\n==> Table: $i\n\n" >> /home/nexen/roc ; mysql centreonprod -e "select * from  $i limit 0,10\G" >> /home/nexen/roc ; done

Afficher le status des tables;

  • Afficher toutes les tables en InnoDB:
    SELECT TABLE_SCHEMA, table_name, TABLE_ROWS  FROM INFORMATION_SCHEMA.TABLES   WHERE engine = 'InnoDB';
  • Afficher toutes les tables en MyISAM (bweerk):
    SELECT TABLE_SCHEMA, table_name, TABLE_ROWS  FROM INFORMATION_SCHEMA.TABLES   WHERE engine = 'MyISAM';
  • Afficher le reste des tables:
    SELECT TABLE_SCHEMA, table_name, ENGINE, TABLE_ROWS  FROM INFORMATION_SCHEMA.TABLES   WHERE engine != 'MyISAM' AND  engine != 'InnoDB' ;
  • La commande brute:
    SELECT TABLE_SCHEMA, table_name, ENGINE, TABLE_ROWS  FROM INFORMATION_SCHEMA.TABLES ;

Lister tous les utilisateurs MySQL

Utile pour les migrations pour le coup:
for i in $(mysql -e "SELECT user, host FROM mysql.user;" | awk '{print "`" $1 "`@`" $2 "`"}' | tail -n +2) ; do mysql -e "SHOW GRANTS FOR $i \G" | grep 'Grants for ' | cut -d':' -f 2 ; done

Lister toutes les bases de MySQL

Marche pour Maria/MySQL. Pour Percona, il faudra rajouter une expression dans le grep ...
 for i in $(mysqlshow | tail -n +3 | grep -vE 'performance_schema|information_schema' | awk '{print $2}') ; do  echo $i ; done
Et ci-dessous une commande pour créer un utilisateur par base. Pratique lors de migrations (il vous faudra apg pour celle là, apg peut ralentir un peu le processus):
for i in $(mysqlshow | tail -n +3 | grep -vE 'performance_schema|information_schema' | awk '{print $2}') ; do printf "GRANT ALL PRIVILEGES ON %s.* TO '%s'@'%s' IDENTIFIED BY '%s';\n" ${i} ${i} "10.0.0.%" "$(apg -m 10 -M ncl -n 1 -c /dev/urandom)" ; done

Administration Externe

Détection de problèmes

Les commandes suivantes peuvent aider à dégorger la BDD:

  • Lister les requetes par ordre de temps:
    mysql -e 'SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST order by time \G'
  • Avoit une sorte de MySQLTop:
    watch "mysql -e 'SELECT ID, USER, DB, TIME, STATE, INFO   FROM INFORMATION_SCHEMA.PROCESSLIST order by  time DESC'  " 
  • Lister toutes les requetes, par ordre de durée:
    mysql   -e 'SELECT ID, USER, DB, TIME, STATE, LEFT(INFO, 20)   FROM INFORMATION_SCHEMA.PROCESSLIST order by  time ASC ' 

Désengorgement

  • Cron de nettoyage qui kill les commandes en Sleep de plus de 30s:
    */1 * * * * root for i in $(mysql --skip-column-names  -e 'SELECT id FROM INFORMATION_SCHEMA.PROCESSLIST WHERE time > 30 AND Command  like "Sleep"') ; do mysqladmin kill $i ; done
  • Tuer tous les Selects de plus de 30 secondes:
    for i in $(mysql -e "SELECT id FROM INFORMATION_SCHEMA.PROCESSLIST where INFO like '%SELECT%' and time > 30  "  ); do mysqladmin kill  $i ; done
    

Export de données

Importer tes les tables d'un backup dans MySQL:

Se mettre dans le dossier où les tables sauvegardées sont de la forme <base>-<table>:
for i in $(ls -1 . | sed 's/-.*//' | uniq ; do  bzcat $( ls ${i}-* ) |  mysql -uroot -p<PASS> -h10.0.4.52 $i ; echo "=> $i done" ; done

Ce script va afficher sortir le nom des bases grâce au ls -1 et les filtres qui sont derrière. Ensuite, pour chaque base, il va importer directement dans la bonne base de MySQL. On peut bien modifier les modèle de nommage des tables en jouant sur le pattern du sed.

Page last modified on September 10, 2016, at 12:26 AM EST