jeudi 23 octobre 2014

Résoudre les conflits de réplication Mysql

En fonction de la gravité de l'erreur (OK si la donnée existe déjà sur le slave et est rigoureusement identique), on peut bypasser l'erreur. Executer le sql suivant :
stop slave;SET GLOBAL sql_slave_skip_counter = 1;start slave;
Mieux vaut vérifier à chaque modification: c'est pourquoi on utilise seulement la valeur 1 pour sql_slave_skip_counter.

Trouver les index non utilisés dans DB2

1) déterminer les id de ts et de table
db2 "SELECT TBSPACEID, TABLEID FROM SYSCAT.TABLES \
WHERE TABSCHEMA = 'schema' AND TABNAME = 'table'";
2) déterminer le nombre de scans d'index (champs 8, si = 0 jamais lu)
db2pd -db sbl -tcbstats all tbspaceid=13 tableid=4 | \
grep -p "TCB Index Stats:" | \
awk '{  if ($8 == "0") { print $3} }'
3) il ne reste plus qu'à déterminer le nom des index
db2 "select INDNAME FROM SYSCAT.INDEXES WHERE TABSCHEMA = 'schema' \
AND TABNAME = 'table' AND IID in (liste des ids de l'etape 2)"

statut de DB2 HADR en SQL

 
$  db2 "select cast(HADR_LOCAL_HOST as varchar(10)) as local, \
cast(HADR_REMOTE_HOST as varchar(10)) as remote,  \
cast(DB_NAME  as varchar(10)) as db, HADR_STATE, \
HADR_CONNECT_STATUS from SYSIBMADM.SNAPHADR"

LOCAL      REMOTE     DB         HADR_STATE     HADR_CONNECT_STATUS
---------- ---------- ---------- -------------- -------------------
PROD       BACK       DATABASE   PEER           CONNECTED

  1 record(s) selected.

jeudi 14 août 2014

Monitoring APC

Sous RHEL, il y a une interface pour monitorer l'activité du cache d'opcode APC. elle est située dans /usr/share/php-pecl-apc/apc.php
cp /usr/share/php-pecl-apc/apc.php /var/www/html

mercredi 13 août 2014

Réparer une base mysql avec des tables innodb/ibdata corrompues

Pour que cette méthode fonctionne, il faut au moins posséder un dump de la structure de la base, et il faut l'option innodb_file_per_table activée (c'est toujours une bonne habitude de l'activer)
  1. Copier les fichier IBD dans un endroit sûr, par exemple /home/bob
  2. Redémarrer la base, en ayant supprimé éventuellement les tablespaces systèmes ibdata1 et ib_logfile avant. attention aux tables InnoDB dans la base Mysql, les recréer au besoin
  3. Réimporter la structure de la base
  4. Réimporter les données, et la c'est la partie la plus dure ! il faut exporter les tablespaces que l'on vient de créer et réimporter à la place ceux qu'on a sauvegardé, le tout en redémarrant mysql à chaque action pour être sûr de flusher sur le disque. C'est ce que le script suivant fait:
#! /bin/bash
# superformance.blogspot.com
BKPDIR=/home/bob
USER=root
PASS=pass
DB=db
 
for table in $(mysql -u ${ROOT} -p${PASS} \
    -NBe "select TABLE_NAME from information_schema.TABLES \
    where ENGINE='InnoDB' and TABLE_SCHEMA='${DB}';" )
    #supprimer le tablespace vide que l'on vient de creer
    mysql -u ${ROOT} -p${PASS} \
    -NBe "alter table ${table} discard tablespace;"
    # arreter mysql
    /etc/init.d/mysqld stop
    #Copier l'ancien TBS
    cp $BKPDIR/$table.ibd /var/lib/mysql/$DB
    #demarrer mysql
    /etc/init.d/mysqld start
    #importer l'ancien tbs
    mysql -u ${ROOT} -p${PASS} -NBe \
    "alter table ${table} import tablespace;"
    /etc/init.d/mysqld restart
done



Ensuite sauvegarder la base avec mysqldump !

mardi 12 août 2014

Générateur de configuration MySQL

2 outils pour générer des configurations MySQL :

https://tools.percona.com/wizard
http://www.fromdual.com/mysql-configuration-file-sample

mardi 25 février 2014

Script shell pour afficher le pourcentage de fullscan MySQL

Ce script a pour but de donner une idée de la santé de MySQL (indexation principalement).
Plus le pourcentage est important, plus les requêtes font des lectures sur le disque (pas bien !), on considère qu'il ne faut pas dépasser 20%

Bien sûr les données ne sont valable que lorsqu'il y a un peu de charge sur MYSQL

#! /bin/bash
# superformance.blogspot.com

USER=root
PASS=pass
DB=db

TEMP_FILE=/tmp/$$.tmp
trap "rm $TEMP_FILE; exit" SIGHUP SIGINT SIGTERM
SOCK=/var/lib/mysqlmysql.sock
L_Handler_read_rnd_next=0
L_Handler_read_rnd=0
L_Handler_read_first=0
L_Handler_read_next=0
L_Handler_read_key=0
L_Handler_read_prev=0


while true; do
    # fullscan percentage
    mysql -u ${USER} -p${PASS} --connect-timeout=5 -NBe \
    "show global status like 'handler%'" > /tmp/$$.tmp

    V_Handler_read_rnd_next=$(grep -E -w \
        "Handler_read_rnd_next" /tmp/$$.tmp | awk '{print $2}')
    V_Handler_read_rnd=$(grep -E -w \
        "Handler_read_rnd" /tmp/$$.tmp | awk '{print $2}')
    V_Handler_read_first=$(grep -E -w \
        "Handler_read_first" /tmp/$$.tmp | awk '{print $2}')
    V_Handler_read_next=$(grep -E -w \
        "Handler_read_next" /tmp/$$.tmp | awk '{print $2}')
    V_Handler_read_key=$(grep -E -w \
        "Handler_read_key" /tmp/$$.tmp | awk '{print $2}')
    V_Handler_read_prev=$(grep -E -w \
        "Handler_read_prev" /tmp/$$.tmp | awk '{print $2}')

    Handler_read_rnd_next=$(echo "$V_Handler_read_rnd_next - \
        $L_Handler_read_rnd_next" | bc)
    Handler_read_rnd=$(echo "$V_Handler_read_rnd - \
        $L_Handler_read_rnd" | bc)
    Handler_read_first=$(echo "$V_Handler_read_first - \
        $L_Handler_read_first" | bc)
    Handler_read_next=$(echo "$V_Handler_read_next - \
        $L_Handler_read_next" | bc)
    Handler_read_key=$(echo "$V_Handler_read_key - \
        $L_Handler_read_key" | bc)
    Handler_read_prev=$(echo "$V_Handler_read_prev - \
        $L_Handler_read_prev" | bc)

    div=$( echo "$Handler_read_rnd_next + $Handler_read_rnd + \
        $Handler_read_first + $Handler_read_next + \
        $Handler_read_key + $Handler_read_prev" | bc)

    if [ $div == 0 ]; then
       echo "0%"
    else
       echo $( echo "scale=2;(($Handler_read_rnd_next + \
        $Handler_read_rnd) / $div)* 100" | bc -l )"%"
    fi

    L_Handler_read_rnd_next=$V_Handler_read_rnd_next
    L_Handler_read_rnd=$V_Handler_read_rnd
    L_Handler_read_first=$V_Handler_read_first
    L_Handler_read_next=$V_Handler_read_next
    L_Handler_read_key=$V_Handler_read_key
    L_Handler_read_prev=$V_Handler_read_prev

    unset V_Handler_read_rnd_next
    unset V_Handler_read_rnd
    unset V_Handler_read_first
    unset V_Handler_read_next
    unset V_Handler_read_key
    unset V_Handler_read_prev

    sleep 5
done