data.sql MySQL Docker 컨테이너 가져 오기


87

data.sql이있는 경우 mysql Docker 컨테이너로 데이터베이스를 가져 오려면 어떻게해야합니까? 데이터베이스 데이터를 가져 오는 방법. 고정 된 세계에서 이것은 복잡성의 층을 추가합니다. 몇 가지 방법을 부탁드립니다.

여기 내 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 파일을 컨테이너에 복사 한 다음 데이터를 파일에로드합니다.
Jay Blanchard

답변:


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 into mariadb container & : cd /docker-entrypoint-initdb.d/dump.sql/& then I 'm in a directory? .sql 파일이 전혀 없거나 어떤 종류의 오류가 발생하는 대신 디렉토리가 생성되는 원인은 무엇입니까? mariadb 컨테이너에 대한 내 관련 docker-compose.yml :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
docker-compose를 사용하는 경우 다음 방법으로 컨테이너를 가져와야 docker exec -i $(docker-compose ps -q mysql-container) mysql …합니다.. 여기에 설명 된대로 현재 stdin에서 읽기를 지원하지 않습니다 .
slhck

2
docker-compose에서 이것을 수행하는 방법?
iamjc015

7
나는. "입력 장치가 TTY가 아닙니다"오류가 발생했습니다.
kamal

참고 :-p 보안을 위해 비밀번호없이 사용 합니다.
압둘라 Nilam

2
@kamal에 대한 -t옵션을 사용 docker exec했습니까? Juse -i는 오류를 피하기 위해 사용
Wolfgang

83

/docker-entrypoint-initdb.d/yourdump.sql볼륨 마운트를 사용 하여 sql-dump를 마운트하십시오.

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는 기본적으로 떼일 뿐이며, 차라리 후계자입니다. 이에 대한 Dockers 의견을 참조하십시오. 큰 문제 중 하나는 마운트 가능성에서 volumr_from 누락입니다
Eugen Mayer

20
여러분, 데이터베이스 서비스에 대한 영구 볼륨을 만들면 다시 만들지 않는 한 새 .sql 파일을 확인하지 않습니다. 이것에 몇 시간을 잃었으므로 다른 사람이 똑같은 일을 겪지 않기를 바랍니다.
Dazag

1
@DhwanilPatel --build --force-recreate 옵션을 사용해야합니다. docs.docker.com/compose/reference/up 예 위로 고정 표시기-구성 --build --force-재 작성
Dazag

"sudo는 최대 고정 표시기-구성 -d --force-재 작성 --build"하지만 아무것도 일어나지 : @Dazag 사실 난 이미이 명령을 사용
Dhwanil 파텔을

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
Chu

11

docker-compose를 사용하여 가져 오기

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

오류가 발생합니다. mysql : [경고] 명령 줄 인터페이스에서 암호를 사용하는 것은 안전하지 않을 수 있습니다. 1 행의 오류 1064 (42000) : SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서에서 'mysqldump : [경고] 명령 줄 인터페이스에서 암호를 사용하는 것은 insec가 될 수 있습니다'근처에서 사용할 수 있는지 확인하십시오. unix @-> / var / run / docker를 읽으십시오. 양말 : 읽기 : 피어에 의한 연결 재설정
R Sun

pls는이 경고가 아직 dump.sql에 나타나지 않는지 확인합니다. mysqldump를 사용하여 파일을 생성하고 명령 줄에 암호를 입력하면 경고가 덤프 된 파일에 표시됩니다.
Stefan Frank

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

무슨 뜻인지 이해가 안 돼요. 좀 더 자세히 설명 해주시 겠어요?
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와 사용자 이름 사이에 공백이 있어야 합니다.
Gordon Freeman 19

3

다음과 같은 간단한 단계를 따를 수 있습니다.

첫 번째 방법 :

먼저 로컬 디렉터리에서 mysql 컨테이너로 SQL 덤프 파일을 복사합니다. 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-container를 실행합니다 (참고 : 알파인 버전을 사용하는 경우 아래 명령에서 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 변수에 지정된 이름으로 새 데이터베이스가 생성됩니다. 환경 변수를 설정하여 전달할 수 있습니다. 여기 에서 환경 변수 를 설정하는 방법을 참조하십시오.

기본적으로 컨테이너는 /docker-entrypoint-initdb.d 폴더에있는 확장자가 .sh, .sql 및 .sql.gz 인 파일을 실행합니다. 파일은 알파벳 순서로 실행됩니다. 이렇게하면 SQL 파일이 기본적으로 MYSQL_DATABASE 변수로 지정된 데이터베이스로 가져옵니다.

자세한 내용은 언제든지 공식 페이지를 방문 하세요.


1

공유 디렉터리 (-v 볼륨)를 설정하는 컨테이너를 실행 한 다음 해당 컨테이너에서 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 (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

docker cp를 사용하여 dump.sql에 대한 내보내기 파일을 컨테이너에 복사 한 다음 db를 가져올 수 있습니다. 전체 지침이 필요한 경우 알려 주시면

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.