আমি কি একটি পূর্ণ mysql mysqldump ফাইল থেকে একটি টেবিল পুনরুদ্ধার করতে পারি?


194

আমার কাছে আমাদের টেবিলগুলির প্রায় 440 মেগের সমন্বয়ে আমার মাইএসকিএল ডেটাবেসের একটি মাইএসকিএলডাম ব্যাকআপ রয়েছে। আমি কেবলমাত্র একটি টেবিলের বিষয়বস্তু পুনরুদ্ধার করতে চাই মাইএসকিএলডাম form এটা কি সম্ভব? তাত্ত্বিকভাবে, আমি কেবলমাত্র সারণিটি কাটতে পারি যা আমার সারণীটি পুনর্নির্মাণ করতে পারে তবে সেই আকারের কোনও পাঠ্য দলিল কীভাবে কার্যকরভাবে সম্পাদনা করতে হয় তা আমি জানি না।


2
FWIW, আপনি মাইডাম্পার ব্যবহার করতে পারেন । এটি মাইএসকিলডাম্পের মতো একটি লজিকাল ডাম্প তৈরি করে, তবে এটি টেবিলের জন্য পৃথক পৃথক ফাইল দেয় এবং এটি ডাম্পিং এবং লোডিং মাল্টি-থ্রেড উভয়ই করতে পারে, সুতরাং এতে কম সময় লাগে।
বিল কারভিন 21

উত্তর:


289

আপনি চাইলে কেবল টেবিলটি বের করতে আপনি সেড ব্যবহার করার চেষ্টা করতে পারেন।

ধরা যাক আপনার টেবিলের নাম mytableএবং ফাইল mysql.dump ফাইলটি আপনার বিশাল ডাম্পযুক্ত ফাইল:

$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump

এটি পরবর্তী টেবিলের সাথে সামঞ্জস্যপূর্ণ এবং এর mytable.dumpমধ্যে অবস্থিত যা ফাইলটিতে অনুলিপি করবে ।CREATE TABLE mytableCREATE TABLE

তারপরে আপনি mytable.dumpটেবিলের কাঠামো mytableএবং ডেটা (একটি তালিকা INSERT) যুক্ত ফাইল সমন্বয় করতে পারেন ।


5
এটি আমার জবাবের চেয়েও সুন্দর, যেহেতু এটি ক্রিয়েট টেবিলটিও যত্ন করে, তবে আপনার ব্যাককোটগুলি দিয়ে অনুসন্ধান করা উচিত যাতে "থিসিস্মিলেটলেট" নামে অন্য একটি টেবিল না পাওয়া যায়।
জেসিসিসি

1
সত্য। আমি নিশ্চিত ছিলাম না যে সমস্ত মাইএসকিএল ডাম্পের টেবিলের নামগুলি সর্বদা ব্যাককোট দ্বারা বেষ্টিত থাকে বা যদি "টেবিল তৈরি করুন মাইটেবল "ও সম্ভব হতে পারে। ডাম্প কেমন লাগে তা আমরা যদি জানি তবে আমরা সহজেই প্রথম রেজিএক্সএক্সটিকে মানিয়ে নিতে পারি। দ্বিতীয় সমস্যাটি হতে পারে যদি টেবিলের Mytable অনন্য না হয় (একটি ডেটাবেস db1 এবং অন্য একটি ডাটাবেস db2)। উভয়ই mytable.dump ফাইলটিতে রফতানি হবে। যদি টেবিলটি অনন্য না হয় তবে আমরা ঠিক একই ডাটাবেসটি বের করার জন্য প্রথমে তৈরি ডেটাবেসের সাহায্যে একই সেড কমান্ডটি ব্যবহার করতে পারি। তারপরে, তৈরি টেবিলের সাথে সেড কমান্ডটি ব্যবহার করুন।
uloBasEI

13
খুব সুন্দর! শীর্ষে ড্রপ ট্যাবলেট যুক্ত করতে এবং ফাইলের নীচে ড্রপ টেবিল [পরবর্তী সারণি] সরিয়ে ফেলার কথা মনে রাখবেন।
নাথান

20
ড্রপ ট্যাবলেট যুক্ত / অপসারণ না করার জন্য, ক্রিট টেবিলের Table structure for tableসাথে মিলের পরিবর্তে মন্তব্যে মিলানো আরও কার্যকর । এটি নিশ্চিত করবে যে যদি কেউ তার ড্রপ টেবিলে স্টেটমেন্টটি সরিয়ে ফেলার কথা ভুলে যায় এবং একক-কমান্ড টেবিল পুনরুদ্ধারের জন্য পাইপিংয়ের অনুমতি দেয় (gzip | sed | mysql)। যাইহোক, এই সমাধানটি মাইএসকিএলড্প মন্তব্য সিনট্যাক্সের উপর নির্ভরশীল (আমি জানি না এটি কতটা মানিক)।
অলেক্সা

12
Olexa এর সংশোধন সহ এটা নিখুঁত আছে: কিন্তু -n -e '/ ছক জন্য গঠন * `mytable /, / ছক গঠনের জন্য; / p &।' Whole.sql> mytable.sql
deeenes

120

আমি uBBEEI এর সেড কমান্ডের একটি পরিবর্তিত সংস্করণ ব্যবহার করেছি। এটি পূর্ববর্তী ডিআরওপি কমান্ডকে অন্তর্ভুক্ত করে এবং মেসকিউএল আপনার টেবিলে ডেটা ডাম্পিং (আনলক) না করা পর্যন্ত পড়া হয়। আমার জন্য কাজ করেছেন (পুনরায়) ওয়ার্ল্ডপ্রেস সাইটগুলির একগুচ্ছ wp_users আমদানি করে ।

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql

3
উপরের উত্তর হিসাবে বেছে নেওয়া চেয়ে এটি আসলে আরও ভাল সমাধান। বিশ্বাস করা যায় না এটি আরও বেশি কিছু অর্জন করতে পারে নি।
ধনী

9
আমি টেবিলের নামটিতে কমপক্ষে ব্যাকটিক কোট যুক্ত করার পরামর্শ দিচ্ছি: টেবিলের সাথে ম্যাচের টিকিট `mytable`এড়াতে mytable2এবং এ জাতীয় ক্ষেত্রে যেমন ছিল তেমন।
বারটেকব্রাক

3
আপনি সবেমাত্র আমার গাধা বাঁচিয়েছেন
গ্যাব্রিয়েল আলাক

1
@ ইউজার 706420 হুম, আপনি কি নিশ্চিত যে আপনার টার্মিনাল দোষ দেয়নি? sedএনকোডিংয়ে হস্তক্ষেপ করা উচিত নয় ...
ব্রায়েন

6
এসকিউএল ফাইলগুলি না থাকাতে DROP TABLE(আমার মাইএসকিউএল ডাম্পের এটি ছিল না) তারা ব্যবহার করতে চাইতে পারে: sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sqlএটি মাইএসকিউএল ডাম্পের প্রতিটি টেবিলের আগে প্রদত্ত টেবিল মন্তব্যগুলিকে ব্যবহার করে এবং লাইন /*!40101 SET @saved_cs_client = @@character_set_client */;অন্তর্ভুক্ত করার বিষয়টি নিশ্চিত করে ।
hamx0r

50

এটি আরও সহজে করা যায়? এটি আমি এটি করেছিলাম:

একটি অস্থায়ী ডাটাবেস তৈরি করুন (যেমন পুনরুদ্ধার):

mysqladmin -u root -p পুনরুদ্ধার তৈরি করুন

অস্থায়ী ডাটাবেসে পূর্ণ ডাম্প পুনরুদ্ধার করুন:

mysql -u root -p <ফুলডাম্প.এসকিএল পুনরুদ্ধার করুন

আপনি যে টেবিলটি পুনরুদ্ধার করতে চান তা ডাম্প করুন:

mysqldump পুনরুদ্ধার Mytable> mytable.sql

অন্য ডাটাবেসে টেবিলটি আমদানি করুন:

mysql -u root -p ডাটাবেস <mytable.sql


2
এটি বেশিরভাগ মানুষের প্রয়োজন।
sjas

2
এই সম্পাদনা পরামর্শ অনুসারে , আপনি কেবলমাত্র একটি ডাটাবেস পুনরুদ্ধার করেছেন এবং অন্য সমস্ত কিছু ধ্বংস করবেন না তা নিশ্চিত করতে আপনার "--one-database" প্যারামিটার যুক্ত করা উচিত ।
এসএল বার্থ - মনিকা পুনরায়

7
সত্যিই বিশাল ডিবিতে এটি খুব অদ্ভুত হতে পারে - 100 এমবি এর এক টেবিলের জন্য 150 জিবি ডেটা পুনরুদ্ধার করুন।
এনাইবি

আমি কেবল "--one-database" ব্যতীত এটি চালিয়েছি এবং এটি এখনও টেবিলগুলিকে একদম সূক্ষ্মভাবে মার্জ করে। এটি আমার বিদ্যমান সারণীগুলি সরিয়ে দেয় না।
কাসিম

1
খুব খারাপ অভ্যাস! আমার ডাম্পে কয়েকটি ডিবি ছিল, এবং কেবলমাত্র একটি পুনরুদ্ধার করার চেষ্টা করছিলাম, অন্য সমস্ত মুছে ফেলেছিলাম।
AndreyP

11

একটি সহজ সমাধান হ'ল আপনি কেবল সারণীর একটি ডাম্প তৈরি করতে চান যা আপনি পৃথকভাবে পুনরুদ্ধার করতে চান। নিম্নলিখিত সিনট্যাক্সের সাহায্যে আপনি mysqldump কমান্ডটি ব্যবহার করতে পারেন:

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql

তারপরে এটিকে স্বাভাবিক হিসাবে আমদানি করুন এবং এটি কেবল ডাম্পড টেবিলটি আমদানি করবে।


9

এক উপায় বা অন্য যে কোনও প্রক্রিয়া এটি করতে ডাম্পের পুরো পাঠ্যটি অতিক্রম করে কোনওভাবে পার্স করতে হবে। আমি কেবল গ্রিপ করতাম

INSERT INTO `the_table_i_want`

এবং আউটপুটটি mysql এ পাইপ করুন। আপনি INSERT এর সঠিক উপায়ে পাচ্ছেন তা নিশ্চিত করার জন্য ডাম্পের প্রথম টেবিলটি একবার দেখুন।

সম্পাদনা: ঠিক আছে, ঠিক এখনই ফরম্যাটিংটি পেয়েছেন।


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

6
যদি আপনি মনে করেন, grep ভালবাস, তাহলে awk যখন আপনি শিখতে আপনি তার খুশি সেক্স স্লেভ হয়ে হবে: en.wikipedia.org/wiki/Awk
JCCyC

7

আপনার @ ব্রায়ান কমান্ডটি চেষ্টা করা উচিত তবে `ডিলিমিটার দিয়ে অন্যথায় আপনি উপসর্গ বা প্রত্যয়যুক্ত টেবিলগুলিও বের করতে পারবেন, আমি সাধারণত এটি করি:

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql

এছাড়াও পরীক্ষার উদ্দেশ্যে, আপনি আমদানির আগে সারণির নাম পরিবর্তন করতে পারেন:

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql

আমদানি করতে আপনি তারপর mysql কমান্ডটি ব্যবহার করতে পারেন:

mysql -u root -p'password' mydatabase < mytable_restore.sql

6
  1. ব্যাকআপ

    $ mysqldump -A | gzip > mysqldump-A.gz
  2. একক টেবিলটি পুনরুদ্ধার করুন

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
    

4

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



3
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

এটি উপরের অন্যান্যগুলির তুলনায় ভাল সমাধান কারণ সমস্ত এসকিউএল ডাম্পের DROP TABLEবিবৃতি থাকে না । এই এক সব ধরণের ডাম্প কাজ করবে।


2

এটিও সাহায্য করতে পারে।

# mysqldump -u root -p database0 > /tmp/database0.sql
# mysql -u root -p -e 'create database database0_bkp'
# mysql -u root -p database0_bkp < /tmp/database0.sql
# mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want'

2

টেবিলটি উভয় ডাম্প এবং ডাটাবেসের মধ্যে একই কাঠামো সহ উপস্থিত থাকতে হবে।

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

অথবা

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`

1

বেশিরভাগ আধুনিক পাঠ্য সম্পাদকগণ যদি আপনার সিস্টেমের উপর নির্ভর করে তবে কোনও মাপের কোনও পাঠ্য ফাইল হ্যান্ডেল করতে সক্ষম হওয়া উচিত।

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

তারপরে আমি সেই টেবিলটি মূল ডাটাবেসে আমদানি করেছি।

এটি ক্লান্তিকর তবে সহজ ছিল। শুভকামনা।


1

আপনি vi সম্পাদক ব্যবহার করতে পারেন। টাইপ করুন:

vi -o mysql.dump mytable.dump

পুরো ডাম্প mysql.dumpএবং একটি নতুন ফাইল উভয়ই খুলতে mytable.dump। টিপে লাইনের মধ্যে উপযুক্ত সন্নিবেশ সন্ধান করুন /এবং তারপরে একটি বাক্যাংশ টাইপ করুন, উদাহরণস্বরূপ: "` mytable` sertোকান ", তারপরে সেই লাইনটি অনুলিপি করুন yy। পরবর্তী ফাইল পাল্টান ctrl+wতারপর down arrow key, সঙ্গে কপি লাইন পেস্ট pp। শেষ পর্যন্ত নতুন ফাইলটি টাইপ করে :wqএবং বেশ কয়েকটি vi সম্পাদক দ্বারা সংরক্ষণ করুন :q

মনে রাখবেন যদি আপনি একাধিক টিপে ব্যবহার করে তথ্য ডাম্প আছে আপনি ব্যবহার একবারে (Yank) তাদের সব অনুলিপি করতে পারেন Nyyযা Nলাইনের সংখ্যা অনুলিপি করা হয়।

আমি এটি 920 এমবি আকারের একটি ফাইল দিয়ে করেছি।


0

নোটপ্যাড ++ বা ভিমের মতো একটি সুনির্দিষ্ট পাঠ্য সম্পাদক পান (আপনি যদি এর সাথে ইতিমধ্যে দক্ষ হন)। সারণির নাম সন্ধান করুন এবং আপনি এই টেবিলের জন্য কেবল CREATE, ALTER, এবং INSERT কমান্ড হাইলাইট করতে সক্ষম হবেন। মাউসের পরিবর্তে আপনার কীবোর্ডের সাহায্যে নেভিগেট করা সহজ হতে পারে। এবং আমি নিশ্চিত করব যে আপনি প্রচুর পরিমাণে বা র‍্যামযুক্ত কোনও মেশিনে রয়েছেন যাতে এটি একবারে পুরো ফাইলটি লোড করতে কোনও সমস্যা না হয়। একবার আপনার প্রয়োজনীয় সারিগুলি হাইলাইট এবং অনুলিপি করার পরে, কেবল অনুলিপি করা অংশটিকে নিজের ব্যাকআপ ফাইলটিতে ব্যাক আপ করা এবং এটি মাইএসকিউএলে আমদানি করা ভাল ধারণা হবে।


1
এটি করা খুব সহজ এবং এমনকি নতুনদের দ্বারা বোধগম্য। আমি জানি না, কেন এটি নিম্নমানের।
কার্ল জোহান ভ্যালনার

0

এসকিউএল খন্ডে "সারণী জন্য টেবিল গঠন সঙ্গে বন্ধ অবরোধ করা হয়েছে my_table" এবং "টেবিলের জন্য ডাম্পিং তথ্য my_table।"

আপনি বিভিন্ন বিভাগের লাইন নম্বর পেতে নিম্নলিখিতভাবে একটি উইন্ডোজ কমান্ড লাইন ব্যবহার করতে পারেন। প্রয়োজনীয়ভাবে অনুসন্ধান করা স্ট্রিং সামঞ্জস্য করুন।

সারণী for "sql.txt এর জন্য / এন" সন্ধান করুন

নিম্নলিখিতগুলি ফিরে আসবে:

---------- এসকিউএল.টিএক্সটি

[4384] - টেবিলের জন্য টেবিল কাঠামো my_table

[4500] - টেবিলের জন্য ডেপিং ডেটা my_table

[4514] - টেবিলের জন্য টেবিল কাঠামো some_other_table

... ইত্যাদি

এটি আপনাকে প্রয়োজনীয় লাইন নম্বরগুলি পেয়েছে ... এখন, যদি আমি কেবল তাদের কীভাবে ব্যবহার করতে হয় তা তদন্ত করতে পারতাম।


0

'08 এ ফিরে আমারও এটি করা দরকার ছিল। আমি একটি পার্ল স্ক্রিপ্ট লিখেছিলাম যা এটি করবে এবং এটি এখন আমার পছন্দের পদ্ধতি। এটি কীভাবে awk এ করবেন বা অন্যত্র কীভাবে পুনরুদ্ধার করবেন এবং কীভাবে নিষ্কাশন করবেন সে সম্পর্কেও সংক্ষিপ্তসার রইল। সম্প্রতি আমি তালিকায় এই সেড পদ্ধতিটি যুক্ত করেছি। আপনি এখানে স্ক্রিপ্ট এবং অন্যান্য পদ্ধতি পেতে পারবেন: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html


0

আমি কয়েকটি বিকল্প চেষ্টা করেছিলাম, যা অবিশ্বাস্যভাবে ধীর ছিল। এটি কয়েক মিনিটের মধ্যে একটি 360 জিবি ডাম্পটিকে তার টেবিলগুলিতে বিভক্ত করে:

আমি কীভাবে mysqldump থেকে আউটপুটকে ছোট ফাইলগুলিতে ভাগ করব?


0

পূর্বে উল্লিখিত 'সেড' সমাধানগুলি দুর্দান্ত তবে 100% সুরক্ষিত নয় বলে উল্লেখ করা হয়েছে

  • ডেটাযুক্ত আপনার সাথে ইনসার্ট কমান্ড থাকতে পারে: ... টেবিল তৈরি করুন ... (যাই হোক না কেন) ... মাইটেবল ...

  • বা এমনকি সঠিক স্ট্রিং "টেবিল তৈরি করুন` mytable`; " আপনি উদাহরণস্বরূপ যদি ডিএমএল কমান্ডগুলি সঞ্চয় করে থাকেন!

(এবং যদি টেবিলটি বিশাল হয় তবে আপনি নিজে এটি পরীক্ষা করতে চান না)

আমি ব্যবহৃত ডাম্প সংস্করণটির সঠিক বাক্য গঠনটি যাচাই করব এবং আরও সীমাবদ্ধ প্যাটার্ন অনুসন্ধান করব:

"। *" এড়িয়ে চলুন এবং "of" ব্যবহার করুন যাতে আমরা লাইনের শুরু শুরু করি start এবং আমি প্রাথমিক 'ড্রপ' ধরতে পছন্দ করব

সব মিলিয়ে, এটি আমার পক্ষে আরও ভাল কাজ করে:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.