আমি কীভাবে কোনও ডাম্প ফাইল থেকে একটি মাইএসকিউএল পুনরুদ্ধার দ্রুত করতে পারি?


28

আমি একটি নতুন সার্ভারের একটি খালি ডাটাবেসে একটি মাইএসকিल्डম্প ফাইল থেকে 30 জিবি ডাটাবেস পুনরুদ্ধার করছি। ডাম্প ফাইল থেকে এসকিউএল চালানোর সময়, পুনরুদ্ধারটি খুব দ্রুত শুরু হয় এবং তারপরে ধীরে ধীরে ধীরে ধীরে শুরু হয়। স্বতন্ত্র সন্নিবেশগুলি এখন 15+ সেকেন্ড সময় নিচ্ছে। টেবিলগুলি বেশিরভাগই একটি ছোট ইনোডিবি সহ মাইআইএসএএম থাকে। সার্ভারের অন্য কোনও সক্রিয় সংযোগ নেই। SHOW PROCESSLIST;কেবল পুনরুদ্ধার থেকে সন্নিবেশ দেখায় (এবং প্রসেসলিস্টটি নিজেই দেখান)।

নাটকীয় মন্দার কারণ হতে পারে এমন কি কারও কি ধারণা আছে?

এটির কোনও অগ্রগতি চলাকালীন পুনরুদ্ধারের গতিতে পরিবর্তন করতে পারে এমন কোনও মাইএসকিউএল ভেরিয়েবল রয়েছে?


সারণীর প্রকারগুলি সংশোধন করার জন্য সম্পাদিত
ডেভ ভুলেজ

উত্তর:


26

একটি জিনিস যা প্রক্রিয়াটি ধীর করে দিচ্ছে তা হ'ল কী_বফার_সাইজ , যা সূচক ব্লকের জন্য ব্যবহৃত বাফার আকার। আপনার র‌্যামের কমপক্ষে 30% এ টিউন করুন বা পুনরায় সূচি প্রক্রিয়াটি সম্ভবত খুব ধীর হবে।

রেফারেন্সের জন্য, আপনি যদি InnoDB এবং বিদেশী কীগুলি ব্যবহার করছিলেন তবে আপনি বিদেশী কী চেকগুলি অক্ষম করে দিতে পারেন এবং শেষে এটি পুনরায় সক্ষম করতে পারবেন (ব্যবহার করে SET FOREIGN_KEY_CHECKS=0এবং SET FOREIGN_KEY_CHECKS=1)।


1
আমি দুটি জিনিস পেয়েছি: কী_বফার_সাইজটি 8 এমবিতে সেট করা হয়েছিল এবং বিদেশী কীগুলির সাথে মিশ্রণে একটি ইনোএনডিবি টেবিল ছিল। কী_বফার_সাইজ 1 জিবিতে বাড়িয়ে অস্থায়ীভাবে বিদেশী কী চেকগুলি বন্ধ করে দিয়েছে। পুনরুদ্ধারটি 5 মিনিটের মধ্যে শেষ হয়েছে। ধন্যবাদ!
ডেভ ফ্যাসাক

কি দারুন! খুশী হ'ল :)
মার্কো রামোস

2
আমি কেবল লক্ষ্য করেছি যে আমি '5' মিনিট টাইপ করেছি। আমি নিশ্চিত যে এটি 50 মিনিটের মতো বেশি ছিল তবে এখনও আরও যুক্তিসঙ্গত ;-)
ডেভ ফ্যাস্টাক

5
key_buffer_size মাইআইএসএএম এর জন্য।
ফার্নান্দো ফ্যাব্রেতি

@ ফার্নান্দো ফাবেরেটি - এটি অনেক পাঠকের জন্য একটি গুরুত্বপূর্ণ বিষয়, তবে ওপি তাদের নির্দিষ্ট করে মাইসাম
এমসি0 ই

22

পুনরুদ্ধার প্রক্রিয়াটি গতি বাড়ানোর জন্য কেউ কী করতে পারে তা এই লিঙ্কটি দেখায়।

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

কমান্ডগুলি ডাম্প ফাইলের শীর্ষে রাখতে পারেন

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

এবং এই বিবৃতি ডাম্প ফাইলের শেষে রাখুন

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

এটি আমার পক্ষে কাজ করেছে। শুভ পুনরুদ্ধার :-)


8
এটি বেশ কিছুটা সাহায্য করেছিল। ফাইলটি সম্পাদনা করার পরিবর্তে, আমি উপরের স্নিপেটগুলি থেকে প্রাক.এসকিউএল এবং পোস্ট.এসকিউএল তৈরি করেছি এবং এটি ডিবি পুনরুদ্ধার করতে ব্যবহার করেছি:cat pre.sql dump.sql post.sql | mysql ...
জেসন আর। কোমবস

1

পুনরুদ্ধারটি কেন ধীরে ধীরে ধীরে ধীরে কমবে তা আমি চিত্রিত করতে পারছি index ইনডেক্সিং শেষ না হওয়া অবধি অনুসন্ধান করুন এবং তারপরে এটি একবারে পুরোটা করতে দিন।


1

আপনার যদি ডাম্প ফাইলের (ডিবি ডিরেক্টরি) ফিজিকাল কপি থাকে তবে নতুন সার্ভারের যদি একই মাইএসকিউএল সংস্করণ থাকে এবং আপনি এটি ঠিক কাজ করতে পারেন তবে আপনি এটি নতুন সার্ভারে অনুলিপি করতে পারেন। এটি মাইআইএসএএম-এর সাথে কাজ করে এবং আমার পক্ষে আমি লজিক্যাল এসকিউএল ডাম্প ফাইলের উপর ভিত্তি করে ডেটা পুনরুদ্ধার করার চেয়ে ভাল বলে মনে করি।


0

আপনার যদি একাধিক টেবিলের সম্ভাবনা থাকে তবে আপনি এমকে-সমান্তরাল-পুনরুদ্ধার থেকে উপকৃত হতে পারেন


এটি এখন অবচয় করা হয়েছে এবং কেবল পরীক্ষার ডেটা পুনরুদ্ধার করতে ব্যবহার করা উচিত, প্রকৃত ব্যাকআপগুলি পুনরুদ্ধার করার জন্য নয়।
সোভানড্রাগ্ট

0

এটি করবে:

mysql --init-আদেশ = "সেট সেশন ফরেইগ_কেই_ CHECKS = 0; সেট করুন UNIQUE_CHECKS = 0;" -u রুট -p <ব্যাকআপ_ডেটবেস.এমএসকিউএল


-1

আমি আপনাকে প্রস্তাব,

  1. আপনার টেবিলগুলি পরীক্ষা করুন: এটির ট্রিগার রয়েছে? সমস্ত ট্রিগার সাফ করুন
  2. সেট করুন: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( এবং রোলব্যাক পরিবর্তন করেন ভুলবেন না )
  3. কম্যান্ড লাইনের মতো ব্যবহার করুন mysql -u root -pPasss requests < mydb.sql
  4. আপনার ডাটাবেস ফাইলের আকার পরীক্ষা করুন

শুভকামনা

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