Importar data.sql MySQL Docker Container

87

Se eu tiver um data.sql, como posso importar o banco de dados para o meu container docker mysql? Como posso importar dados de banco de dados. Em um mundo encaixado, isso adiciona uma camada de complexidade. alguns métodos, por favor.

Aqui meu 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
fonte
Copie o arquivo SQL para o contêiner e carregue o infile de dados.
Jay Blanchard

Respostas:

58

Não consigo fazer isso funcionar com o mysql ou mysql mais recente: 5.7. Então, eu uso o mariaDB. Aqui está meu docker-compose.yamlcódigo.

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
fonte
Quando tento usar esse método, acabo com um diretório para dump.sql? Alguma ideia do porquê? Ex: bash into mariadb container &: cd /docker-entrypoint-initdb.d/dump.sql/& então estou em um diretório? O que faria com que um diretório fosse criado em vez de não ter o arquivo .sql lá ou gerar algum tipo de erro? meu docker-compose.yml relevante para o contêiner 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

Você pode importar o banco de dados depois:

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

Lauri
fonte
23
Se estiver usando estivador-compor, você tem que ter o recipiente por: docker exec -i $(docker-compose ps -q mysql-container) mysql …. Ele não suporta a leitura de stdin no momento, conforme descrito aqui .
slhck de
2
como fazer isso no docker-compose?
iamjc015
7
Eu sou. recebendo o erro "o dispositivo de entrada não é um TTY"
kamal
FYI: use -psem senha para fins de segurança.
Abdulla Nilam
2
@kamal você usou a -topção para docker exec? Juse use -ipara evitar o erro
Wolfgang
83

Monte seu sql-dump /docker-entrypoint-initdb.d/yourdump.sqlusando uma montagem 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

Isso acionará uma importação do sql-dump durante o início do contêiner, consulte https://hub.docker.com/_/mysql/ em "Inicializando uma nova instância"

Eugen Mayer
fonte
3
+1 @EugenMayer. Definitivamente, qualquer pessoa que use o Compose v1 deve mudar para a sintaxe v3 mais recente: docs.docker.com/compose/compose-file
Mano Marks
1
O V3 não é um sucessor do V2, mesmo que isso seja inconveniente. O V3 é basicamente um enxame, é mais um fork do que um sucessor. Veja os comentários do Dockers sobre isso. Um dos grandes problemas é a possibilidade de montagem volumr_from ausente
Eugen Mayer
20
Pessoal, lembrem-se que se você criar um volume persistente para o serviço de banco de dados, ele não irá verificar se há novos arquivos .sql a menos que você os recrie. Perdi algumas horas com isso, espero que ninguém mais passe pelo mesmo.
Dazag
1
@DhwanilPatel você deve usar as opções --build --force-recreate. docs.docker.com/compose/reference/up Por exemplo docker-compose up --build --force-recreate
Dazag
@Dazag Na verdade eu já uso este comando: "sudo docker-compose up -d --force-recriar --build" mas nada acontece
Dhwanil Patel
22

Outra opção se você não quiser montar um volume, mas quiser despejar um arquivo de sua máquina local, é canalizar cat yourdump.sql. Igual a:

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

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

Excelência Ilesanmi
fonte
Funciona perfeitamente se dump.sqlcontiver sourcearquivos
Chu
11

Importar usando docker-compose

cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>
Slipstream
fonte
Estou recebendo um erro - mysql: [Aviso] Usar uma senha na interface da linha de comando pode ser inseguro. ERROR 1064 (42000) na linha 1: você tem um erro na sintaxe SQL; verifique o manual que corresponde à versão do seu servidor MySQL para a sintaxe correta a ser usada perto de 'mysqldump: [Aviso] Usar uma senha na interface da linha de comando pode ser insegura' na linha 1 leia unix @ -> / var / run / docker. sock: ler: conexão redefinida pelo par
R Dom
Por favor, verifique se este aviso ainda não aparece em seu dump.sql: Quando você produziu o arquivo usando mysqldump e forneceu a senha na linha de comando, o aviso acabará no arquivo despejado.
Stefan Frank,
5

combine https://stackoverflow.com/a/51837876/1078784 e as respostas a esta pergunta, acho que a melhor resposta é:

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

por exemplo, em meu sistema, este comando deve ser semelhante a:

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

também você pode usar pv para monitorar o progresso:

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

E o mais importante aqui é o "--init-command" que irá acelerar o progresso da importação 10 vezes mais rápido.

Matt.Cai
fonte
eu entendo que o stdin não é um tty ... ficando realmente entediado com isso, qual é a solução para isso?
Bram B
Não entendi o que você quis dizer, talvez você possa me dar mais detalhes?
Matt.Cai
4

Posso importar com este comando

docker-compose exec -T mysql mysql -uroot -proot mydatabase < ~/Desktop/mydatabase_2019-10-05.sql
Filho Goku
fonte
é difícil dizer o que é o quê, mas estou fazendo da mesma maneira docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql. Além disso, acho que há um erro na sua declaração. Deve haver um espaço entre -ue o próprio nome de usuário.
Gordon Freeman
3

você pode seguir estas etapas simples:

PRIMEIRA MANEIRA:

primeiro copie o arquivo de despejo SQL de seu diretório local para o contêiner mysql. usar o comando 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

e então execute o mysql-container usando (NOTA: caso você esteja usando a versão alpina, você precisa substituir bash por sh no comando fornecido abaixo.)

docker exec -it -u root mysql-container bash

e então você pode simplesmente importar este arquivo de despejo SQL.

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

SEGUNDA MANEIRA: SIMPLES

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

Conforme mencionado na página oficial do hub mysql Docker.

Sempre que um contêiner é iniciado pela primeira vez, um novo banco de dados é criado com o nome especificado na variável MYSQL_DATABASE - que você pode passar configurando a variável de ambiente veja aqui como definir as variáveis ​​de ambiente

Por padrão, o contêiner executará arquivos com extensões .sh, .sql e .sql.gz que são encontrados na pasta /docker-entrypoint-initdb.d. Os arquivos serão executados em ordem alfabética. desta forma, seus arquivos SQL serão importados por padrão para o banco de dados especificado pela variável MYSQL_DATABASE.

para mais detalhes você pode sempre visitar a página oficial

Thakur Amit
fonte
1

Você pode executar um contêiner configurando um diretório compartilhado (volume -v) e, em seguida, executar o bash nesse contêiner. Depois disso, você pode usar interativamente o mysql-client para executar o arquivo .sql, de dentro do contêiner. obs: / my-host-dir / shared-dir é o local .sql no sistema host.

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

Dentro do contêiner ...

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

Parâmetros personalizados:

  • test-mysql (nome do contêiner)
  • hospedeiro-porta e recipiente-porta
  • my-root-pswd (senha de root do mysql)
  • / my-host-dir / shared-dir e / container-dir (o diretório do host que será montado no contêiner e a localização do contêiner do diretório compartilhado)
Caleb santos
fonte
0

Este funciona para mim

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

Primeiramente, se você deseja saber o que é NAME_CONTAINER_MYSQL, deve usar este comando abaixo:

$ docker ps

Na coluna de saída NAME, você verá o NAME_CONTAINER_MYSQL que precisa ser substituído no comando acima.

Irwuin
fonte
0

Tentando "docker exec ... < data.sql"nas respostas do Windows PowerShell com:

O operador '<' é reservado para uso futuro.

Mas pode-se resolver cmd /cpara eliminar o problema:

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

você pode copiar o arquivo de exportação para, por exemplo, dump.sql usando docker cp para o contêiner e, em seguida, importar o banco de dados. se precisar de instruções completas, me avise e eu irei fornecer

Jarjob
fonte