39 votes

Importer plusieurs fichiers .sql dump dans une base de données mysql à partir d'un shell

J'ai un répertoire contenant un certain nombre de .sql que mysql déverse de chaque base de données sur mon serveur.

par exemple

database1-2011-01-15.sql
database2-2011-01-15.sql
...

Il y en a beaucoup en fait.

Je dois créer un shell script ou une ligne simple probablement qui importera chaque base de données.

Je travaille sur une machine Linux Debian.

Je pense qu'il y a un moyen d'introduire les résultats d'un ls dans une commande find ou autre .

Toute aide et tout enseignement sont très appréciés.

EDIT

En fin de compte, je souhaite importer automatiquement un fichier à la fois dans la base de données.

Par exemple, si je le faisais manuellement sur un seul fichier, ce serait :

mysql -u root -ppassword < database1-2011-01-15.sql

75voto

D.Shawley Points 30324

cat *.sql | mysql ? Avez-vous besoin de ces documents dans un ordre particulier ?

Si vous en avez trop, essayez de faire quelque chose comme cela :

find . -name '*.sql' | awk '{ print "source",$0 }' | mysql --batch

Cela permet également de contourner certains problèmes liés au passage d'entrées script à travers un pipeline, bien que vous ne devriez pas avoir de problèmes avec le traitement des pipelines sous Linux. L'avantage de cette approche est que l'option mysql lit chaque fichier au lieu de le faire lire à partir de l'utilitaire stdin .

17voto

RonnieUTD Points 96

Une phrase à lire dans tous les cas .sql et les importe :

for SQL in *.sql; do DB=${SQL/\.sql/}; echo importing $DB; mysql $DB < $SQL; done

La seule astuce consiste à utiliser le remplacement de chaîne de caractères de bash pour supprimer le caractère .sql pour obtenir le nom de la base de données.

10voto

jshirey-ncusa Points 11

Il y a un superbe petit script à http://kedar.nitty-witty.com/blog/mydumpsplitter-extract-tables-from-mysql-dump-shell-script qui prendra un énorme mysqldump et le diviser en un seul fichier pour chaque table. Vous pouvez ensuite exécuter ce très simple script pour charger la base de données à partir de ces fichiers :

for i in *.sql
do
  echo "file=$i"
  mysql -u admin_privileged_user --password=whatever your_database_here < $i
done

mydumpsplitter fonctionne même sur les fichiers .gz, mais il est beaucoup, beaucoup plus lent que de gunzipper d'abord, puis de l'exécuter sur le fichier décompressé.

Je dis énorme mais je suppose que tout est relatif. Il m'a fallu environ 6 à 8 minutes pour diviser un fichier dump de 2000 tables et 200 Mo.

3voto

tylerl Points 14541

J'ai créé un script il y a quelque temps pour faire précisément cela, que j'ai appelé (de manière totalement non créative) "myload". Il charge les fichiers SQL dans MySQL.

Le voici sur GitHub

Il est simple et direct ; il vous permet de spécifier les paramètres de connexion mysql, et décompressera les fichiers sql gzipés à la volée. Il suppose que vous avez un fichier par base de données, et que la base du nom de fichier est le nom de la base de données souhaitée.

Ainsi :

myload foo.sql bar.sql.gz

Crée (s'il n'existe pas) des bases de données appelées "foo" et "bar", et importe le fichier sql dans chacune d'elles.

Pour l'autre partie du processus, j'ai écrit ce script (mydumpall) qui crée les fichiers sql (ou sql.gz) correspondants pour chaque base de données (ou un sous-ensemble spécifié par un nom ou une expression rationnelle).

3voto

Navi Points 3644

Je ne me souviens pas de la syntaxe de mysqldump, mais cela doit ressembler à ceci

 find . -name '*.sql'|xargs mysql ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X