একই মাইএসকিউএল উদাহরণে একটি মাইএসকিউএল ডাটাবেস ক্লোন করা oning


154

আমি কোনো স্ক্রিপ্ট কপি আমার বর্তমান ডাটাবেসের লিখতে চাই sitedb1থেকে sitedb2একই মাইএসকিউএল ডাটাবেস ইনস্ট্যান্স উপর। আমি জানি যে আমি সাইটিডব 1 কে স্কয়ার স্ক্রিপ্টে ফেলে দিতে পারি:

mysqldump -u root -p sitedb1 >~/db_name.sql

এবং তারপরে এটি আমদানি করুন sitedb2। প্রথম ডাটাবেসটি স্কয়ার ফাইলটিতে ফেলে না রেখে কি আরও সহজ উপায় আছে?


উত্তর:


302

ম্যানুয়ালটি ডাটাবেসগুলি অনুলিপি করার ক্ষেত্রে যেমন আপনি সরাসরি মাইএসকিএল ক্লায়েন্টে ডাম্পটি পাইপ করতে পারেন:

mysqldump db_name | mysql new_db_name

আপনি যদি মাইআইএসএএম ব্যবহার করেন তবে আপনি ফাইলগুলি অনুলিপি করতে পারেন , তবে আমি এটির প্রস্তাব দেব না। এটা কিছুটা কৌতুকপূর্ণ।

বিভিন্ন ভাল উত্তর থেকে সংহত

উভয় mysqldumpএবং mysqlআদেশগুলি সংযোগের বিশদ (এবং আরও অনেক কিছু) সেট করার জন্য বিকল্পগুলি গ্রহণ করে, যেমন:

mysqldump -u <user name> --password=<pwd> <original db> | mysql -u <user name> -p <new db>

এছাড়াও, যদি নতুন ডাটাবেসটি এখনও বিদ্যমান না থাকে তবে আপনাকে এটি আগে তৈরি করতে হবে (উদাহরণস্বরূপ echo "create database new_db_name" | mysql -u <dbuser> -p)।


2
কিন্ডা ... এটি প্রচুর ডিস্ক আইও এড়িয়ে যায় যদিও আপনাকে দুবার ডেটা পড়তে / লিখতে হবে না
গ্রেগ

8
আপনার ডাটাবেসটি যদি গিগাবাইট আকারে হয় তবে সম্ভবত এটি আপনার বেশি লাভ করবে না। আমি মনে করি যে ওপিটি কী পাচ্ছে তারা কপিটি বহিরাগত করতে চায় না: এটি কি সম্পূর্ণরূপে মাইএসকিএল-এর মাধ্যমে করা যায়?
ক্লিটাস

3
আমি বলব যে ডিবি আপনাকে আরও বেশি লাভ করে ... মাইএসকিউএল আফিকের মধ্যে এটি করার কোনও উপায় নেই (হাতে হাতে একটি টেবিলে / একবারে দেখুন)
গ্রেগ

41
আমাকে প্রথমে স্ট্যান্ডার্ড মাইএসকিএল কমান্ডটি ব্যবহার করে new_db তৈরি করতে হয়েছিল: "ডেটাবেস new_db তৈরি করুন;" এবং তারপরে এই কমান্ডগুলি ব্যবহার করেছেন: mysqldump -u root -p old_db | mysql -u root -p new_db
ভ্যালেন্ট

4
এটি আমার জন্য কাজ না করে, যদি আমি ডাম্পিং এবং এই মত আমদানি করার জন্য পাসওয়ার্ড দিতে হবে: mysqldump -uroot -p database1 | mysql -uroot -p database2। আমি উভয় pws জন্য অনুরোধ জানানো কিন্তু শুধুমাত্র একটি মধ্যে রাখতে পারেন। প্রম্পট সৌন্দর্য এটি পছন্দ: Enter password: Enter password: । প্রথম pw দেওয়ার পরে, প্রক্রিয়াটি চিরকাল অপেক্ষা করে।
টর্স্টেন

66

মাইএসকিউএল ইউটিলিটি ব্যবহার করে

মাইএসকিউএল ইউটিলিটিসটিতে mysqldbcopyএকটি দুর্দান্ত সরঞ্জাম রয়েছে যা ডিফল্টরূপে সমস্ত সম্পর্কিত অবজেক্ট ("টেবিল, ভিউ, ট্রিগার, ইভেন্টস, পদ্ধতি, ফাংশনগুলি এবং ডাটাবেস-স্তরের অনুদান") এবং একটি ডিবি সার্ভার থেকে একই বা অন্যটিতে ডেটা অনুলিপি করে একটি ডিবি অনুলিপি করে ies ডিবি সার্ভার। আসলে অনুলিপি করা কাস্টমাইজ করতে প্রচুর বিকল্প উপলব্ধ।

সুতরাং, ওপি-র প্রশ্নের উত্তর দিতে:

mysqldbcopy \
    --source=root:your_password@localhost \
    --destination=root:your_password@localhost \
    sitedb1:sitedb2

1
এটি আমার পক্ষে ভাল কাজ করেছে, mysqldumpভিত্তিক সমাধান ব্যর্থ হয়েছিল।
সজি 89

1
আমার ক্ষেত্রে আমাকে বন্দরটি এর মতো নির্দিষ্ট করতে হয়েছিল: --সোর্স = মূল: আপনার_প্যাসওয়ার্ড @ লোকালহোস্ট: 3307 (অন্যথায় এটি আমাকে একটি অ্যাক্সেস অস্বীকার করতে পারে)
pbz

4
দরকার sudo apt-get install mysql-utilities, তবে এটি খুব ঝরঝরে। আমি কি পাসওয়ার্ডটি ছেড়ে যেতে এবং এটি প্রবেশ করার অনুরোধ জানাতে পারি?
ADTC

2
@ এডটিসি আমি জানি না যে mysqldbcopyআপনাকে পাসওয়ার্ড জিজ্ঞাসা করার কোনও অন্তর্নির্মিত উপায় আছে কিনা; কমপক্ষে আমি ডকুমেন্টেশনে এর মতো কিছু পাইনি। যদিও আপনি নিজেই এই কার্যকারিতাটি তৈরি করতে পারেন। বাশে এটি কিছুটা দেখতে পারা যায়:mysqldbcopy --source=root:"$(read -sp 'Source password: ' && echo $REPLY)"@localhost --destination=root:"$(read -sp 'Destination password: ' && echo $REPLY)"@localhost sitedb1:sitedb2
চ্রিকি

1
এফওয়াইআই: মনে হচ্ছে চিকারির আদেশটি নির্দোষভাবে কাজ করে। আমাকে কেবল কমান্ডটি যুক্ত --forceকরতে হয়েছিল mysqldbcopyকারণ আমি ইতিমধ্যে গন্তব্য ডেটাবেস তৈরি করেছি। ধন্যবাদ!
নিয়াভলিস

19
mysqladmin create DB_name -u DB_user --password=DB_pass && \
        mysqldump -u DB_user --password=DB_pass DB_name | \
        mysql     -u DB_user --password=DB_pass -h DB_host DB_name

2
এটি গ্রহণযোগ্য উত্তরে কী যুক্ত করে? অনুরূপ, তবে আপনি কিছু পার্থক্য যুক্ত করুন, আরও ভাল বোঝার জন্য কিছু মন্তব্য যুক্ত করুন
ইয়ারোস্লাভ

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, কারণ এটি ডেটাবেস তৈরি করবে, লেখকের পক্ষেও ভাল। বর্তমান গৃহীত উত্তর আপনাকে অ্যাক্সেস অস্বীকার করতে বলবে, তারপরে সারণীর অস্তিত্ব নেই।
রামি দাবাইন

14

টার্মিনাল / কমান্ড প্রম্পট থেকে আপনার কমান্ডটি চালানো দরকার।

mysqldump -u <user name> -p <pwd> <original db> | mysql -u <user name> <pwd> <new db>

উদাহরণ: mysqldump -u root test_db1 | mysql -u root test_db2

এটি test_db1 কে test_db2 অনুলিপি করে এবং 'রুট' @ 'লোকালহোস্ট'-এ অ্যাক্সেস দেয়


আমি এই উত্তরটি পছন্দ করি, এটি খাস্তা। তবে, আমার জন্য পাসওয়ার্ডের আগে-পিএসএস প্রয়োজন required
lwitzel

1
আমরা কীভাবে মূল ডাটাবেসে তৈরি ফাংশন, ইভেন্ট ইত্যাদি অনুলিপি করতে পারি? এটি কেবল অনুলিপি টেবিল দেখায়।
ডোগান এস্কান

12

আপনার টার্মিনালে এই কমান্ডগুলি প্রবেশ করানো এবং রুট ব্যবহারকারীর কাছে অনুমতি সেট করা সর্বোত্তম এবং সহজ উপায়। আমার জন্য কাজ কর..!

:~$> mysqldump -u root -p db1 > dump.sql
:~$> mysqladmin -u root -p create db2
:~$> mysql -u root -p db2 < dump.sql

1
প্রশ্নটি স্পষ্ট করে জানিয়েছে যে রফতানি / আমদানি পদ্ধতি ইতিমধ্যে জানা গেছে।
লভ

3
এটি করার সেরা উপায় এটি। বড় ডেটাবেসগুলির সাথেও কাজ করে, যেখানে পাইপযুক্ত সংস্করণটি mysqldump -u <user> -p <pwd> db_name | mysql -u <user> -p <pwd> new_db_nameবড় ডেটাবেসগুলির ক্ষেত্রে সমস্যাযুক্ত হতে পারে।
অ্যালেক্স

10

আপনি ব্যবহার করতে পারেন (সিউডোকোডে):

FOREACH tbl IN db_a:
    CREATE TABLE db_b.tbl LIKE db_a.tbl;
    INSERT INTO db_b.tbl SELECT * FROM db_a.tbl;

যে কারণে আমি তৈরি টেবিলটি ব্যবহার করছি না ... নির্বাচন করুন ... বাক্য গঠনটি সূচকগুলি সংরক্ষণ করা to অবশ্যই এটি কেবল টেবিলগুলি অনুলিপি করে। দেখুন এবং পদ্ধতিগুলি অনুলিপি করা হয় না, যদিও এটি একই পদ্ধতিতে করা যেতে পারে।

দেখুন সারণি তৈরি


3
নির্ভরযোগ্য টেবিলগুলি অনুলিপি করা যায়নি বলে এটি রেফারেন্স অখণ্ডতায় ব্যর্থ হতে পারে। হতে পারে এটি একটি বড় লেনদেনে কাজ করতে পারে।
ওঁদ্রেজ গালবাভ

4

প্রথমে সদৃশ ডাটাবেস তৈরি করুন:

CREATE DATABASE duplicateddb;

নিশ্চিত হয়ে নিন যে অনুমতিগুলি ইত্যাদি সমস্ত জায়গায় রয়েছে এবং:

mysqldump -u admin -p originaldb | mysql -u backup -p password duplicateddb;


1

এই বিবৃতিটি মাইএসকিউএল 5.1.7 এ যুক্ত করা হয়েছিল তবে এটি বিপজ্জনক বলে মনে হয়েছিল এবং এটি মাইএসকিউএল 5.1.23-এ সরানো হয়েছে। এটি ডাটাবেস ডিরেক্টরি নামগুলিতে ডাটাবেসের নাম ম্যাপিংয়ের জন্য 5.1-র মধ্যে প্রয়োগ করা এনকোডিংটি ব্যবহার করার জন্য প্রাক-5.1 ডাটাবেসগুলি আপগ্রেড করতে সক্ষম হয়েছিল। তবে, এই বিবৃতিটি ব্যবহারের ফলে ডাটাবেস সামগ্রী হারাতে পারে, যার কারণে এটি সরানো হয়েছে। এটি উপস্থিত থাকা পূর্ববর্তী সংস্করণগুলিতে পুনরায় নাম ডেটাবেস ব্যবহার করবেন না।

নতুন এনকোডিংয়ের সাথে ডাটাবেসের নাম আপগ্রেড করার কাজটি সম্পাদনের জন্য, পরিবর্তে ডেটাবাসের db_name UPGRADE ডেটা ডাইরেক্টরি নাম ব্যবহার করুন: http://dev.mysql.com/doc/refman/5.1/en/alter-database.html


1

এটি করার একটি সহজ উপায় আপনি যদি phpmyadmin ইনস্টল করেন :

আপনার ডাটাবেসে যান, "অপারেশন" ট্যাবটি নির্বাচন করুন এবং আপনি "কপি ডাটাবেসে অনুলিপি" দেখতে পারবেন। এটি ব্যবহার করুন এবং আপনি ডাটাবেস অনুলিপি করতে পারেন।


1

হিসাবে উল্লেখ গ্রেগ এর উত্তর , mysqldump db_name | mysql new_db_nameহয় , মুক্ত নিরাপদ, এবং সহজ ডাটাবেস মধ্যে ডেটা স্থানান্তর করতে উপায়। যাইহোক, এটি সত্যিই ধীর

আপনি যদি ডেটা ব্যাকআপের সন্ধান করছেন, ডেটা হারাতে পারবেন না (এই বা অন্যান্য ডাটাবেসে), বা অন্য কোনও সারণী ব্যবহার করছেন innodb, তবে আপনার ব্যবহার করা উচিত mysqldump

আপনি যদি বিকাশের জন্য কিছু সন্ধান করেন, আপনার সমস্ত ডাটাবেস অন্য কোথাও ব্যাক আপ করে রাখুন এবং mysqlসবকিছু ভুল হয়ে যাওয়ার পরে বিশুদ্ধ করতে এবং পুনরায় ইনস্টল করা (সম্ভবত ম্যানুয়ালি) স্বাচ্ছন্দ্য বোধ করেন তবে আমার কাছে কেবল সমাধান হতে পারে।

আমি একটি ভাল বিকল্প খুঁজে পাইনি, তাই আমি নিজে এটি করার জন্য একটি স্ক্রিপ্ট তৈরি করেছি। প্রথমবারের মতো কাজ করার জন্য আমি অনেক সময় ব্যয় করেছি এবং এখনই এটিতে পরিবর্তন আনতে এটি সত্যই আমাকে ভীত করে। ইনোডব ডাটাবেসগুলি এর আগে অনুলিপি করা এবং আটকানো নয়। ছোট পরিবর্তনগুলির কারণে এটি দুর্দান্ত পদ্ধতিতে ব্যর্থ হয়। কোডটি চূড়ান্ত করার পর থেকে আমার কোনও সমস্যা হয়নি, তবে এর অর্থ এই নয় যে আপনি করবেন না।

সিস্টেমগুলি পরীক্ষিত হয়েছে (তবে এখনও এটি ব্যর্থ হতে পারে):

  • উবুন্টু 16.04, ডিফল্ট মাইএসকিএল, ইনানোডবি, প্রতি টেবিলের জন্য পৃথক ফাইল
  • উবুন্টু 18.04, ডিফল্ট মাইএসকিএল, ইনানোডবি, প্রতি টেবিলের জন্য পৃথক ফাইল

এর মানে কি

  1. sudoবিশেষাধিকার পায় এবং আপনার কাছে ডাটাবেস ক্লোন করার পর্যাপ্ত সঞ্চয় স্থান রয়েছে যাচাই করে
  2. রুট মাইএসকিএল সুবিধাগুলি পান
  3. বর্তমান গিট শাখার নামে একটি নতুন ডাটাবেস তৈরি করে
  4. নতুন ডাটাবেসে ক্লোনগুলির কাঠামো
  5. ইনোনডাবের জন্য পুনরুদ্ধার মোডে স্যুইচ করে
  6. নতুন ডাটাবেসে ডিফল্ট ডেটা মুছে দেয়
  7. বন্ধ করে দেয় mysql
  8. নতুন ডাটাবেসে ক্লোনস ডেটা
  9. মাইএসকিএল শুরু হয়
  10. লিঙ্কগুলি নতুন ডাটাবেসে ডেটা আমদানি করে
  11. ইনোনডাবের জন্য পুনরুদ্ধার মোডের বাইরে চলে যায়
  12. মাইএসকিএল পুনরায় চালু করুন
  13. Mysql ব্যবহারকারীকে ডাটাবেসে অ্যাক্সেস দেয়
  14. অস্থায়ী ফাইলগুলি পরিষ্কার করে

এর সাথে কীভাবে তুলনা করা যায় mysqldump

3 জিবি ডাটাবেসে ব্যবহার করে mysqldumpএবং mysqlআমার মেশিনে 40-50 মিনিট সময় লাগবে। এই পদ্ধতিটি ব্যবহার করে, একই প্রক্রিয়াটিতে কেবল ~ 8 মিনিট সময় লাগবে।

আমরা এটি কীভাবে ব্যবহার করি

আমাদের কোডের পাশাপাশি আমাদের এসকিউএল পরিবর্তনগুলি সংরক্ষণ করা হয়েছে এবং আপগ্রেড প্রক্রিয়াটি ত্রুটি থাকলে পুনরুদ্ধার করতে ডাটাবেসটির ব্যাকআপ তৈরি করে প্রতিটি সেট পরিবর্তনের সাথে সাথে উত্পাদন এবং বিকাশ উভয় ক্ষেত্রেই স্বয়ংক্রিয় হয়। আমরা যখন সমস্যার সমাধান করেছি তখন হ'ল আমরা যখন ডাটাবেস পরিবর্তন নিয়ে দীর্ঘমেয়াদী প্রকল্পে কাজ করছিলাম এবং বাগ বা তিনটি ঠিক করার জন্য এর মাঝখানে শাখাগুলি স্যুইচ করতে হয়েছিল।

অতীতে, আমরা সমস্ত শাখার জন্য একটি একক ডাটাবেস ব্যবহার করতাম এবং যখনই আমরা একটি শাখায় স্যুইচ করেছিলাম যা নতুন ডাটাবেস পরিবর্তনের সাথে সামঞ্জস্যপূর্ণ ছিল না তখন ডাটাবেসটিকে পুনর্নির্মাণ করতে হবে। এবং আমরা যখন আবার স্যুইচ করেছি, আমাদের আবারও আপগ্রেডগুলি চালাতে হবে।

আমরা mysqldumpবিভিন্ন শাখার জন্য ডাটাবেসটিকে নকল করার চেষ্টা করেছি , তবে অপেক্ষা করার সময়টি খুব দীর্ঘ (40-50 মিনিট) ছিল এবং আমরা এর মধ্যে আর কিছু করতে পারি নি।

এই সমাধানটি ডাটাবেস ক্লোনের সময়কে 1/5 বার সংক্ষিপ্ত করে রেখেছিল (দীর্ঘ লাঞ্চের পরিবর্তে কফি এবং বাথরুম বিরতি ভাবেন)।

সাধারণ কাজ এবং তাদের সময়

অসামঞ্জস্য ডাটাবেস পরিবর্তনের সাথে শাখাগুলির মধ্যে স্যুইচ করাতে একটি একক ডাটাবেসে 50+ মিনিট সময় লাগে তবে প্রাথমিক কোডআপের পরে mysqldumpবা এই কোডটির পরে মোটেই সময় লাগে না । এই কোডটি এর চেয়ে 5 গুন বেশি দ্রুত হতে পারে mysqldump

এখানে কয়েকটি সাধারণ কাজ এবং প্রতিটি পদ্ধতিতে তারা কত সময় নিবে তা এখানে:

ডাটাবেস পরিবর্তন সহ বৈশিষ্ট্য শাখা তৈরি করুন এবং ততক্ষনে মার্জ করুন:

  • একক ডাটাবেস: 5 মিনিট
  • সাথে ক্লোন করুন mysqldump: 50-60 মিনিট
  • এই কোডটি দিয়ে ক্লোন করুন: minutes 18 মিনিট

ডাটাবেস পরিবর্তন সহ বৈশিষ্ট্য শাখা তৈরি করুন, masterবাগফিক্সের জন্য স্যুইচ করুন, বৈশিষ্ট্য শাখায় একটি সম্পাদনা করুন এবং মার্জ করুন:

  • একক ডাটাবেস: ~ 60 মিনিট
  • সাথে ক্লোন করুন mysqldump: 50-60 মিনিট
  • এই কোডটি দিয়ে ক্লোন করুন: minutes 18 মিনিট

ডাটাবেস পরিবর্তন সহ বৈশিষ্ট্য শাখা তৈরি করুন, masterঅন্তর্নির্মিত বৈশিষ্ট্য শাখায় সম্পাদনা করার সময় একটি বাগফিক্সের জন্য 5 বার স্যুইচ করুন এবং মার্জ করুন:

  • একক ডাটাবেস: hours 4 ঘন্টা, 40 মিনিট
  • সাথে ক্লোন করুন mysqldump: 50-60 মিনিট
  • এই কোডটি দিয়ে ক্লোন করুন: minutes 18 মিনিট

কোড

আপনি উপরের সমস্ত কিছু না পড়ে এবং বুঝতে না পারলে এটি ব্যবহার করবেন না।

#!/bin/bash
set -e

# This script taken from: https://stackoverflow.com/a/57528198/526741

function now {
    date "+%H:%M:%S";
}

# Leading space sets messages off from step progress.
echosuccess () {
    printf "\e[0;32m %s: %s\e[0m\n" "$(now)" "$1"
    sleep .1
}
echowarn () {
    printf "\e[0;33m %s: %s\e[0m\n" "$(now)" "$1"
    sleep .1
}
echoerror () {
    printf "\e[0;31m %s: %s\e[0m\n" "$(now)" "$1"
    sleep .1
}
echonotice () {
    printf "\e[0;94m %s: %s\e[0m\n" "$(now)" "$1"
    sleep .1
}
echoinstructions () {
    printf "\e[0;104m %s: %s\e[0m\n" "$(now)" "$1"
    sleep .1
}
echostep () {
    printf "\e[0;90mStep %s of 13:\e[0m\n" "$1"
    sleep .1
}

MYSQL_CNF_PATH='/etc/mysql/mysql.conf.d/recovery.cnf'
OLD_DB='YOUR_DATABASE_NAME'
USER='YOUR_MYSQL_USER'

# You can change NEW_DB to whatever you like
# Right now, it will append the current git branch name to the existing database name
BRANCH=`git rev-parse --abbrev-ref HEAD`
NEW_DB="${OLD_DB}__$BRANCH"

THIS_DIR=./site/upgrades
DB_CREATED=false

tmp_file () {
    printf "$THIS_DIR/$NEW_DB.%s" "$1"
}
sql_on_new_db () {
    mysql $NEW_DB --unbuffered --skip-column-names -u root -p$PASS 2>> $(tmp_file 'errors.log')
}

general_cleanup () {
    echoinstructions 'Leave this running while things are cleaned up...'

    if [ -f $(tmp_file 'errors.log') ]; then
        echowarn 'Additional warnings and errors:'
        cat $(tmp_file 'errors.log')
    fi

    for f in $THIS_DIR/$NEW_DB.*; do
        echonotice 'Deleting temporary files created for transfer...'
        rm -f $THIS_DIR/$NEW_DB.*
        break
    done

    echonotice 'Done!'
    echoinstructions "You can close this now :)"
}

error_cleanup () {
    exitcode=$?

    # Just in case script was exited while in a prompt
    echo

    if [ "$exitcode" == "0" ]; then
        echoerror "Script exited prematurely, but exit code was '0'."
    fi

    echoerror "The following command on line ${BASH_LINENO[0]} exited with code $exitcode:"
    echo "             $BASH_COMMAND"

    if [ "$DB_CREATED" = true ]; then
        echo
        echonotice "Dropping database \`$NEW_DB\` if created..."
        echo "DROP DATABASE \`$NEW_DB\`;" | sql_on_new_db || echoerror "Could not drop database \`$NEW_DB\` (see warnings)"
    fi

    general_cleanup

    exit $exitcode
}

trap error_cleanup EXIT

mysql_path () {
    printf "/var/lib/mysql/"
}
old_db_path () {
    printf "%s%s/" "$(mysql_path)" "$OLD_DB"
}
new_db_path () {
    printf "%s%s/" "$(mysql_path)" "$NEW_DB"
}
get_tables () {
    (sudo find /var/lib/mysql/$OLD_DB -name "*.frm" -printf "%f\n") | cut -d'.' -f1 | sort
}

STEP=0


authenticate () {
    printf "\e[0;104m"
    sudo ls &> /dev/null
    printf "\e[0m"
    echonotice 'Authenticated.'
}
echostep $((++STEP))
authenticate

TABLE_COUNT=`get_tables | wc -l`
SPACE_AVAIL=`df -k --output=avail $(mysql_path) | tail -n1`
SPACE_NEEDED=(`sudo du -s $(old_db_path)`)
SPACE_ERR=`echo "$SPACE_AVAIL-$SPACE_NEEDED" | bc`
SPACE_WARN=`echo "$SPACE_AVAIL-$SPACE_NEEDED*3" | bc`
if [ $SPACE_ERR -lt 0 ]; then
    echoerror 'There is not enough space to branch the database.'
    echoerror 'Please free up some space and run this command again.'
    SPACE_AVAIL_FORMATTED=`printf "%'d" $SPACE_AVAIL`
    SPACE_NEEDED_FORMATTED=`printf "%'${#SPACE_AVAIL_FORMATTED}d" $SPACE_NEEDED`
    echonotice "$SPACE_NEEDED_FORMATTED bytes needed to create database branch"
    echonotice "$SPACE_AVAIL_FORMATTED bytes currently free"
    exit 1
elif [ $SPACE_WARN -lt 0 ]; then
    echowarn 'This action will use more than 1/3 of your available space.'
    SPACE_AVAIL_FORMATTED=`printf "%'d" $SPACE_AVAIL`
    SPACE_NEEDED_FORMATTED=`printf "%'${#SPACE_AVAIL_FORMATTED}d" $SPACE_NEEDED`
    echonotice "$SPACE_NEEDED_FORMATTED bytes needed to create database branch"
    echonotice "$SPACE_AVAIL_FORMATTED bytes currently free"
    printf "\e[0;104m"
    read -p " $(now): Do you still want to branch the database? [y/n] " -n 1 -r CONFIRM
    printf "\e[0m"
    echo
    if [[ ! $CONFIRM =~ ^[Yy]$ ]]; then
        echonotice 'Database was NOT branched'
        exit 1
    fi
fi

PASS='badpass'
connect_to_db () {
    printf "\e[0;104m %s: MySQL root password: \e[0m" "$(now)"
    read -s PASS
    PASS=${PASS:-badpass}
    echo
    echonotice "Connecting to MySQL..."
}
create_db () {
    echonotice 'Creating empty database...'
    echo "CREATE DATABASE \`$NEW_DB\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" | mysql -u root -p$PASS 2>> $(tmp_file 'errors.log')
    DB_CREATED=true
}
build_tables () {
    echonotice 'Retrieving and building database structure...'
    mysqldump $OLD_DB --skip-comments -d -u root -p$PASS 2>> $(tmp_file 'errors.log') | pv --width 80  --name " $(now)" > $(tmp_file 'dump.sql')
    pv --width 80  --name " $(now)" $(tmp_file 'dump.sql') | sql_on_new_db
}
set_debug_1 () {
    echonotice 'Switching into recovery mode for innodb...'
    printf '[mysqld]\ninnodb_file_per_table = 1\ninnodb_force_recovery = 1\n' | sudo tee $MYSQL_CNF_PATH > /dev/null
}
set_debug_0 () {
    echonotice 'Switching out of recovery mode for innodb...'
    sudo rm -f $MYSQL_CNF_PATH
}
discard_tablespace () {
    echonotice 'Unlinking default data...'
    (
        echo "USE \`$NEW_DB\`;"
        echo "SET foreign_key_checks = 0;"
        get_tables | while read -r line;
            do echo "ALTER TABLE \`$line\` DISCARD TABLESPACE; SELECT 'Table \`$line\` imported.';";
        done
        echo "SET foreign_key_checks = 1;"
    ) > $(tmp_file 'discard_tablespace.sql')
    cat $(tmp_file 'discard_tablespace.sql') | sql_on_new_db | pv --width 80 --line-mode --size $TABLE_COUNT --name " $(now)" > /dev/null
}
import_tablespace () {
    echonotice 'Linking imported data...'
    (
        echo "USE \`$NEW_DB\`;"
        echo "SET foreign_key_checks = 0;"
        get_tables | while read -r line;
            do echo "ALTER TABLE \`$line\` IMPORT TABLESPACE; SELECT 'Table \`$line\` imported.';";
        done
        echo "SET foreign_key_checks = 1;"
    ) > $(tmp_file 'import_tablespace.sql')
    cat $(tmp_file 'import_tablespace.sql') | sql_on_new_db | pv --width 80 --line-mode --size $TABLE_COUNT --name " $(now)" > /dev/null
}
stop_mysql () {
    echonotice 'Stopping MySQL...'
    sudo /etc/init.d/mysql stop >> $(tmp_file 'log')
}
start_mysql () {
    echonotice 'Starting MySQL...'
    sudo /etc/init.d/mysql start >> $(tmp_file 'log')
}
restart_mysql () {
    echonotice 'Restarting MySQL...'
    sudo /etc/init.d/mysql restart >> $(tmp_file 'log')
}
copy_data () {
    echonotice 'Copying data...'
    sudo rm -f $(new_db_path)*.ibd
    sudo rsync -ah --info=progress2 $(old_db_path) --include '*.ibd' --exclude '*' $(new_db_path)
}
give_access () {
    echonotice "Giving MySQL user \`$USER\` access to database \`$NEW_DB\`"
    echo "GRANT ALL PRIVILEGES ON \`$NEW_DB\`.* to $USER@localhost" | sql_on_new_db
}

echostep $((++STEP))
connect_to_db

EXISTING_TABLE=`echo "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$NEW_DB'" | mysql --skip-column-names -u root -p$PASS 2>> $(tmp_file 'errors.log')`
if [ "$EXISTING_TABLE" == "$NEW_DB" ]
    then
        echoerror "Database \`$NEW_DB\` already exists"
        exit 1
fi

echoinstructions "The hamsters are working. Check back in 5-10 minutes."
sleep 5

echostep $((++STEP))
create_db
echostep $((++STEP))
build_tables
echostep $((++STEP))
set_debug_1
echostep $((++STEP))
discard_tablespace
echostep $((++STEP))
stop_mysql
echostep $((++STEP))
copy_data
echostep $((++STEP))
start_mysql
echostep $((++STEP))
import_tablespace
echostep $((++STEP))
set_debug_0
echostep $((++STEP))
restart_mysql
echostep $((++STEP))
give_access

echo
echosuccess "Database \`$NEW_DB\` is ready to use."
echo

trap general_cleanup EXIT

যদি সবকিছু সুষ্ঠুভাবে চলে যায় তবে আপনার এমন কিছু দেখা উচিত:

উদাহরণস্বরূপ ডাটাবেসের জন্য স্ক্রিপ্ট আউটপুট স্ক্রিনশট


0

গ্রেগের উত্তর ছাড়াও , এটি new_db_nameএখনও বিদ্যমান না থাকলে এটি সবচেয়ে সহজ এবং দ্রুততম উপায় :

echo "create database new_db_name" | mysql -u <user> -p <pwd> 
mysqldump -u <user> -p <pwd> db_name | mysql -u <user> -p <pwd> new_db_name

0

আপনার যদি আপনার মূল ডাটাবেসে ট্রিগার থাকে তবে আপনি আমদানির আগে প্রতিস্থাপনটি পাইপ করে "ট্রিগার ইতিমধ্যে উপস্থিত" ত্রুটি এড়াতে পারবেন:

mysqldump -u olddbuser -p -d olddbname | sed "s/`olddbname`./`newdbname`./" | mysql -u newdbuser -p -D newdbname

-4

এটি করার কোনও পদ্ধতি আছে বলে আমি মনে করি না। পিএইচপিএমআইএডমিন যখন এটি করে, তখন এটি ডিবি ডাম্প করে নতুন নামে এটি পুনরায় সন্নিবেশ করায়।

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