Імпортуйте data.sql контейнер MySQL Docker


87

Якщо у мене є файл data.sql, як я можу імпортувати базу даних до мого контейнера докера mysql? Як я можу імпортувати дані бази даних. У докерному світі це додає шару складності. деякі методи, будь ласка.

Ось мій 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 у контейнер, а потім завантажте дані у файл.
Джей Бланшард,

Відповіді:


59

Здається, я не можу зробити цю роботу з останньою версією 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 …. На даний момент він не підтримує читання зі stdin, як описано тут .
slhck

2
як це зробити на docker-compose?
iamjc015,

7
Я є. отримую помилку «пристрій вводити не TTY»
Kamal

FYI: використання -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 під час запуску контейнера, див. Https://hub.docker.com/_/mysql/ у розділі "Ініціалізація нового екземпляра"


3
+1 @EugenMayer. Безумовно, кожному, хто використовує Compose v1, слід перейти до останнього синтаксису v3: docs.docker.com/compose/compose-file
Mano Marks

1
V3 не є наступником V2, навіть якщо це незручність. V3 в основному є лише роєм, це скоріше форк, ніж наступник. Дивіться коментарі Dockers щодо цього. Однією з величезних проблем є відсутність volumr_from можливості підключення
Eugen Mayer

20
Хлопці, пам’ятайте, що якщо ви створите постійний том для служби баз даних, він не буде перевіряти наявність нових файлів .sql, якщо ви не створите його повторно. Втративши кілька годин до цього, сподіваюся, ніхто інший не пройде через те саме.
Дазаг,

1
@DhwanilPatel ви повинні використовувати параметри --build --force-recreate. docs.docker.com/compose/reference/up Наприклад, docker -compose up --build --force-recreate
Dazag

@Dazag Насправді я вже використовую цю команду: "sudo docker-compose up -d --force-recreate --build", але нічого не трапилось
Dhwanil Patel

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: [Попередження] Використання пароля в інтерфейсі командного рядка може бути insec' у рядку 1 читайте unix @ -> / var / run / docker. носок: прочитано: скидання з'єднання з боку однолітка
R

pls переконайтесь, що це попередження ще не відображається у вашому 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 - це не дрібниця ... нудно мені це нудно, яке рішення в цьому?
Bram B

Не розумієте, що ви маєте на увазі, можливо, ви можете дати мені більше деталей?
Matt.Cai

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-контейнер, використовуючи (ПРИМІТКА: якщо ви використовуєте альпійську версію, вам потрібно замінити 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.

Щоразу, коли контейнер запускається вперше, створюється нова база даних із зазначеним іменем у змінній MYSQL_DATABASE - яку ви можете передати, встановивши змінну середовища. Дивіться тут, як встановити змінні середовища

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

для отримання детальної інформації ви завжди можете відвідати офіційну сторінку


1

Ви можете запустити контейнер, встановивши спільний каталог (-v том), а потім запустити bash у цьому контейнері. Після цього ви можете інтерактивно використовувати mysql-клієнт для запуску файлу .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 (пароль пароля 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"відповідей Window 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.