Importer data.sql MySQL Docker Container

87

Si j'ai un data.sql, comment puis-je importer une base de données dans mon conteneur docker mysql? Comment puis-je importer des données de base de données. Dans un monde dockerisé, cela ajoute une couche de complexité. quelques méthodes s'il vous plaît.

Voici mon docker-compose.yml:

nginx:
  build: ./nginx/
  container_name: nginx-container
  ports:
    - 80:80
  links:
    - php
  volumes_from:
    - app-data

php:
  build: ./php/
  container_name: php-container
  expose:
    - 9000
  links:
    - mysql
  volumes_from:
    - app-data

app-data:
  image: php:7.0-fpm
  container_name: app-data-container
  volumes:
    - ./www/html/:/var/www/html/
  command: "true"

mysql:
  image: mysql:latest
  container_name: mysql-container
  ports:
    - 3306:3306
  volumes_from:
    - mysql-data
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: name_db
    MYSQL_USER: user
    MYSQL_PASSWORD: password

mysql-data:
  image: mysql:latest
  container_name: mysql-data-container
  volumes:
    - /var/lib/mysql
  command: "true"
Israël Morales
la source
Copiez le fichier SQL dans le conteneur, puis chargez le fichier de données.
Jay Blanchard

Réponses:

58

Je n'arrive pas à faire fonctionner cela avec le dernier mysql ou mysql: 5.7. J'utilise donc mariaDB à la place. Voici mon docker-compose.yamlcode.

version: '3'

services:
  mysql:
    image: mariadb:10.3
    container_name: mariadb
    volumes:
      - container-volume:/var/lib/mysql
      - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: name_db
    ports:
      - "3306:3306"

volumes:
  container-volume:
Hana Alaydrus
la source
Lorsque j'essaye d'utiliser cette méthode, je me retrouve avec un répertoire pour dump.sql? Une idée sur pourquoi? par exemple: bash dans le conteneur mariadb &: cd /docker-entrypoint-initdb.d/dump.sql/& puis je suis dans un répertoire? Qu'est-ce qui provoquerait la création d'un répertoire au lieu de ne pas avoir du tout le fichier .sql ou de générer une sorte d'erreur? mon docker-compose.yml pertinent pour le conteneur mariadb:mariadb: image: mariadb:latest ... volumes: - app-vhosts:/path/before/sqldump #creates a directory? - ./path/to/sql/dump.sql:/docker-entrypoint-initdb.d/dump.sql
K8sN0v1c3
150

Vous pouvez ensuite importer la base de données:

docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql

Lauri
la source
23
Si vous utilisez docker-Compose, vous devez obtenir le récipient par: docker exec -i $(docker-compose ps -q mysql-container) mysql …. Il ne prend pas en charge la lecture depuis stdin pour le moment, comme décrit ici .
slhck
2
comment faire cela sur docker-compose?
iamjc015
7
Je suis. obtenant l'erreur "le périphérique d'entrée n'est pas un ATS"
kamal
FYI: utiliser -psans mot de passe pour des raisons de sécurité.
Abdulla Nilam
2
@kamal avez-vous utilisé l' -toption pour docker exec? Juse utilise -ipour éviter l'erreur
Wolfgang
83

Montez votre sql-dump en /docker-entrypoint-initdb.d/yourdump.sqlutilisant un montage de volume

mysql:
  image: mysql:latest
  container_name: mysql-container
  ports:
    - 3306:3306
  volumes:
    - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: name_db
    MYSQL_USER: user
    MYSQL_PASSWORD: password

Cela déclenchera une importation du sql-dump lors du démarrage du conteneur, voir https://hub.docker.com/_/mysql/ sous "Initialisation d'une nouvelle instance"

Eugen Mayer
la source
3
+1 @EugenMayer. Toute personne utilisant Compose v1 devrait passer à la dernière syntaxe v3: docs.docker.com/compose/compose-file
Mano Marks
1
V3 n'est pas un successeur de V2, même si c'est un inconvénient. V3 est essentiellement un essaim, c'est plutôt une fourche qu'un successeur. Voir les commentaires de Dockers à ce sujet. L'un des gros problèmes est la possibilité de montage volumr_from manquante
Eugen Mayer
20
Les gars, n'oubliez pas que si vous créez un volume persistant pour le service de base de données, il ne recherchera pas de nouveaux fichiers .sql à moins que vous ne le recréiez. J'ai perdu quelques heures, j'espère que personne d'autre ne vivra la même chose.
Dazag le
1
@DhwanilPatel, vous devez utiliser les options --build --force-receate. docs.docker.com/compose/reference/up Par exemple, docker-compose up --build --force-
receate
@Dazag En fait, j'utilise déjà cette commande: "sudo docker-compose up -d --force-receate --build" mais rien ne se passe
Dhwanil Patel
22

Une autre option si vous ne voulez pas monter un volume, mais voulez vider un fichier de votre machine locale, est de rediriger cat yourdump.sql. Ainsi:

cat dump.sql | docker exec -i mysql-container mysql -uuser -ppassword db_name

Voir: https://gist.github.com/spalladino/6d981f7b33f6e0afe6bb

Excellence Ilesanmi
la source
Fonctionne parfaitement si dump.sqlcontient des sourcefichiers
Chu
11

Importer à l'aide de docker-compose

cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>
Slipstream
la source
J'obtiens une erreur - mysql: [Avertissement] L'utilisation d'un mot de passe sur l'interface de ligne de commande peut ne pas être sécurisée. ERREUR 1064 (42000) à la ligne 1: vous avez une erreur dans votre syntaxe SQL; Vérifiez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de 'mysqldump: [Attention] L'utilisation d'un mot de passe sur l'interface de ligne de commande peut être insec' à la ligne 1 lire unix @ -> / var / run / docker. chaussette: lecture: connexion réinitialisée par le pair
R dim
Veuillez vérifier que cet avertissement n'apparaît pas déjà dans votre fichier dump.sql: Lorsque vous avez produit le fichier en utilisant mysqldump et que vous avez donné le mot de passe sur la ligne de commande, l'avertissement se retrouvera dans le fichier vidé.
Stefan Frank le
5

combinez https://stackoverflow.com/a/51837876/1078784 et répondez à cette question, je pense que la meilleure réponse est:

cat {SQL FILE NAME} | docker exec -i {MYSQL CONTAINER NAME} {MYSQL PATH IN CONTAINER} --init-command="SET autocommit=0;"

par exemple dans mon système, cette commande devrait ressembler à:

cat temp.sql | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

vous pouvez également utiliser pv pour surveiller la progression:

cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

Et le plus important ici est "--init-command" qui accélérera la progression de l'importation 10 fois plus vite.

Matt.Cai
la source
je reçois stdin n'est pas un tty ... s'ennuyer vraiment avec ça, quelle est la solution à ça?
Bram B
Vous ne comprenez pas ce que vous voulez dire, peut-être pouvez-vous me donner plus de détails?
Matt.Cai
4

Je peux importer avec cette commande

docker-compose exec -T mysql mysql -uroot -proot mydatabase < ~/Desktop/mydatabase_2019-10-05.sql
Son Goku
la source
il est difficile de dire ce qui est quoi, mais je le fais de la même manière docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql. De plus, je pense qu'il y a une erreur dans votre déclaration. Il devrait y avoir un espace entre -uet le nom d'utilisateur lui-même.
Gordon Freeman
3

vous pouvez suivre ces étapes simples:

PREMIÈRE FAÇON:

copiez d'abord le fichier de vidage SQL de votre répertoire local vers le conteneur mysql. utiliser la commande docker cp

docker cp [SRC-Local path to sql file] [container-name or container-id]:[DEST-path to copy to]

docker cp ./data.sql mysql-container:/home

puis exécutez le conteneur mysql en utilisant (REMARQUE: si vous utilisez la version alpine, vous devez remplacer bash par sh dans la commande ci-dessous.)

docker exec -it -u root mysql-container bash

puis vous pouvez simplement importer ce fichier de vidage SQL.

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

DEUXIÈME MANIÈRE: SIMPLE

docker cp ./data.sql mysql-container:/docker-entrypoint-initdb.d/

Comme mentionné dans la page officielle du hub mysql Docker.

Chaque fois qu'un conteneur démarre pour la première fois, une nouvelle base de données est créée avec le nom spécifié dans la variable MYSQL_DATABASE - que vous pouvez transmettre en configurant la variable d'environnement voir ici comment définir les variables d'environnement

Par défaut, le conteneur exécutera les fichiers avec les extensions .sh, .sql et .sql.gz qui se trouvent dans le dossier /docker-entrypoint-initdb.d. Les fichiers seront exécutés par ordre alphabétique. de cette façon, vos fichiers SQL seront importés par défaut dans la base de données spécifiée par la variable MYSQL_DATABASE.

pour plus de détails, vous pouvez toujours visiter la page officielle

Thakur Amit
la source
1

Vous pouvez exécuter un conteneur définissant un répertoire partagé (-v volume), puis exécuter bash dans ce conteneur. Après cela, vous pouvez utiliser de manière interactive mysql-client pour exécuter le fichier .sql, depuis l'intérieur du conteneur. obs: / my-host-dir / shared-dir est l'emplacement .sql dans le système hôte.

docker run --detach --name=test-mysql -p host-port:container-port  --env="MYSQL_ROOT_PASSWORD=my-root-pswd" -v /my-host-dir/shared-dir:/container-dir mysql:latest


docker exec -it test-mysql bash

À l'intérieur du conteneur ...

mysql -p < /container-dir/file.sql 

Paramètres personnalisés:

  • test-mysql (nom du conteneur)
  • port-hôte et port - conteneur
  • my-root-pswd (mot de passe root mysql)
  • / my-host-dir / shared-dir et / container-dir (le répertoire hôte qui sera monté dans le conteneur et l'emplacement du conteneur du répertoire partagé)
Caleb Santos
la source
0

Celui-ci fonctionne pour moi

$ docker exec -i NAME_CONTAINER_MYSQL mysql -u DB_USER -pPASSWORD DATABASE < /path/to/your/file.sql

Tout d'abord, si vous voulez savoir ce qu'est le NAME_CONTAINER_MYSQL, vous devez utiliser cette commande ci-dessous:

$ docker ps

Dans la colonne de sortie NAME, vous verrez le NAME_CONTAINER_MYSQL que vous devez remplacer dans la commande ci-dessus.

Irwuin
la source
0

Essayer "docker exec ... < data.sql"dans les réponses Windows PowerShell avec:

L'opérateur '<' est réservé pour une utilisation future.

Mais on peut conclure avec cmd /cpour éliminer le problème:

cmd /c "docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql"
Denys Gorobchenko
la source
-2

vous pouvez copier le fichier d'exportation pour, par exemple, dump.sql à l'aide de docker cp dans le conteneur, puis importer la base de données. si vous avez besoin d'instructions complètes, faites-le moi savoir et je vous fournirai

Jarjob
la source