MySQL/Importer et exporter

Exporter

modifier

phpMyAdmin propose un bouton "Export" permettant l'extraction de toute une base dans un fichier .sql. Pour ne sortir que quelques tables, il faut les cocher puis choisir "Export" dans le menu déroulant en bas.

Pour exporter en SQL, le mot clé est INTO OUTFILE :

 SELECT * FROM destinataire INTO OUTFILE '/tmp/test' WHERE id IN (41, 141, 260, 317, 735, 888, 1207, 2211);

Le processus MySQL écrit lui-même le fichier, pas l'utilisateur. De plus, le fichier est stocké sur le serveur, pas le client.

Généralement le serveur a le droit d'écrire dans /tmp, donc même s'il n'est pas sécurisé ce répertoire est utilisé pour les exemples ci-dessous.


Par ailleurs, exporter est possible en ligne de commande :

mysql < query.txt > output.txt

Ou bien via mysqldump.

Importer

modifier

Pour importer un fichier :

LOAD DATA INFILE '/tmp/test' INTO TABLE destinataire;

 

Le fichier doit se trouver sur le serveur MySQL.

Options additionnelles :

FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
IGNORE 1 LINES

Pour spécifier la structure du document et la présence d'en-tête, on peut associer les colonnes de la base à des variables :

 LOAD DATA LOCAL INFILE
 '/tmp/test'
 INTO TABLE destinataire 
 FIELDS TERMINATED BY '\t'
 LINES TERMINATED BY '\n'
 IGNORE 1 LINES 
 ( 
 @dummy,
 name,
 phone_number,
 @dummy,
 @dummy,
 @dummy,
 @dummy,
 @dummy,
 @dummy,
 @dummy
 )

Dans cet exemple, seule la seconde et troisième colonne du fichier sont stockées dans le champ name et phone_number.

Précisions sur le contenu

modifier

Pour importer un .sql créant un utilisateur et sa base de données, il faut savoir s'il existe déjà sur le serveur, car MySQL ne possède pas de DROP USER IF EXISTS. Par contre pour les bases ça fonctionne :

DROP DATABASE IF EXISTS `base1`;
CREATE DATABASE `base1` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `base1`;
--DROP USER `utilisateur1`@'localhost';
CREATE USER 'utilisateur1'@'localhost' IDENTIFIED BY 'p@ssword1';
GRANT USAGE ON *.* TO 'utilisateur1'@'localhost' IDENTIFIED BY 'p@ssword1';
GRANT ALL PRIVILEGES ON `base1`.* TO 'utilisateur1'@'localhost';
-- ou GRANT ALL ON `base1` TO 'utilisateur1'@'localhost';

PS : si cette commande renvoie la commande drop database est désactivée avec PhpMyAdmin, modifier son config.default.php en passant $cfg['AllowUserDropDatabase'] à true, et vider le cache du navigateur.