Импортировать data.sql контейнер MySQL Docker


87

Если у меня есть data.sql, как я могу импортировать базу данных в мой контейнер докеров mysql? Как я могу импортировать данные из базы данных. В мире dockerized это добавляет уровень сложности. какие методы пожалуйста.

Вот мой 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"

Скопируйте файл SQL в контейнер, затем загрузите файл данных.
Джей Бланшар,

Ответы:


58

Я не могу заставить эту работу работать с последними версиями mysql или mysql: 5.7. Поэтому вместо этого я использую mariaDB. Вот мой docker-compose.yamlкод.

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:

Когда я пытаюсь использовать этот метод, я получаю каталог для dump.sql? Есть идеи, почему? например: bash в контейнер mariadb &: cd /docker-entrypoint-initdb.d/dump.sql/& тогда я нахожусь в каталоге? Что может привести к созданию каталога вместо того, чтобы либо вообще не иметь там файла .sql, либо вызвать какую-то ошибку? мой соответствующий docker-compose.yml для контейнера 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

После этого вы можете импортировать базу данных:

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


23
При использовании Докер-Compose, вы должны получить контейнер с помощью: docker exec -i $(docker-compose ps -q mysql-container) mysql …. В настоящий момент он не поддерживает чтение со стандартного ввода, как описано здесь .
slhck

2
как это сделать в docker-compose?
iamjc015 02

7
Я. получение ошибки «устройство ввода не является телетайпом»
Камал

К вашему сведению: используйте -pбез пароля в целях безопасности.
Абдулла Нилам

2
@kamal вы использовали эту -tопцию docker exec? Джусе используйте, -iчтобы избежать ошибки
Вольфганг

84

Смонтируйте свой sql-дамп /docker-entrypoint-initdb.d/yourdump.sqlс помощью монтирования тома

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

Это вызовет импорт sql-dump во время запуска контейнера, см. Https://hub.docker.com/_/mysql/ в разделе «Инициализация нового экземпляра»


3
+1 @EugenMayer. Определенно любой, кто использует Compose v1, должен перейти на последний синтаксис v3: docs.docker.com/compose/compose-file
Mano Marks

1
V3 не является преемником V2, даже если это неудобно. V3 - это в основном только рой, скорее форк, чем его преемник. См. Комментарии Докера по этому поводу. Одна из огромных проблем - это отсутствие возможности монтирования volumr_from
Ойген Майер

20
Ребята, помните, что если вы создадите постоянный том для службы базы данных, он не будет проверять наличие новых файлов .sql, пока вы не создадите его заново. Потрачено на это несколько часов, надеюсь, никто другой не пройдет через это.
Dazag

1
@DhwanilPatel, вы должны использовать параметры --build --force -create. docs.docker.com/compose/reference/up Например, docker-compose up --build --force -create
Dazag

@Dazag На самом деле я уже использую эту команду: «sudo docker-compose up -d --force -create --build», но ничего не происходит,
Дхванил Патель

22

Другой вариант, если вы не хотите монтировать том, но хотите выгрузить файл с локального компьютера, - это конвейерная передача cat yourdump.sql. Вот так:

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

См. Https://gist.github.com/spalladino/6d981f7b33f6e0afe6bb


Отлично работает, если dump.sqlсодержит sourceфайлы
Чу

11

Импорт с помощью docker-compose

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

Я получаю сообщение об ошибке - mysql: [Предупреждение] Использование пароля в интерфейсе командной строки может быть небезопасным. ОШИБКА 1064 (42000) в строке 1: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'mysqldump: [Предупреждение] Использование пароля в интерфейсе командной строки может быть небезопасным' в строке 1 прочтите unix @ -> / var / run / docker. sock: чтение: сброс соединения одноранговым
R вс

Пожалуйста, убедитесь, что это предупреждение еще не появилось в вашем dump.sql: когда вы создали файл с помощью mysqldump и указали пароль в командной строке, предупреждение появится в выгруженном файле.
Стефан Франк

5

объедините https://stackoverflow.com/a/51837876/1078784 и ответы на этот вопрос, я думаю, что лучший ответ:

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

например, в моей системе эта команда должна выглядеть так:

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

также вы можете использовать pv для отслеживания прогресса:

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

И самое главное здесь - "--init-command", которая ускорит процесс импорта в 10 раз быстрее.


Я получаю, что stdin - это не tty ... мне это очень надоело, каково решение?
Bram B

Не понимаю, что ты имеешь в виду, может ты расскажешь мне подробнее?
Мэтт Кай

4

Я могу импортировать с помощью этой команды

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

трудно сказать, что к чему, но я делаю то же самое docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql. Кроме того, я думаю, что в вашем заявлении есть ошибка. Между -uи самим именем пользователя должен быть пробел .
Гордон Фриман

3

вы можете выполнить следующие простые шаги:

ПЕРВЫЙ ПУТЬ:

сначала скопируйте файл дампа SQL из локального каталога в контейнер mysql. используйте команду 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

а затем выполните mysql-контейнер, используя (ПРИМЕЧАНИЕ: если вы используете версию alpine, вам необходимо заменить bash на sh в приведенной ниже команде.)

docker exec -it -u root mysql-container bash

а затем вы можете просто импортировать этот файл дампа SQL.

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

ВТОРОЙ ПУТЬ: ПРОСТОЙ

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

Как упоминалось на официальной странице mysql Docker Hub.

Каждый раз, когда контейнер запускается в первый раз, создается новая база данных с указанным именем в переменной MYSQL_DATABASE, которую вы можете передать, настроив переменную среды, см. Здесь, как установить переменные среды

По умолчанию контейнер будет выполнять файлы с расширениями .sh, .sql и .sql.gz, которые находятся в папке /docker-entrypoint-initdb.d. Файлы будут выполняться в алфавитном порядке. таким образом ваши файлы SQL будут импортированы по умолчанию в базу данных, указанную переменной MYSQL_DATABASE.

для более подробной информации вы всегда можете посетить официальную страницу


1

Вы можете запустить контейнер, установив общий каталог (-v volume), а затем запустить bash в этом контейнере. После этого вы можете интерактивно использовать mysql-client для выполнения файла .sql изнутри контейнера. obs: / my-host-dir / shared-dir - это расположение .sql в хост-системе.

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

Внутри контейнера ...

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

Специальные параметры:

  • test-mysql (имя контейнера)
  • хост-порт и контейнер-порт
  • my-root-pswd (пароль root mysql)
  • / my-host-dir / shared-dir и / container-dir (каталог хоста, который будет смонтирован в контейнере, и местоположение контейнера общего каталога)

0

Эта работа для меня

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

Во-первых, если вы хотите узнать, что такое NAME_CONTAINER_MYSQL, вы должны использовать следующую команду:

$ docker ps

В выходном столбце NAME вы увидите NAME_CONTAINER_MYSQL, который вам нужно заменить в приведенной выше команде.


0

Попытка получить "docker exec ... < data.sql"ответы Windows PowerShell с помощью:

Оператор «<» зарезервирован для использования в будущем.

Но можно завершить это, cmd /cчтобы устранить проблему:

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

-2

вы можете скопировать файл экспорта, например, dump.sql, используя docker cp, в контейнер, а затем импортировать db. если вам нужны подробные инструкции, дайте мне знать, и я предоставлю

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.