Importieren Sie data.sql MySQL Docker Container

85

Wie kann ich eine Datenbank in meinen MySQL-Docker-Container importieren, wenn ich eine data.sql habe? Wie kann ich Datenbankdaten importieren? In einer Docker-Welt erhöht dies die Komplexität. einige Methoden bitte.

Hier meine 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"
Israel Morales
quelle
Kopieren Sie die SQL-Datei in den Container und laden Sie die Dateninfile.
Jay Blanchard

Antworten:

53

Ich kann nicht scheinen, diese Arbeit mit dem neuesten mysql oder mysql: 5.7 zu machen. Also benutze ich stattdessen mariaDB. Hier ist mein 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
quelle
145

Anschließend können Sie die Datenbank importieren:

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

Lauri
quelle
22
Wenn Sie Docker-Compose verwenden, müssen Sie den Container abrufen von : docker exec -i $(docker-compose ps -q mysql-container) mysql …. Das Lesen von stdin wird derzeit nicht unterstützt, wie hier beschrieben .
Slhck
2
Wie mache ich das bei Docker-Compose?
iamjc015
5
Ich bin. Fehler "Das Eingabegerät ist kein TTY"
Kamal
Zu Ihrer Information: Verwenden Sie -paus Sicherheitsgründen ohne Passwort.
Abdulla Nilam
1
@kamal hast du die -tOption für verwendet docker exec? Juse verwenden -i, um den Fehler zu vermeiden
Wolfgang
81

Mounten Sie Ihren SQL-Dump unter /docker-entrypoint-initdb.d/yourdump.sqlVerwendung eines Volume-Mount

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

Dies löst beim Start des Containers einen Import des SQL-Dumps aus (siehe https://hub.docker.com/_/mysql/ unter "Initialisieren einer neuen Instanz").

Eugen Mayer
quelle
3
+1 @EugenMayer. Auf jeden Fall sollte jeder, der Compose v1 verwendet, zur neuesten v3-Syntax wechseln
Mano Marks
1
V3 ist kein Nachfolger von V2, auch wenn dies unpraktisch ist. V3 ist im Grunde nur ein Schwarm, es ist eher eine Gabel als ein Nachfolger. Siehe Dockers Kommentare dazu. Eines der großen Probleme ist die fehlende Möglichkeit von volumr_from mount
Eugen Mayer
20
Leute, denkt daran, dass beim Erstellen eines dauerhaften Volumes für den Datenbankdienst nur dann nach neuen SQL-Dateien gesucht wird, wenn Sie es neu erstellen. Ich hoffe, dass niemand anderes das Gleiche durchmacht.
Dazag
1
@DhwanilPatel Sie müssen die Optionen --build --force-recreate verwenden. docs.docker.com/compose/reference/up ZB Docker-Compose Up
Build
@Dazag Eigentlich benutze ich bereits diesen Befehl: "sudo docker-compose up -d --force-recreate --build", aber nichts passiert
Dhwanil Patel
22

Eine andere Option, wenn Sie kein Volume bereitstellen möchten, aber eine Datei von Ihrem lokalen Computer sichern möchten, ist das Weiterleiten cat yourdump.sql. Wie so:

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

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

Exzellenz Ilesanmi
quelle
Funktioniert perfekt, wenn es Dateien dump.sqlenthältsource
Chu
11

Importieren Sie mit Docker-Compose

cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>
Windschatten
quelle
Ich erhalte eine Fehlermeldung - mysql: [Warnung] Die Verwendung eines Kennworts auf der Befehlszeilenschnittstelle kann unsicher sein. FEHLER 1064 (42000) in Zeile 1: Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax in der Nähe von 'mysqldump: [Warnung] Die Verwendung eines Kennworts auf der Befehlszeilenschnittstelle kann unsicher sein' in Zeile 1 lesen Sie unix @ -> / var / run / docker. Socke: Lesen: Verbindung von Peer zurückgesetzt
R So
Bitte überprüfen Sie, ob diese Warnung noch nicht in Ihrer dump.sql angezeigt wird: Wenn Sie die Datei mit mysqldump erstellt und das Kennwort in der Befehlszeile angegeben haben, wird die Warnung in der ausgegebenen Datei gespeichert.
Stefan Frank
5

Kombinieren Sie https://stackoverflow.com/a/51837876/1078784 und Antworten in dieser Frage. Ich denke, die beste Antwort ist:

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

In meinem System sollte dieser Befehl beispielsweise folgendermaßen aussehen:

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

Sie können auch pv verwenden , um den Fortschritt zu überwachen:

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

Und das Wichtigste hier ist "--init-command", der den Importvorgang zehnmal schneller beschleunigt.

Matt.Cai
quelle
Ich bekomme stdin ist kein tty ... sich wirklich langweilen, was ist die Lösung dafür?
Bram B
Verstehst du nicht was du meinst, vielleicht kannst du mir mehr Details geben?
Matt.Cai
3

Ich kann mit diesem Befehl importieren

docker-compose exec -T mysql mysql -uroot -proot mydatabase < ~/Desktop/mydatabase_2019-10-05.sql
Son Goku
quelle
Es ist schwer zu sagen, was was ist, aber ich mache es genauso docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql. Außerdem denke ich, dass Ihre Aussage einen Fehler enthält. Zwischen -uund dem Benutzernamen selbst sollte ein Leerzeichen stehen .
Gordon Freeman
3

Sie können diese einfachen Schritte ausführen:

ERSTER WEG:

Kopieren Sie zuerst die SQL-Dump-Datei aus Ihrem lokalen Verzeichnis in den MySQL-Container. Verwenden Sie den Docker-Befehl 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

und führen Sie dann den MySQL-Container mit aus (HINWEIS: Wenn Sie eine alpine Version verwenden, müssen Sie bash im folgenden Befehl durch sh ersetzen.)

docker exec -it -u root mysql-container bash

und dann können Sie einfach diese SQL-Dump-Datei importieren.

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

ZWEITER WEG: EINFACH

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

Wie auf der offiziellen Seite des MySQL Docker Hub erwähnt.

Wenn ein Container zum ersten Mal gestartet wird, wird eine neue Datenbank mit dem angegebenen Namen in der Variablen MYSQL_DATABASE erstellt. Diese können Sie durch Einrichten der Umgebungsvariablen übergeben. Informationen zum Festlegen von Umgebungsvariablen finden Sie hier

Standardmäßig führt der Container Dateien mit den Erweiterungen .sh, .sql und .sql.gz aus, die sich im Ordner /docker-entrypoint-initdb.d befinden. Dateien werden in alphabetischer Reihenfolge ausgeführt. Auf diese Weise werden Ihre SQL-Dateien standardmäßig in die von der Variablen MYSQL_DATABASE angegebene Datenbank importiert.

Für weitere Informationen können Sie jederzeit die offizielle Seite besuchen

Thakur Amit
quelle
1

Sie können einen Container ausführen, der ein freigegebenes Verzeichnis (-v Volume) festlegt, und dann Bash in diesem Container ausführen. Danach können Sie den MySQL-Client interaktiv verwenden, um die SQL-Datei aus dem Container heraus auszuführen. obs: / my-host-dir / shared-dir ist der SQL-Speicherort im Host-System.

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

Im Container ...

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

Benutzerdefinierte Parameter:

  • test-mysql (Containername)
  • Host-Port und Container-Port
  • my-root-pswd ( MySQL-Root- Passwort)
  • / my-host-dir / shared-dir und / container-dir (das Host-Verzeichnis, das im Container bereitgestellt wird, und der Container-Speicherort des gemeinsam genutzten Verzeichnisses)
Caleb Santos
quelle
0

Dieser arbeitet für mich

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

Wenn Sie wissen möchten, was NAME_CONTAINER_MYSQL ist, sollten Sie zunächst den folgenden Befehl verwenden:

$ docker ps

In der Ausgabespalte NAME sehen Sie NAME_CONTAINER_MYSQL, die Sie im obigen Befehl ersetzen müssen.

Erenss
quelle
-2

Sie können die Exportdatei für z. B. dump.sql mit Docker-CP in den Container kopieren und dann die Datenbank importieren. Wenn Sie vollständige Anweisungen benötigen, lassen Sie es mich wissen und ich werde sie bereitstellen

Jarjob
quelle