web-dev-qa-db-fra.com

Importez plusieurs fichiers de vidage .sql dans la base de données mysql à partir du shell

J'ai un répertoire avec un tas de .sql fichiers que mysql sauvegarde 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.

J'ai besoin de créer un script Shell ou une seule ligne qui importera probablement chaque base de données.

Je cours sur une machine Linux Debian.

Je pense qu'il y a un moyen de diriger les résultats d'un ls dans une commande find ou quelque chose ..

toute aide et éducation est très appréciée.

MODIFIER

Donc, finalement, je veux importer automatiquement un fichier à la fois dans la base de données.

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

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

cat *.sql | mysql? En avez-vous besoin dans un ordre spécifique?

Si vous en avez trop à gérer de cette façon, essayez quelque chose comme:

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

Cela permet également de contourner certains problèmes lors du passage des entrées de script via un pipeline, bien que vous ne devriez pas rencontrer de problèmes avec le traitement du pipeline sous Linux. La bonne chose à propos de cette approche est que l'utilitaire mysql lit dans chaque fichier au lieu de le lire à partir de stdin.

75
D.Shawley

Une ligne pour lire en tout .sql fichiers et les importe:

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

La seule astuce est le remplacement de la sous-chaîne bash pour supprimer le .sql pour obtenir le nom de la base de données.

17
Ronnie

Il y a un superbe petit script sur http://kedar.nitty-witty.com/blog/mydumpsplitter-extract-tables-from-mysql-dump-Shell-script qui prendra un énorme fichier mysqldump et le diviser en un seul fichier pour chaque table. Ensuite, vous pouvez exécuter ce script très simple 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 gunzipping d'abord, puis l'exécute sur le fichier non compressé.

Je dis énorme , mais je suppose que tout est relatif. Il m'a fallu environ 6 à 8 minutes pour séparer un fichier de vidage de 200 tables de 200 Mo.

8
jshirey-ncusa

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

Le voici sur GitHub

C'est simple et direct; vous permet de spécifier les paramètres de connexion mysql, et décompressera les fichiers sql gzip à 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 base de données souhaité.

Donc:

myload foo.sql bar.sql.gz

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

Pour l'autre côté 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 nom ou expression régulière).

3
tylerl

Je ne me souviens pas de la syntaxe de mysqldump mais ce sera quelque chose comme ça

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