Nhập data.sql MySQL Docker Container


87

Nếu tôi có data.sql, làm cách nào để tôi có thể nhập cơ sở dữ liệu vào vùng chứa docker mysql của mình? Làm cách nào để tôi có thể nhập dữ liệu cơ sở dữ liệu. Trong một thế giới dày đặc, điều này làm tăng thêm một lớp phức tạp. xin vui lòng một số phương pháp.

Đây là docker-compo.yml của tôi:

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"

Sao chép tệp SQL vào vùng chứa sau đó tải tệp dữ liệu vào.
Jay Blanchard

Câu trả lời:


58

Tôi dường như không thể làm cho điều này hoạt động với mysql hoặc mysql mới nhất: 5.7. Vì vậy, tôi sử dụng mariaDB thay thế. Đây là docker-compose.yamlmã của tôi .

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:

Khi tôi cố gắng sử dụng phương pháp này, tôi kết thúc với một thư mục cho dump.sql? Bất kỳ ý tưởng về lý do tại sao? ví dụ: bash vào mariadb container &: cd /docker-entrypoint-initdb.d/dump.sql/& sau đó tôi đang ở trong một thư mục? Điều gì sẽ khiến một thư mục được tạo thay vì không có tệp .sql ở đó hoặc gây ra một số loại lỗi? docker-compo.yml liên quan của tôi cho vùng chứa 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

Bạn có thể nhập cơ sở dữ liệu sau đó:

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


23
Nếu sử dụng Docker-soạn, bạn có để có được container theo: docker exec -i $(docker-compose ps -q mysql-container) mysql …. Nó không hỗ trợ đọc từ stdin vào lúc này, như được mô tả ở đây .
slhck

2
làm thế nào để thực hiện điều này trên docker-soạn?
iamjc015

7
Tôi là. gặp lỗi "thiết bị đầu vào không phải là TTY"
kamal

FYI: sử dụng -pmà không cần mật khẩu cho mục đích bảo mật.
Abdulla Nilam

2
@kamal bạn đã sử dụng -ttùy chọn cho docker exec? JUSE sử dụng -iđể tránh những lỗi
Wolfgang

83

Gắn kết sql-dump của bạn dưới /docker-entrypoint-initdb.d/yourdump.sqlbằng cách sử dụng giá treo âm lượng

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

Điều này sẽ kích hoạt quá trình nhập sql-dump trong khi bắt đầu vùng chứa, xem https://hub.docker.com/_/mysql/ trong "Khởi tạo phiên bản mới"


3
+1 @EugenMayer. Chắc chắn bất kỳ ai sử dụng Soạn thư v1 nên chuyển sang cú pháp v3 mới nhất: docs.docker.com/compose/compose-file
Mano Marks

1
V3 không phải là phiên bản kế nhiệm của V2, ngay cả khi đó là sự bất tiện. V3 về cơ bản chỉ là một bầy đàn, nó đúng hơn là một ngã ba sau đó là một người kế nhiệm. Xem nhận xét của Dockers về điều này. Một trong những vấn đề lớn là volumr_from thiếu gắn kết khả năng
Eugen Mayer

20
Các bạn, hãy nhớ rằng nếu bạn tạo một ổ đĩa liên tục cho dịch vụ cơ sở dữ liệu, nó sẽ không kiểm tra các tệp .sql mới trừ khi bạn tạo lại nó. Mất vài giờ cho điều này, tôi hy vọng không ai khác trải qua như vậy.
Dazag

1
@DhwanilPatel bạn phải sử dụng các tùy chọn --build --force-recreate. docs.docker.com/compose/reference/up Ví dụ: docker-compile up --build --force-recreate
Dazag

@Dazag Trên thực tế, tôi đã sử dụng lệnh này: "sudo docker-compos up -d --force-recreate --build" nhưng không có gì xảy ra
Dhwanil Patel


11

Nhập bằng docker-soạn

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

Tôi đang gặp lỗi - mysql: [Cảnh báo] Sử dụng mật khẩu trên giao diện dòng lệnh có thể không an toàn. LỖI 1064 (42000) ở dòng 1: Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn sử dụng tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp phù hợp để sử dụng gần 'mysqldump: [Cảnh báo] Sử dụng mật khẩu trên giao diện dòng lệnh có thể không an toàn' tại dòng 1 đọc unix @ -> / var / run / docker. sock: đọc: kết nối được thiết lập lại bởi ngang hàng
R Chủ nhật

Vui lòng kiểm tra, cảnh báo này chưa xuất hiện trong dump.sql của bạn: Khi bạn tạo tệp bằng mysqldump và cung cấp mật khẩu trên dòng lệnh, cảnh báo sẽ kết thúc trong tệp được kết xuất.
Stefan Frank

5

kết hợp https://stackoverflow.com/a/51837876/1078784 và câu trả lời trong câu hỏi này, tôi nghĩ câu trả lời tốt nhất là:

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

ví dụ trong hệ thống của tôi, lệnh này sẽ giống như sau:

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

bạn cũng có thể sử dụng pv để thay đổi tiến trình:

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

Và điều quan trọng nhất ở đây là "--init-command" sẽ thúc đẩy tiến độ nhập nhanh gấp 10 lần.


Tôi nhận được stdin không phải là một tty ... thực sự chán với điều này, giải pháp cho điều này là gì?
Bram B

Không hiểu ý của bạn, có thể bạn có thể cho tôi biết thêm chi tiết?
Matt.Cai

4

Tôi có thể nhập bằng lệnh này

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

thật khó để phân biệt đâu là gì, nhưng tôi đang làm theo cách tương tự docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql. Bên cạnh đó tôi nghĩ rằng có một lỗi trong tuyên bố của bạn. Phải có một khoảng cách giữa -uvà tên người dùng chính nó.
Gordon Freeman

3

bạn có thể làm theo các bước đơn giản sau:

CÁCH ĐẦU TIÊN:

trước tiên sao chép tệp kết xuất SQL từ thư mục cục bộ của bạn vào vùng chứa mysql. sử dụng lệnh 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

và sau đó thực thi mysql-container bằng cách sử dụng (LƯU Ý: trong trường hợp bạn đang sử dụng phiên bản núi cao, bạn cần thay bash bằng sh trong lệnh dưới đây.)

docker exec -it -u root mysql-container bash

và sau đó bạn có thể chỉ cần nhập tệp kết xuất SQL này.

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

CÁCH THỨ HAI: ĐƠN GIẢN

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

Như đã đề cập trong trang chính thức của trung tâm mysql Docker.

Bất cứ khi nào một vùng chứa khởi động lần đầu tiên, một cơ sở dữ liệu mới được tạo với tên được chỉ định trong biến MYSQL_DATABASE - bạn có thể chuyển nó bằng cách thiết lập biến môi trường, hãy xem tại đây cách đặt biến môi trường

Theo mặc định vùng chứa sẽ thực thi các tệp có phần mở rộng .sh, .sql và .sql.gz được tìm thấy trong thư mục /docker-entrypoint-initdb.d. Các tệp sẽ được thực thi theo thứ tự bảng chữ cái. theo cách này, các tệp SQL của bạn sẽ được nhập theo mặc định vào cơ sở dữ liệu được chỉ định bởi biến MYSQL_DATABASE.

để biết thêm chi tiết, bạn luôn có thể truy cập trang chính thức


1

Bạn có thể chạy vùng chứa cài đặt thư mục chia sẻ (-v volume), rồi chạy bash trong vùng chứa đó. Sau đó, bạn có thể tương tác sử dụng mysql-client để thực thi tệp .sql, từ bên trong vùng chứa. obs: / my-host-dir / shared-dir là vị trí .sql trong hệ thống máy chủ.

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

Bên trong thùng ...

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

Thông số tùy chỉnh:

  • test-mysql (tên vùng chứa)
  • cảng chủcảng container
  • my-root-pswd (mật khẩu gốc mysql)
  • / my-host-dir / shared-dir/ container-dir ( thư mục máy chủ lưu trữ sẽ được gắn trong vùng chứa và vị trí vùng chứa của thư mục được chia sẻ)

0

Cái này phù hợp với tôi

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

Trước tiên, nếu bạn muốn biết NAME_CONTAINER_MYSQL là gì, bạn nên sử dụng lệnh dưới đây:

$ docker ps

Trong cột đầu ra NAME, bạn sẽ thấy NAME_CONTAINER_MYSQL mà bạn cần thay thế trong lệnh trên.


0

Thử "docker exec ... < data.sql"phản hồi trong Window PowerShell với:

Toán tử '<' được dành riêng để sử dụng trong tương lai.

Nhưng người ta có thể kết thúc nó với cmd /cđể loại bỏ vấn đề:

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

-2

bạn có thể sao chép tệp xuất cho ví dụ: dump.sql bằng cách sử dụng docker cp vào vùng chứa và sau đó nhập db. nếu bạn cần hướng dẫn đầy đủ, hãy cho tôi biết và tôi sẽ cung cấp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.