আমদানি ডেটা.এসকিউএল মাইএসকিউএল ডকার কনটেইনার


91

যদি আমার একটি ডেটা.এসকিউএল থাকে তবে আমি কীভাবে আমার মাইএসকিএল ডকার ধারকটিতে ডাটাবেস আমদানি করতে পারি? আমি কীভাবে ডাটাবেস ডেটা আমদানি করতে পারি। ডকরিজড বিশ্বে এটি জটিলতার একটি স্তর যুক্ত করে। কিছু পদ্ধতি দয়া করে।

এখানে আমার ডকার-কমপোজ.আইএমএল:

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"

এসকিউএল ফাইলটি ধারকটিতে অনুলিপি করুন এবং তারপরে ডেটা ইমপ্লিট করুন।
জে ব্লানচার্ড 21

উত্তর:


61

আমি সর্বশেষতম মাইএসকিএল বা মাইএসকিএল: 5.7 দিয়ে এই কাজটি করবো বলে মনে হচ্ছে না। সুতরাং আমি পরিবর্তে মারিয়াডিবি ব্যবহার করি। এখানে আমার 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 ফাইল না থাকার বা কোনও ধরণের ত্রুটি না ফেলে ডিরেক্টরি তৈরি করার কারণ কী হবে? মারিয়্যাডব ধারকটির জন্য আমার প্রাসঙ্গিক ডকার-কমপোজ.আইএমএল: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-রচনা ব্যবহার করেন, তাহলে আপনি দ্বারা ধারক পেতে আছে: docker exec -i $(docker-compose ps -q mysql-container) mysql …। এটি এখানে বর্ণিত হিসাবে এই মুহুর্তে স্টিডিন থেকে পড়া সমর্থন করে না ।

4
ডকার-রচনাতে এটি কীভাবে করবেন?
iamjc015

7
আমি. ত্রুটি পেতে "ইনপুট ডিভাইসটি টিটিওয়াই নয়"
কমল

এফওয়াইআই:-p সুরক্ষার প্রয়োজনে পাসওয়ার্ড ছাড়াই ব্যবহার করুন ।
আবদুল্লা নীলম

4
@ কমল আপনি কি -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

এটি কনটেইনার শুরুর সময় স্কেল-ডাম্পের আমদানিকে ট্রিগার করবে, "একটি নতুন উদাহরণ শুরু করার" অধীনে https://hub.docker.com/_/mysql/ দেখুন


4
+1 @ ইউজেনমায়ার। : নিশ্চিতভাবে রচনা v1 এ যে ব্যবহার করবেন সর্বশেষ v3 এর সিনট্যাক্স থেকে সরানো উচিত docs.docker.com/compose/compose-file
মানো মার্কস

4
অসুবিধা হলেও, ভি 3, ভি 2 এর উত্তরসূরি নয়। ভি 3 মূলত শুধুমাত্র সোর্ম, এটি বরং কাঁটাচামচ পরে উত্তরসূরি। এটি সম্পর্কে ডক্টরদের মন্তব্য দেখুন। বিশাল সমস্যাগুলির মধ্যে একটি হ'ল ভলিউম_ফ্রন্টের সম্ভাবনা অনুপস্থিত
মেয়ার

21
বন্ধুরা, মনে রাখবেন যে আপনি যদি ডাটাবেস পরিষেবার জন্য একটি অবিরাম ভলিউম তৈরি করেন তবে এটি নতুন। এসকিউএল ফাইলগুলি পরীক্ষা না করে যদি আপনি এটি পুনরায় তৈরি না করেন। এটিতে কয়েক ঘন্টা হারিয়েছে, আমি আশা করি অন্য কেউ এর মধ্যে দিয়ে যায় না।
দাজাগ

4
@ ধওয়ানিলপেটেল - আপনি বিল্ডিং - ফোর্স-পুনঃনির্ধারণ বিকল্পগুলি ব্যবহার করতে হবে। docs.docker.com/compose/references/up ডিম ডকার-কমপোজ
বিল্ড

@ দাজাগ আসলে আমি ইতিমধ্যে এই আদেশটি ব্যবহার করেছি: "সুডো ডকার-কমপোজ আপ-ডি --ফোর্স-রিসারেট - বিল্ড" তবে কিছুই হয় না
ধওয়ানিল প্যাটেল

23

আপনি যদি কোনও ভলিউম মাউন্ট করতে না চান তবে অন্য বিকল্পটি হ'ল, তবে আপনার স্থানীয় মেশিন থেকে কোনও ফাইল ডাম্প করতে চান, তা হ'ল পাইপ 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>

আমি ত্রুটি পাচ্ছি - মাইএসকিএল: [সতর্কতা] কমান্ড লাইন ইন্টারফেসে একটি পাসওয়ার্ড ব্যবহার করা নিরাপত্তাহীন হতে পারে। লাইন 1 এ 1010 (42000) এর ত্রুটি: আপনার এসকিউএল সিন্টেক্সে আপনার একটি ত্রুটি রয়েছে; আপনার মাইএসকিউএল সার্ভার সংস্করণটির সাথে সম্পর্কিত 'মাইএসকিএলডাম্পের কাছাকাছি ব্যবহার করতে ডান সিনট্যাক্সের জন্য ম্যানুয়ালটি পরীক্ষা করুন: [সতর্কতা] কমান্ড লাইন ইন্টারফেসে একটি পাসওয়ার্ড ব্যবহার করা অনিরাপদ হতে পারে' লাইন 1 পড়তে ইউনিক্স @ -> / var / রান / ডকারে পড়ুন। মোজা: পড়ুন: পিয়ার দ্বারা সংযোগটি পুনরায় সেট করুন
আর সান

pls চেক করুন, এই সতর্কতাটি আপনার ডাম্পের মধ্যে ইতিমধ্যে উপস্থিত নেই s
স্টিফান ফ্র্যাঙ্ক

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

এছাড়াও আপনি মনির অগ্রগতিতে পিভি ব্যবহার করতে পারেন :

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

এবং এখানে সর্বাধিক গুরুত্বপূর্ণ বিষয় হ'ল "--init-आज्ञा" যা আমদানির অগ্রগতি 10 গুণ দ্রুত গতিবে।


আমি স্টিডিন পেয়ে যাচ্ছি না ... এটির সাথে সত্যিই বিরক্ত হওয়া, এর সমাধান কী?
ব্রাম বি

আপনার মানে কি বুঝতে পারছেন না, আপনি আমাকে আরও বিশদ দিতে পারেন?
ম্যাট কই

3

আপনি এই সহজ পদক্ষেপগুলি অনুসরণ করতে পারেন:

প্রথম উপায়:

প্রথমে আপনার স্থানীয় ডিরেক্টরি থেকে এসকিউএল ডাম্প ফাইলটি মাইএসকিএল ধারকটিতে অনুলিপি করুন। ডকার সিপি কমান্ড ব্যবহার করুন

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-ধারকটি ব্যবহার করুন (দ্রষ্টব্য: আপনি যদি আলপাইন সংস্করণ ব্যবহার করছেন তবে নীচে প্রদত্ত কমান্ডে sh এর সাথে আপনার বাশ প্রতিস্থাপন করতে হবে))

docker exec -it -u root mysql-container bash

এবং তারপরে আপনি কেবল এই এসকিউএল ডাম্প ফাইলটি আমদানি করতে পারেন।

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

দ্বিতীয় উপায়: সরল

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

যেমনটি মাইএসকিএল ডকার হাব অফিসিয়াল পৃষ্ঠায় উল্লিখিত হয়েছে।

যখনই কোনও ধারক প্রথমবারের জন্য শুরু হয়, এমওয়াইএসকিউএল_ডাটাবেসে ভেরিয়েবলে নির্দিষ্ট নামের সাথে একটি নতুন ডাটাবেস তৈরি করা হয় - যা আপনি পরিবেশের ভেরিয়েবল সেট করে পাস করতে পারেন এখানে পরিবেশের ভেরিয়েবল কীভাবে সেট করবেন তা দেখুন environment

ডিফল্টরূপে ধারকগুলি /docker-entryPoint-initdb.d ফোল্ডারে পাওয়া এক্সটেনশন .sh, .sql এবং .sql.gz সহ ফাইলগুলি সম্পাদন করে। ফাইলগুলি বর্ণানুক্রমিক ক্রমে কার্যকর করা হবে। আপনার এসকিউএল ফাইলগুলি MYSQL_DATABASE ভেরিয়েবলের দ্বারা নির্দিষ্ট ডেটাবেজে ডিফল্টরূপে আমদানি করা হবে।

আরও তথ্যের জন্য আপনি সর্বদা অফিসিয়াল পৃষ্ঠাটি দেখতে পারেন


2

"docker exec ... < data.sql"উইন্ডো পাওয়ারশেলের প্রতিক্রিয়াগুলির সাথে চেষ্টা করে:

'<' অপারেটর ভবিষ্যতের ব্যবহারের জন্য সংরক্ষিত।

তবে cmd /cসমস্যাটি দূর করতে কেউ এটি মুছে ফেলতে পারে:

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

1

আপনি একটি ধারককে একটি ভাগ করা ডিরেক্টরি (-v ভলিউম) সেট করে চালাতে পারেন এবং তারপরে সেই ধারকটিতে বাশ চালাতে পারেন। এরপরে, আপনি ধারকটির ভিতরে থেকে .sql ফাইলটি কার্যকর করতে mysql-ক্লায়েন্ট ব্যবহার করতে পারেন। obs: / আমার-হোস্ট-ডির / শেয়ার্ড-দির হোস্ট সিস্টেমে .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 

কাস্টম পরামিতি:

  • পরীক্ষা-মাইএসকিএল (ধারকের নাম)
  • হোস্ট-পোর্ট এবং ধারক-বন্দর
  • আমার-রুট-পিএসডাব্লুড (মাইএসকিএল রুট পাসওয়ার্ড)
  • / আমার-হোস্ট-ডির / শেয়ার্ড-ডির এবং / কনটেইনার-দির (হোস্ট ডিরেক্টরি যা ধারকটিতে মাউন্ট করা হবে এবং ভাগ করা ডিরেক্টরিটির ধারক অবস্থান)

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

তারপরে মাইএসকিএল ধারকটির ভিতরে চালিত কর source \file.sql


-2

আপনি যেমন ডাম্প.এসকিউএল ডকার সিপি ব্যবহার করে ধারকটিতে রফতানির ফাইলটি অনুলিপি করতে পারেন এবং তারপরে ডিবি আমদানি করতে পারেন। আপনার যদি পূর্ণ নির্দেশাবলীর প্রয়োজন হয় তবে আমাকে জানান এবং আমি সরবরাহ করব

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.