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
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
.
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.
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.
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.
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).
Je ne me souviens pas de la syntaxe de mysqldump mais ce sera quelque chose comme ça
find . -name '*.sql'|xargs mysql ...