Comment importer une grosse base de données

Publié dans SQL | Marqué avec , , , , ,
Share

Ce billet aurait aussi pu se nommer « Vive la ligne de commandes ! ».
Je pense arriver au bout de mes peines avec ma grosse tables de 3 millions de tuples (qui n’en fait d’ailleurs toujours pas 3 millions, alors j’espère que ça tiendra le coup quand tous les tuples seront là), et j’ai notamment pas mal galéré pour la transférer d’une base de données à une autre. (local -> serveur de développement) Si on utilise PHP, ou PhpMyAdmin, pour transférer sa BDD, on se retrouve vite avec de très long temps d’attente et avec une machine qui rame jusqu’à la mort. Quelques idées pour survivre entier à ce calvaire :
sql

  • Préférer le transfert à l’aide de fichiers. Car le copier/coller de requêtes fonctionnent pour de petites tables, mais ça fait très vite ramer votre machine de course pour de grosses tables. Il suffit d’exporter les tables de son choix via PhpMyAdmin (à l’accueil d’une base > exporter : pour exporter les tables de son choix. A l’accueil d’une table > exporter : pour exporter directement la table en question), puis dans les importer via PhpMyAdmin, ou en ligne de commandes. Il vaut mieux éviter de cocher la case « Insertion Complète » qui créé une seule requête INSERT INTO table (val1, val2) VALUES ('blabla', 'bloublou'), ('blibli', 'bleble'), ..., ('blublu', 'bloblo'); ce qui peut être un peu trop lourd. Mieux vaut créer autant de requêtes qu’il y a d’insertions dans ce cas. (le mieux serait de faire une requête pour une trentaine d’insertions, c’est vraiment plus rapide, mais cela oblige à coder tout ça soit même. Edit: apparemment, il faut choisir « Insertions Etentdues ».)
  • Préférer l’utilisation des lignes de commandes. Pour plusieurs raisons : plus de problèmes avec les timeout de MySQL ou de PHP puisqu’on effectue une commande à la fois. (sauf si on commande est trop lourde. Dans le cas d’une insertion complète par exemple), on contrôle réellement tout ce qui se passe en temps réel et on peut réellement tout arrêter en temps réel. (suffit de fermer le terminal quoi !), on ne passe par aucun intermédiaire et c’est donc vraiment plus rapide.

Quelques rappels sur les lignes de commandes

MySQL Avant toute chose, il va falloir se mettre en condition pour utiliser les commandes MySQL. Pour cela, il nous faut un prompt mysql>.

Sous Linux

Il suffit d’ouvrir un terminal (de préférence son préféré) et de se connecter à son serveur distant via SSH si besoin. Puis il faut se positionner dans le dossier qui connait le commande mysql, pour mon cas c’était /usr/lib/mysql.

Sous Windows

Si vous souhaitez travailler en ligne, il suffit d’utiliser Putty et de se connecter au serveur distant (qui tourne sous Linux si vous avez de la chance).
Si vous travaillez en local, Wamp et Xamp possède une console MySQL, vous avez donc directement un prompt mysql>.
On peut aussi directement utiliser la console Windows (ou Cygwin ou autre) : il suffit d’ajouter mysql.exe (chercher là où vous avez installé MySQL) à la variable d’environnement PATH, puis d’ouvrir une ligne de commande Windows (recherche : cmd) et d’utiliser la commande MySQL décrite ci-dessous.

Importer à l’aide de commandes MySQL

Pour se connecter à une base de données

connect -u username -p nombdd [-h localhost]

Le mot de passe vous sera de toute façon demandé si vous ne le précisez pas directement. (et s’il n’y en a pas, il suffit d’appuyer sur Entrée) On aurait aussi pu faire, au moment d’avoir le prompt mysql :

mysql -u username -p nombdd [-b motdepasse]

On peut désormais taper toutes les commandes SQL que l’on voit en les terminant par un point virgule.

INSERT INTO table (val1, val2) VALUES ('blabla', 'bloublou');

Ou alors importer un fichier :

source cheminVersLeFichier.sql

On aurait aussi pu faire, au moment d’avoir le prompt mysql :

mysql -u username -p nombdd [-h localhost] < cheminVersLeFichier.sql

Et voilà, il n’y a plus qu’à voir les lignes défilées et à attendre.

One Response to Comment importer une grosse base de données

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *