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

jeudi 9 janvier 2014

Charger des données d'une instance DB2 à une autre sans (gros) fichier

on utilisera 3 pour cela 3 sessions SSH, testé avec 30 Go de données, mais doit pouvoir aller plus loin

session 1
mkfifo -m 777 /tmp/input

mkfifo -m 777 /tmp/output

session 2
db2 connect to base1

db2 "export to /tmp/input of ixf select * from matable"

session 3
db2 connect to base2

db2 "load from /tmp/output of ixf replace into matable nonrecoverable"

retour à la session  1
cat /tmp/input > /tmp/output

vendredi 3 janvier 2014

Erreur PHP Startup: Unable to load dynamic library

L'erreur complète est la suivante :

PHP Warning:  PHP Startup: Unable to load dynamic library 'XXX' 
- XXX: undefined symbol: php_pdo_register_driver in Unknown on line 0

La solution est toute bête, le driver PDO qu'on cherche à lancer est simplement démarré avant PDO lui même ! Il faut donc modifier l'ordre de chargement des extensions PHP, ensuite plus de soucis !



jeudi 2 janvier 2014

Comment compiler le module PDO_IBM pour PHP (RHEL/Fedora)

Prérequis

  1. Avoir déja installé le driver db2 voir ici 
  2. Télécharger les sources PDO_IBM-1.3.3 sur http://pecl.php.net/package/PDO_IBM

Etape 1: compiler le module

tar -zxf /tmp/PDO_IBM-1.3.3.tgz

cd PDO_IBM-1.3.3/

phpize --clean

phpize

cp /opt/IBM/dsdriver/include/* .

./configure --with-pdo-ibm=/opt/IBM/dsdriver/lib

make

sudo make install

Etape 2: Installer le module

echo "extension=pdo_ibm.so" > /etc/php.d/pdo_ibm.ini

Etape 3: Tester !

<?php

$database = 'test';
$user = 'test';
$password = 'test';
$hostname = 'localhost';
$port = 50000;
$string= sprintf("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=%s;HOSTNAME=%s;PORT=%d;PROTOCOL=TCPIP;",
         $database ,
         $hostname ,
         $port);

try {
  $connection = new PDO(
         $string,$user,$password);

        $req=$connection->query("select * from table");
        foreach ($req as $row) {
                print_r($row);
        }
}
catch (Exception $e) {
  echo($e->getMessage());
}
?>

Comment compiler le module db2_ibm pour PHP (RHEL/Fedora)


Prérequis


  1. télécharger le fichier ibm_data_server_driver_package_linuxx64_v10.5.tar.gz depuis le site IBM
  2. télécharger les sources du module sur http://pecl.php.net/package/ibm_db2
  3. avoir installé php-devel (yum install php-devel)
  4. avoir installé le korn shell (yum install ksh)

Etape 1 : Installer le driver DB2

mkdir -pv /opt/IBM;cd /opt/IBM;tar -zxf /tmp/ibm_data_server_driver_package_linuxx64_v10.5.tar.gz

chmod 755 /opt/IBM/dsdriver/installDSDriver

ksh installDSDriver

Etape 2 : Compiler le module

tar -zxvf ibm_db2-1.9.5.tgz; cd ibm_db2-1.9.5

phpize

export IBM_DB_HOME=/opt/IBM/dsdriver/

./configure

make

sudo make install

Etape 3 : Installer le module

echo "; Enable ibm_db2 extension module" > /etc/php.d/ibm_db2.ini

echo "extension=ibm_db2.so" >> /etc/php.d/ibm_db2.ini


service httpd restart

Etape 4 : Test !

<?php
$database = 'test';
$user = 'test';
$password = 'test';
$hostname = 'localhost';
$port = 50000;

$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;" .
  "HOSTNAME=$hostname;PORT=$port;PROTOCOL=TCPIP;UID=$user;PWD=$password;";
$conn = db2_connect($conn_string, '', '');

if ($conn) {
    echo "Connexion résie.";
    db2_close($conn);
}
else {
    echo "Connexion éoué";
}
?>