นำเข้า data.sql MySQL Docker Container


91

หากฉันมี data.sql ฉันจะนำเข้าฐานข้อมูลไปยัง mysql docker container ได้อย่างไร ฉันจะนำเข้าข้อมูลฐานข้อมูลได้อย่างไร ในโลกของนักเทียบท่าสิ่งนี้จะเพิ่มความซับซ้อนอีกชั้น โปรดใช้วิธีการบางอย่าง

ที่นี่ 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 ไปยังคอนเทนเนอร์จากนั้นโหลดข้อมูล infile
Jay Blanchard

คำตอบ:


61

ดูเหมือนว่าฉันจะใช้งาน 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 เลยหรือมีข้อผิดพลาดบางอย่าง 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

155

คุณสามารถนำเข้าฐานข้อมูลได้ในภายหลัง:

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


23
docker exec -i $(docker-compose ps -q mysql-container) mysql …หากมีการใช้นักเทียบท่า-เขียนคุณจะต้องได้รับภาชนะโดย: ไม่สนับสนุนการอ่านจาก stdin ในขณะนี้ตามที่อธิบายไว้ที่นี่
slhck

2
จะทำอย่างไรกับนักเทียบท่า
iamjc015

7
ฉัน. ได้รับข้อผิดพลาด "อุปกรณ์อินพุตไม่ใช่ TTY"
kamal

FYI:ใช้-pโดยไม่ต้องใช้รหัสผ่านเพื่อความปลอดภัย
Abdulla Nilam

2
@kamal คุณใช้-tตัวเลือกนี้สำหรับdocker exec? Juse ใช้-iเพื่อหลีกเลี่ยงข้อผิดพลาด
Wolfgang

88

ติดตั้ง sql-dump ของคุณ/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 นั้นเป็นเพียงการจับกลุ่มเท่านั้นมันค่อนข้างเป็นทางแยกจากนั้นก็เป็นตัวตายตัวแทน ดูความคิดเห็นของ Dockers เกี่ยวกับเรื่องนี้ หนึ่งในปัญหาใหญ่คือ volumr_from mount ที่เป็นไปได้ที่หายไป
Eugen Mayer

21
พวกคุณจำไว้ว่าถ้าคุณสร้างไดรฟ์ข้อมูลถาวรสำหรับบริการฐานข้อมูลจะไม่ตรวจสอบไฟล์. sql ใหม่เว้นแต่คุณจะสร้างขึ้นใหม่ หายไปสองสามชั่วโมงเพื่อสิ่งนี้ฉันหวังว่าจะไม่มีใครผ่านไปเหมือนกัน
Dazag

1
@DhwanilPatel คุณต้องใช้ - สร้าง - บังคับ - สร้างตัวเลือกใหม่ docs.docker.com/compose/reference/upเช่นนักเทียบท่า - แต่ง - สร้าง
บังคับ

@Dazag ที่จริงฉันใช้คำสั่งนี้อยู่แล้ว: "sudo docker-compose up -d --force-re-build --build" แต่ไม่มีอะไรเกิดขึ้น
Dhwanil Patel

24

ตัวเลือกถ้าคุณไม่ต้องการที่จะติดตั้งไดรฟ์ 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: [คำเตือน] การใช้รหัสผ่านบนอินเทอร์เฟซบรรทัดคำสั่งอาจไม่ปลอดภัย ข้อผิดพลาด 1064 (42000) ที่บรรทัดที่ 1: คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชันเซิร์ฟเวอร์ MySQL ของคุณสำหรับไวยากรณ์ที่ถูกต้องเพื่อใช้ใกล้ 'mysqldump: [คำเตือน] การใช้รหัสผ่านบนอินเทอร์เฟซบรรทัดคำสั่งอาจไม่ปลอดภัย' ที่บรรทัด 1 อ่าน unix @ -> / var / run / docker sock: read: connection reset by peer
R อา

โปรดตรวจสอบว่าคำเตือนนี้ยังไม่ปรากฏใน dump.sql ของคุณ: เมื่อคุณสร้างไฟล์โดยใช้ mysqldump และให้รหัสผ่านในบรรทัดคำสั่งคำเตือนจะสิ้นสุดในไฟล์ที่ถูกทิ้ง
Stefan Frank

6

ฉันสามารถนำเข้าด้วยคำสั่งนี้

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

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

3

คุณสามารถทำตามขั้นตอนง่ายๆเหล่านี้:

วิธีแรก:

ก่อนอื่นให้คัดลอกไฟล์ดัมพ์ SQL จากไดเร็กทอรีโลคัลของคุณไปยัง mysql container ใช้คำสั่ง 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 ซึ่งคุณสามารถส่งผ่านได้โดยการตั้งค่าตัวแปรสภาพแวดล้อมดูวิธีตั้งค่าตัวแปรสภาพแวดล้อมที่นี่

ตามค่าเริ่มต้นคอนเทนเนอร์จะเรียกใช้ไฟล์ที่มีนามสกุล. sh, .sql และ. sql.gz ที่พบในโฟลเดอร์ /docker-entrypoint-initdb.d ไฟล์จะถูกดำเนินการตามลำดับตัวอักษร ด้วยวิธีนี้ไฟล์ SQL ของคุณจะถูกนำเข้าโดยค่าเริ่มต้นไปยังฐานข้อมูลที่ระบุโดยตัวแปร MYSQL_DATABASE

สำหรับรายละเอียดเพิ่มเติมคุณสามารถเยี่ยมชมหน้าอย่างเป็นทางการได้ตลอดเวลา


2

ลองใช้"docker exec ... < data.sql"Window PowerShell ตอบสนองด้วย:

ตัวดำเนินการ '<' สงวนไว้สำหรับการใช้งานในอนาคต

แต่เราสามารถสรุปได้cmd /cเพื่อขจัดปัญหา:

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

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 (ไดเร็กทอรีโฮสต์ที่จะติดตั้งในคอนเทนเนอร์และตำแหน่งคอนเทนเนอร์ของไดเร็กทอรีที่ใช้ร่วมกัน)

1

อันนี้ใช้ได้ผลสำหรับฉัน

$ 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 cp file.sql <CONTAINER NAME>:/file.sqlก่อน

แล้ว docker exec -i <CONTAINER NAME> mysql -u user -p

จากนั้นภายในคอนเทนเนอร์ mysql จะดำเนินการ source \file.sql


-2

คุณสามารถคัดลอกไฟล์ส่งออกสำหรับเช่น dump.sql โดยใช้ docker cp ลงในคอนเทนเนอร์จากนั้นจึงนำเข้าฐานข้อมูล หากคุณต้องการคำแนะนำทั้งหมดโปรดแจ้งให้เราทราบและเราจะจัดเตรียมให้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.