Blogdevphp

BigDump : Importer une grosse base de données facilement

2014-05-17 php

Vous souhaitez récupérer une base de données assez imposante, plus que 2 mo. Si vous travaillez avec phpmyadmin, vous serez vite bloqués dans la procédure d'import.

En effet, vous allez tomber sur une belle notification :

Vous avez probalement tenté de télécharger un fichier trop volumineux. Veuillez vous référer à la documentation pour des façons de contourner cette limite.

Et là c'est le drame, ça vient juste de commencer et ça plante.

On se dit alors qu'on va peut-être exporter table par table, ça le fait moyen et vous tomberez sur un os avec des temps d'exécution trop longs et autres surprises!

Pas de panique, c'est tout à fait normal, puisque si votre base de données fait plus que 2 mo, l'import était voué à l'échec. Si vous êtes à l'aise, en ligne de commandes, vous pouvez importer de cette manière. Une autre façon de faire est de  modifier le fichier php.ini et d'augmenter les valeurs memory_limit, upload_max_filesize et post_max_size. Après avoir modifier ces valeurs, il faut relancer votre serveur afin que les données nouvellement entrées soient prises en compte.

Je vais vous parler d'une troisième solution, où vous n'aurez pas à toucher aux fichiers config, de votre serveur, ni, à ouvrir votre terminal pour taper vos commandes. Il s'agit de BigDump, comme son nom l'indique, c'est pour importer de la grosse base de données.

Installation et paramétrage du fichier bigdump.php

On va télécharger le script sur cette page. On va récupérer le fichier bigdump.php en dézippant le fichier zip. Utilisez votre IDE habituel pour ouvrir ce fichier dont voici une partie :

<?php

// LAST CHANGES

// *** First ideas about adding plugin interface
// *** Fix // delimiter bug
// *** Minor fix to avoid Undefined variable curfilename notice
// *** Handle empty delimiter setting
// *** New way to determine the upload directory
// *** Set UTF8 as default connection charset

// Database configuration

$db_server   = 'localhost';
$db_name     = '';
$db_username = '';
$db_password = ''; 

// Connection charset should be the same as the dump file charset (utf8, latin1, cp1251, koi8r etc.)
// See http://dev.mysql.com/doc/refman/5.0/en/charset-charsets.html for the full list
// Change this if you have problems with non-latin letters

$db_connection_charset = 'utf8';

// OPTIONAL SETTINGS 

$filename           = '';     // Specify the dump filename to suppress the file selection dialog
$ajax               = true;   // AJAX mode: import will be done without refreshing the website
$linespersession    = 3000;   // Lines to be executed per one import session
$delaypersession    = 0;      // You can specify a sleep time in milliseconds after each session
                              // Works only if JavaScript is activated. Use to reduce server overrun

// CSV related settings (only if you use a CSV dump)

$csv_insert_table   = '';     // Destination table for CSV files
$csv_preempty_table = false;  // true: delete all entries from table specified in $csv_insert_table before processing
$csv_delimiter      = ',';    // Field delimiter in CSV file
$csv_add_quotes     = true;   // If your CSV data already have quotes around each field set it to false
$csv_add_slashes    = true;   // If your CSV data already have slashes in front of ' and " set it to false

// Allowed comment markers: lines starting with these strings will be ignored by BigDump

$comment[]='#';                       // Standard comment lines are dropped by default
$comment[]='-- ';
$comment[]='DELIMITER';               // Ignore DELIMITER switch as it's not a valid SQL statement
// $comment[]='---';                  // Uncomment this line if using proprietary dump created by outdated mysqldump
// $comment[]='CREATE DATABASE';      // Uncomment this line if your dump contains create database queries in order to ignore them
$comment[]='/*!';                     // Or add your own string to leave out other proprietary things

// Pre-queries: SQL queries to be executed at the beginning of each import session

// $pre_query[]='SET foreign_key_checks = 0';
// $pre_query[]='Add additional queries if you want here';

// Default query delimiter: this character at the line end tells Bigdump where a SQL statement ends
// Can be changed by DELIMITER statement in the dump file (normally used when defining procedures/functions)

$delimiter = ';';

// String quotes character

$string_quotes = '\'';                  // Change to '"' if your dump file uses double qoutes for strings

// How many lines may be considered to be one query (except text lines)

$max_query_lines = 300;

// Where to put the upload files into (default: bigdump folder)

$upload_dir = dirname(__FILE__);

// *******************************************************************************************
// If not familiar with PHP please don't change anything below this line
// *******************************************************************************************

if ($ajax)
  ob_start();

define ('VERSION','0.35b');
define ('DATA_CHUNK_LENGTH',16384);  // How many chars are read per time
define ('TESTMODE',false);           // Set to true to process the file without actually accessing the database
define ('BIGDUMP_DIR',dirname(__FILE__));
define ('PLUGIN_DIR',BIGDUMP_DIR.'/plugins/');

header("Expires: Mon, 1 Dec 2003 01:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

@ini_set('auto_detect_line_endings', true);
@set_time_limit(0);

if (function_exists("date_default_timezone_set") && function_exists("date_default_timezone_get"))
  @date_default_timezone_set(@date_default_timezone_get());

// Clean and strip anything we don't want from user's input [0.27b]

foreach ($_REQUEST as $key => $val) 
{
  $val = preg_replace("/[^_A-Za-z0-9-\.&= ;\$]/i",'', $val);
  $_REQUEST[$key] = $val;
}

// Plugin handling is still EXPERIMENTAL and DISABLED
// Register plugins by including plugin_name.php from each ./plugins/plugin_name
/*
if (is_dir(PLUGIN_DIR)) 
{ if ($dh = opendir(PLUGIN_DIR)) 
    {
    while (($file = readdir($dh)) !== false) 
    { if (is_dir(PLUGIN_DIR.$file) && $file!='.' && $file!='..' && file_exists(PLUGIN_DIR.$file.'/'.$file.'.php'))
       include (PLUGIN_DIR.$file.'/'.$file.'.php');
    }
    closedir($dh);
  }
}
*/

do_action('header');


?>

Nous allons commencer par paramétrer la config pour la base de données des lignes 14 à 17. Du classique avec le serveur, le nom de la base de données, le nom d'utilisateur et enfin le mot de passe si vous en avez un. Si vous n'avez pas de mot de passe, laissez comme ça.

A la ligne 27, on renseigne l'encodage, la valeur par défaut ici est UTF8. L'encodage par défaut sous Mysql est Latin1 donc si vous n'avez pas touché à l'encodage, mettez celui-ci.

A la ligne 29, vous pouvez paramétrer le nombre de lignes à prendre en compte par session, j'ai été amené à modifier cette ligne et j'avais mis 10 000. Ce sera en fonction de la base de données que vous souhaitez importer bien entendu!

A la ligne 30, on peut spécifier un temps d'attente entre chaque session afin de ne pas trop titiller le serveur, vous pouvez mettre 5, 10 si vous pensez que c'est utile. Vous pouvez être amené à modifier la valeur à la ligne 66, toujours selon la taille de votre base de données. 

Après tout ça, on va enregistrer pour commencer l'import , à partir de notre navigateur.

 

Import de notre base de données

Sur votre serveur local, créer un dossier bigdump, par exemple et mettez-y le fichier bigdump.php que vous venez de paramétrer. De plus, rajoutez, également dans ce dossier, le fichier .sql contenant la base de donnée à importer.

Ouvrez votre navigateur, tapez localhost pour accéder à votre serveur local, puis ouvrez votre dossier bigdump et cliquez sur le fichier de config bigdump.php pour accéder à l'interface d'import.

Si un message vous notifie, que la base de données n'existe pas, c'est que vous avez mal renseigné les données de connexion à celle-ci.

Si tout a fonctionné, vous allez mettre en route la machine en cliquant sur Start Import. Si des erreurs surviennent, concernant le temps d'éxécution ou le nombre de lignes trop important à traiter, il faudra modifier certaines valeurs en fonction du message d'erreur.

Si tout s'est bien passé, un récapitulatif vous sera affiché avec les félicitations de BigDump, ça fait toujours plaisir! 

Conclusion

BigDump est une bonne alternative pour importer de grosses bases de données.On n'a pas forcément accès aux fichiers de config, pour modifier les valeurs de certaines variables. Cela offre une autre solution pour la procédure d'import d'une base de données importantes.

 

comments powered by Disqus
Copyright © 2016 blogdevphp.fr - Tous droits réservés