Bonjour à tous,
j'utilise les fonctions ODBC_* de php pour attaquer ma base DB2/400.
J'ai installé le pilote ODBC for Linux de IBM (.rpm converti en .deb par le package Alien). Je suis sur une plateforme, vous l'aurez deviné, Debian Etch.
Donc, je requête chaque table de ma bibliothèque DB2/400, insère le résultat dans un fichier temporaire, type csv, puis charge le fichier dans mon serveur MySQL.
Je vous donne la version très simplifiée de mon code :
$dsn = "DRIVER=iSeries Access ODBC Driver;SYSTEM=$isdb_system;DBQ=$isdb_database";
$db = odbc_connect($dsn, $isdb_authuser, $isdb_authpwd, SQL_CUR_USE_ODBC);
$cur=odbc_exec($db,"SELECT * FROM $DB2Library.$tableEnCours");
while(odbc_fetch_row($cur)) {
for ($j=1; $j<=odbc_num_fields($cur); $j++) {
$values.=odbc_result($cur,$j);
}
}
Mon problème est que pour une partie des tables (42 sur 370), il me manque des enregistrements... le 'COUNT(*)' sur la biblio DB2/400 est alors différent du 'COUNT(*)' de la base MySQL, après l'insertion des datas.
Le volume manquant semble ne concerner que les enregistrements les plus récents. Plus la table est épaisse (j'ai des tables à 6millions+ enr), plus la perte est importante. Les petites tables (<100000enr) ne sont pas affectés par ce phénomène. Mais je peux avoir deux tables disons de 500.000enr, l'une OK l'autre à qui il manque 20% des datas.
Deux possibilités, pour moi :
- Un verrouillage d’une partie des enregistrements des tables par les processus Elvis (lourd à résoudre) ;
- Un bug dans la méthode d’accès à l’AS/400 (je me concentre là-dessus aujourd’hui).
Qu'en pensez-vous ? Si j'arrive à passer ce bug là, j'ai terminé mon script et j'aurais une base mirroir beaucoup plus facile à gérer pour nos dev analytiques.
Partager