डेटा को आयात करें। MySQL डॉकटर कंटेनर


91

अगर मेरे पास 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 फ़ाइल को कंटेनर में कॉपी करें और फिर डेटा इनफ़िल को लोड करें।
जे ब्लांचार्ड

जवाबों:


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:

जब मैं इस पद्धति का उपयोग करने की कोशिश करता हूं, तो मैं डंप के लिए एक निर्देशिका के साथ समाप्त करता हूं। एसक्यूएल कोई विचार क्यों? उदाहरण: मारिदब कंटेनर में बैश और: 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

156

आप बाद में डेटाबेस आयात कर सकते हैं:

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 …:। यह फिलहाल स्टड से पढ़ने का समर्थन नहीं करता है, जैसा कि यहां वर्णित है
slhck

2
इसे कैसे करें डॉक-कंपोज़?
12मजकियॉ

7
मैं हूँ। त्रुटि "इनपुट डिवाइस एक TTY नहीं है"
कमल

FYI करें:-p सुरक्षा उद्देश्य के लिए पासवर्ड के बिना उपयोग करें
अब्दुल्ला निलाम

2
@kamal क्या आपने -tविकल्प का उपयोग किया docker exec? -iत्रुटि से बचने के लिए ज्यूस का उपयोग
वोल्फगैंग

88

/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 मूल रूप से केवल झुंड है, यह एक कांटा है, फिर एक उत्तराधिकारी है। इस पर डॉकर्स की टिप्पणी देखें। विशाल मुद्दों में से एक लापता volumr_from माउंट संभावना है
यूजेन मेयर

21
दोस्तों, याद रखें कि यदि आप डेटाबेस सेवा के लिए एक निरंतर वॉल्यूम बनाते हैं, तो यह नई .sql फ़ाइलों के लिए जाँच नहीं करेगा जब तक कि आप इसे फिर से नहीं बनाते हैं। इस के लिए कुछ घंटे खो दिया, मुझे आशा है कि कोई भी उसी के माध्यम से नहीं जाता है।
दजाग

1
@DhwanilPatel आपको --build --force-recreate विकल्पों का उपयोग करना होगा। docs.docker.com/compose/reference/up Eg docker -compose up --build --force-recreate
Dazag

@ डेजैग वास्तव में मैं पहले से ही इस कमांड का उपयोग करता हूं: "sudo docker-compose up -d --force-retroe --build" लेकिन ऐसा कुछ नहीं होता है
धवनिल पटेल

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
चू

11

डॉकटर-कम्पोज़ का उपयोग करके आयात करें

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

मुझे त्रुटि मिल रही है - mysql: [चेतावनी] कमांड लाइन इंटरफ़ेस पर पासवर्ड का उपयोग करना असुरक्षित हो सकता है। ERROR 1064 (42000) पंक्ति 1 पर: आपके SQL सिंटैक्स में एक त्रुटि है; 'mysqldump: [चेतावनी] पास लाइन इंटरफेस पर एक पासवर्ड का उपयोग कर असुरक्षित हो सकता है' लाइन 1 पढ़ा यूनिक्स @> / var / चलाने / docker के पास का उपयोग करने के लिए सही सिंटैक्स के लिए अपने MySQL सर्वर संस्करण से मेल खाती है कि मैनुअल की जाँच करें। sock: read: कनेक्शन रीसेट मोर द्वारा
R Sun

pls जांच करें, कि यह चेतावनी आपके डंप में पहले से ही दिखाई नहीं दे रही है। एसक्यूएल: जब आपने mysqldump का उपयोग करके फ़ाइल का निर्माण किया और कमांड-लाइन पर पासवर्ड दिया, तो चेतावनी डंप की गई फ़ाइल में समाप्त हो जाएगी।
स्टीफन फ्रैंक

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उपयोगकर्ता नाम और उपयोगकर्ता के बीच एक स्थान होना चाहिए ।
गॉर्डन फ्रीमैन

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;"

और यहां सबसे महत्वपूर्ण बात "--इनिट-कमांड" है जो 10 गुना तेजी से आयात प्रगति को गति देगा।


मुझे लगता है कि एक स्टेंट नहीं है ... वास्तव में इस से ऊब रहा है, इसका क्या समाधान है?
ब्रैम बी

समझ में नहीं आता कि आपका क्या मतलब है, हो सकता है कि आप मुझे और विस्तार दे सकें?
14. 14

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 को बदलने की आवश्यकता है।)

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 hub आधिकारिक पेज में बताया गया है।

जब भी कोई कंटेनर पहली बार शुरू होता है, तो MYSQL_DATABASE चर में निर्दिष्ट नाम के साथ एक नया डेटाबेस बनाया जाता है - जिसे आप पर्यावरण चर सेट करके पास कर सकते हैं यहां देखें कि पर्यावरण चर कैसे सेट करें

डिफ़ॉल्ट कंटेनर एक्सटेंशन .sh, .sql और .sql.gz के साथ फ़ाइलों को निष्पादित करेगा जो /docker-entrypoint-initdb.d फ़ोल्डर में पाए जाते हैं। फाइलों को वर्णमाला क्रम में निष्पादित किया जाएगा। इस तरह आपकी SQL फाइलें डिफ़ॉल्ट रूप से MYSQL_DATABASE चर द्वारा निर्दिष्ट डेटाबेस में आयात की जाएंगी।

अधिक जानकारी के लिए आप हमेशा आधिकारिक पेज पर जा सकते हैं


2

के "docker exec ... < data.sql"साथ विंडो PowerShell प्रतिक्रियाओं में कोशिश कर रहा है:

'<' ऑपरेटर भविष्य के उपयोग के लिए आरक्षित है।

लेकिन कोई भी cmd /cइस मुद्दे को खत्म करने के लिए इसे लपेट सकता है :

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

1

आप एक साझा निर्देशिका (-v वॉल्यूम) सेटिंग कंटेनर चला सकते हैं, और फिर उस कंटेनर में बैश चला सकते हैं। इसके बाद, आप कंटेनर के अंदर से .sql फ़ाइल को निष्पादित करने के लिए mysql-client का उपयोग कर सकते हैं। obs: / my-host-dir / share-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 

कस्टम पैरामीटर:

  • परीक्षण- mysql (कंटेनर नाम)
  • होस्ट-पोर्ट और कंटेनर-पोर्ट
  • my-root-pswd (mysql रूट पासवर्ड)
  • / my-host-dir / share-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

आप कंटेनर में docker cp का उपयोग करके डंप.sql के लिए निर्यात फ़ाइल की प्रतिलिपि बना सकते हैं और फिर db आयात कर सकते हैं। यदि आपको पूर्ण निर्देशों की आवश्यकता है, तो मुझे बताएं और मैं प्रदान करूंगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.