Importuj kontener data.sql MySQL Docker


91

Jeśli mam plik data.sql, jak mogę zaimportować bazę danych do mojego kontenera docker mysql? Jak mogę zaimportować dane z bazy danych. W zdokeryzowanym świecie dodaje to warstwę złożoności. proszę o jakieś metody.

Tutaj mój 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"

Skopiuj plik SQL do kontenera, a następnie załaduj plik danych.
Jay Blanchard

Odpowiedzi:


61

Nie wydaje mi się, aby ta działała z najnowszym mysql lub mysql: 5.7. Więc zamiast tego używam mariaDB. Oto mój docker-compose.yamlkod.

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:

Kiedy próbuję użyć tej metody, otrzymuję katalog na dump.sql? Masz jakiś pomysł, dlaczego? np. wbijanie do kontenera mariadb &: cd /docker-entrypoint-initdb.d/dump.sql/a potem jestem w katalogu? Co spowodowałoby utworzenie katalogu zamiast całkowitego braku pliku .sql lub wyrzucenia jakiegoś błędu? mój odpowiedni docker-compose.yml dla kontenera 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

156

Możesz później zaimportować bazę danych:

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


23
W przypadku korzystania z Docker-komponować, trzeba uzyskać pojemnik przez: docker exec -i $(docker-compose ps -q mysql-container) mysql …. W tej chwili nie obsługuje czytania ze standardowego wejścia, jak opisano tutaj .
slhck

2
jak to zrobić w docker-compose?
iamjc015

7
Jestem. pojawia się błąd „urządzenie wejściowe to nie TTY”
kamal

FYI: używaj -pbez hasła ze względów bezpieczeństwa.
Abdulla Nilam

2
@kamal czy użyłeś tej -topcji dla docker exec? Używaj tylko, -iaby uniknąć błędu
Wolfgang

88

Zamontuj swój sql-dump pod /docker-entrypoint-initdb.d/yourdump.sqlużywając montowania woluminu

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

Spowoduje to importowanie zrzutu sql-dump podczas uruchamiania kontenera, patrz https://hub.docker.com/_/mysql/ w sekcji „Inicjowanie nowej instancji”


3
+1 @EugenMayer. Zdecydowanie każdy, kto używa Compose v1, powinien przejść do najnowszej składni v3: docs.docker.com/compose/compose-file
Mano Marks

1
V3 nie jest następcą V2, nawet jeśli jest to niedogodne. V3 jest w zasadzie tylko rojem, jest raczej widelcem niż następcą. Zobacz komentarze Dockers na ten temat. Jednym z ogromnych problemów jest brak możliwości montażu volumr_from
Eugen Mayer

21
Chłopaki, pamiętajcie, że jeśli utworzysz trwały wolumin dla usługi bazy danych, nie będzie on sprawdzał nowych plików .sql, chyba że go odtworzysz. Straciłem na to kilka godzin, mam nadzieję, że nikt inny nie przeżyje tego samego.
Dazag,

1
@DhwanilPatel musisz użyć opcji --build --force -rereate. docs.docker.com/compose/reference/up Np. docker -compose up --build --force
-reate

@Dazag Właściwie już używam tego polecenia: "sudo docker-compose up -d --force -rereate --build", ale nic się nie dzieje
Dhwanil Patel


11

Importuj przy użyciu docker-compose

cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>

Otrzymuję błąd - mysql: [Ostrzeżenie] Używanie hasła w interfejsie wiersza poleceń może być niebezpieczne. BŁĄD 1064 (42000) w wierszu 1: Wystąpił błąd w składni SQL; sprawdź podręcznik, który odpowiada Twojej wersji serwera MySQL, aby uzyskać właściwą składnię, której należy użyć w pobliżu 'mysqldump: [Ostrzeżenie] Używanie hasła w interfejsie wiersza poleceń może być insec' w linii 1 przeczytaj unix @ -> / var / run / docker. sock: read: reset połączenia przez peera
R Sun

pls sprawdź, czy to ostrzeżenie nie pojawia się już w twoim dump.sql: Kiedy utworzyłeś plik używając mysqldump i podałeś hasło w wierszu poleceń, ostrzeżenie trafi do zrzuconego pliku.
Stefan Frank

6

Mogę importować za pomocą tego polecenia

docker-compose exec -T mysql mysql -uroot -proot mydatabase < ~/Desktop/mydatabase_2019-10-05.sql

trudno powiedzieć, co jest czym, ale robię to w ten sam sposób docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql. Poza tym myślę, że w twoim oświadczeniu jest błąd. Pomiędzy -unazwą użytkownika a samą nazwą użytkownika powinna znajdować się spacja .
Gordon Freeman

5

połącz https://stackoverflow.com/a/51837876/1078784 i odpowiedzi w tym pytaniu, myślę, że najlepszą odpowiedzią jest:

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

na przykład w moim systemie polecenie to powinno wyglądać następująco:

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

możesz również użyć pv do monitorowania postępów:

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

Najważniejszą rzeczą jest "--init-command", która przyspieszy import 10 razy.


dostaję stdin to nie tty ... naprawdę się tym nudzę, jakie jest rozwiązanie tego problemu?
Bram B

Nie rozumiem, co masz na myśli, może możesz podać mi więcej szczegółów?
Matt Cai

3

możesz wykonać te proste kroki:

PIERWSZY SPOSÓB:

najpierw skopiuj plik zrzutu SQL z katalogu lokalnego do kontenera mysql. użyj polecenia 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

a następnie uruchom kontener mysql za pomocą (UWAGA: w przypadku korzystania z wersji alpine musisz zastąpić bash sh w podanym poniżej poleceniu).

docker exec -it -u root mysql-container bash

a następnie możesz po prostu zaimportować ten plik zrzutu SQL.

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

DRUGI SPOSÓB: PROSTY

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

Jak wspomniano na oficjalnej stronie mysql Docker hub.

Za każdym razem, gdy kontener jest uruchamiany po raz pierwszy, tworzona jest nowa baza danych o określonej nazwie w zmiennej MYSQL_DATABASE - którą można przekazać, konfigurując zmienną środowiskową. Zobacz tutaj, jak ustawić zmienne środowiskowe

Domyślnie kontener będzie wykonywać pliki z rozszerzeniami .sh, .sql i .sql.gz, które znajdują się w folderze /docker-entrypoint-initdb.d. Pliki zostaną wykonane w kolejności alfabetycznej. w ten sposób Twoje pliki SQL zostaną domyślnie zaimportowane do bazy danych określonej przez zmienną MYSQL_DATABASE.

aby uzyskać więcej informacji, zawsze możesz odwiedzić oficjalną stronę


2

Próbowanie "docker exec ... < data.sql"odpowiedzi programu Window PowerShell z:

Operator „<” jest zarezerwowany do użytku w przyszłości.

Ale można to zakończyć, cmd /caby wyeliminować problem:

cmd /c "docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql"

1

Możesz uruchomić kontener, ustawiając katalog współdzielony (-v wolumin), a następnie uruchomić bash w tym kontenerze. Następnie możesz interaktywnie użyć klienta mysql do wykonania pliku .sql z wnętrza kontenera. obs: / my-host-dir / shared-dir to lokalizacja .sql w systemie hosta.

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

Wewnątrz pojemnika ...

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

Parametry niestandardowe:

  • test-mysql (nazwa kontenera)
  • port-hosta i port - kontenera
  • my-root-pswd (hasło root mysql)
  • / my-host-dir / shared-dir i / container-dir (katalog hosta, który zostanie zamontowany w kontenerze, oraz lokalizacja kontenera udostępnionego katalogu)

1

Ten działa dla mnie

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

Po pierwsze, jeśli chcesz wiedzieć, co to jest NAME_CONTAINER_MYSQL, powinieneś użyć poniższego polecenia:

$ docker ps

W kolumnie wyjściowej NAZWA zobaczysz NAZWĘ_KONTAINER_MYSQL, którą należy zastąpić w powyższym poleceniu.


0

zrób docker cp file.sql <CONTAINER NAME>:/file.sqlpierwszy

następnie docker exec -i <CONTAINER NAME> mysql -u user -p

następnie wewnątrz kontenera mysql wykonaj source \file.sql


-2

możesz skopiować plik eksportu np. dump.sql za pomocą docker cp do kontenera, a następnie zaimportować plik db. jeśli potrzebujesz pełnych instrukcji, daj mi znać, a ja udzielę

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.