ড্রপ ডাটাবেস কেন এত দিন নিচ্ছে? (মাইএসকিউএল)


46

নতুন CentOS ইনস্টলেশন।

আমি একটি বড় ডিবি (2 জিবি স্কুয়েল ফাইল) আমদানি করছিলাম এবং একটি সমস্যা ছিল। এসএসএইচ ক্লায়েন্টটি সংযোগটি হারিয়েছে এবং আমদানি হিমায়িত হয়েছে বলে মনে হচ্ছে। আমি মাইএসকিএল-এ লগইন করতে অন্য উইন্ডোটি ব্যবহার করেছি এবং একটি নির্দিষ্ট 3 এম সারি টেবিলের উপরে আটকে আমদানিটি মৃত বলে মনে হয়েছিল।

তাই চেষ্টা করেছি

DROP DATABASE huge_db;

15-20 মিনিট পরে, কিছুই। অন্য উইন্ডোতে, আমি করেছি:

/etc/init.d/mysqld restart

DROP DB উইন্ডোটি বার্তা পাঠিয়েছে: সার্ভার শাটডাউন। তারপরে আমি আসলে ফিজিকাল সার্ভারটি পুনরায় চালু করেছি।

মাইএসকিএল-এ আবার লগইন করা হয়েছে, চেক করা হয়েছে এবং ডিবি এখনও রয়েছে, দৌড়েছে

DROP DATABASE huge_db;

আবার, এবং আবার আমি প্রায় 5 মিনিট অপেক্ষা করছি waiting

আবার, এটি নতুন ইনস্টলেশন। huge_dbশুধুমাত্র ডিবি (সিস্টেম DBS ছাড়া) হয়। আমি দিব্যি আমি আগেও এবং দ্রুত ডিবি এর বড় নামিয়ে দিয়েছি, তবে সম্ভবত আমি ভুল করছি।

আমি সফলভাবে ডাটাবেস ফেলেছি। এটি 30 মিনিটের মতো কিছু নিয়েছে। আরও মনে রাখবেন যে আমি যখন ভেবেছিলাম যে আমি যখন মাইএসকিल्ड্পম্প আমদানি শেষ করে ফেলেছিলাম তখন আমার ভুল হয়েছিল। টার্মিনাল সংযোগটি হারিয়ে গেছে, তবে আমি মনে করি প্রক্রিয়াটি এখনও চলছে। আমি সম্ভবত আমদানি মিড-টেবিল (3M সারি টেবিল) এবং সম্ভবত পুরো ডিবি দিয়ে 3/4 পথে হত্যা করেছিলাম। এটি বিভ্রান্তিকর ছিল যে "শীর্ষ" মাইএসকিএল দেখিয়েছিল মাত্র 3% মেমরি ব্যবহার করে, যখন মনে হয়েছিল এটি আরও ব্যবহার করা উচিত।

ডিবি ফেলে দেওয়া 30 মিনিট সময় নিয়ে শেষ হয়েছিল, সুতরাং, আবারও আমার সম্ভবত সার্ভারটি পুনরায় চালু করতে হবে না এবং সম্ভবত DROP শেষ হওয়ার অপেক্ষায় থাকতে পারত, তবে আমি জানি না যে mysql কীভাবে DROP কোয়েরি পাওয়ার জন্য প্রতিক্রিয়া জানাবে for এটি mysqldump এর মাধ্যমে আমদানি করে একই ডিবি same

তবুও, প্রশ্নটি এখনও রয়ে গেছে যে সমস্ত ডিবি ফাইলগুলি মুছে ফেলা এবং তথ্য_সেমিমা থেকে ডিবি সম্পর্কিত সমস্ত রেফারেন্সগুলি মুছে ফেলা হলে 2 জিবি ডাটাবেসটি কেন 30 মিনিট + ডিআরপি করতে লাগে? বড় চুক্তি কি?

উত্তর:


73

প্রক্রিয়াটি হত্যার চেয়ে আপনি মাইএসকিউএল এর মধ্যে এটি করা নিরাপদ হবে:

$ mysqladmin processlist -u root -p
Enter password: 
+-----+------+-----------+-------------------+---------+------+-------+------------------+
| Id  | User | Host      | db                | Command | Time | State | Info             |
+-----+------+-----------+-------------------+---------+------+-------+------------------+
| 174 | root | localhost | example           | Sleep   | 297  |       |                  |
| 407 | root | localhost |                   | Query   | 0    |       | show processlist |
+-----+------+-----------+-------------------+---------+------+-------+------------------+

আইডি 174 সহ ক্যোয়ারী হ'ল 'উদাহরণ' ডাটাবেসটির একটি ব্লকিং মুছে ফেলা, সুতরাং আপনি কোনও প্রক্রিয়া মারার আগে মাইএসকিউএলকে কোয়েরিটি শেষ করার চেষ্টা করুন:

$ mysqladmin kill 174

processlistএটি নিহত হয়েছে তা নিশ্চিত করতে উপরের কমান্ডটি আবার চালান ।

যদি এটি কাজ না করে, তবে আপনি সম্ভবত ভুল প্রক্রিয়াটি হত্যার দিকে নজর দিতে পারেন তবে এর আগে আপনি মাইএসকিউএল সার্ভারটি পুনরায় চালু করার চেষ্টা করতে পারেন।

আপনি মাইএসকিউএল শেল-এ 'সম্পূর্ণ প্রসেসলিস্ট' ও 'কিল 174' এর মতো কমান্ডও চালাতে পারেন, উদাহরণস্বরূপ যদি আপনি কেবল মাইএসকিউএল ক্লায়েন্ট ইনস্টল করেন। মূল বিষয়টি হ'ল একেবারে প্রয়োজনীয় না হলে শেলের মধ্যে 'কিল' ব্যবহার করে প্রক্রিয়াটি হ্রাস করা উচিত।

সাধারণভাবে বলতে গেলে আপনি হয় mysqlবা ব্যবহার করতে পারেন mysqladmin। আপনার প্রায়শই যদিও এইভাবে কমান্ডগুলি চালনার প্রয়োজন হবে না; আপনি যদি নিয়মিতভাবে প্রশ্নগুলি হত্যা শুরু করেন তবে অবশ্যই কিছু ভুল হয়ে গেছে এবং আপনি সেই সমস্যাটি ঠিক করার চেয়ে আরও ভাল হয়ে যাবেন (ক্যোয়ারী প্রক্রিয়াটি হত্যার লক্ষণটি কেবল উপসর্গটির চিকিত্সা করছে)।


1
@ বাগস বুগি একটি সাধারণ উপায় যা এটি ঘটতে পারে তা হ'ল যদি অন্য প্রক্রিয়া (যেমন একটি ওয়েব সার্ভার, বা এই ক্ষেত্রে একটি আমদানি প্রক্রিয়া) চলছে এবং এটি ডাটাবেসের সাথে সংযুক্ত থাকে। আপনি DROP DATABASEকমান্ডটি প্রকাশ করার পরে সমস্ত সংযোগ বন্ধ না হওয়া পর্যন্ত সার্ভারটি এগিয়ে যাবে না।
স্টিফান ম্যাগনসন

11

যদিও আমি ভেবেছিলাম আমদানি প্রক্রিয়াটি মারা গেছে তবে সম্ভবত এটি এখনও চলছিল।

DROP DATABASEকমান্ড সম্ভবত আমদানি করার আগে এটা দৌড়ে শেষ পর্যন্ত ডাটাবেসের জন্য অপেক্ষা করছিল।

সুতরাং, DROP DATABASEএকটি দীর্ঘ সময় গ্রহণের চেয়ে এটি সম্ভবত কেবল আমদানি হয়েছিল।

যদি অন্য কেউ এটি পড়েন এবং কোনও ডাটাবেস আমদানি বাতিল করতে এবং ডাটাবেসটি ফেলে দেওয়ার চেষ্টা করছেন, আমি আপনাকে প্রথমে আমদানির জন্য পিআইডি (প্রসেস আইডি) সন্ধান করার এবং এটি অন্য একটি টার্মিনাল থেকে চালানোর পরামর্শ দিচ্ছি:

$ kill [PID]

... যেখানে [পিআইডি] প্রক্রিয়াটির আসল পিআইডি হবে।

অন্য টার্মিনালটি এখনও সংযুক্ত থাকলে আপনার অবিলম্বে আমদানি থামানো উচিত।

আপনি SHOW PROCESSLISTপিএইচপিএমআইএডমিন এসকিউএল ট্যাবেও চালাতে পারেন । ফলস্বরূপ সারণী চলমান প্রক্রিয়াগুলি দেখায় এবং আপনি যে সারিটি মেরে ফেলতে চান তার পাশে 'x' ক্লিক করে কৌশলটি করা উচিত।

তারপরে দৌড়াও

DROP DATABASE `database_name`;

এবং সবকিছু পরিষ্কার করা উচিত।


আর একটি উত্তরে পরামর্শ দেওয়া হয়েছিল যে মাইএসকিএল-এর মধ্যে প্রক্রিয়াটি হত্যার বাইরে থেকে করণ করা ভাল। আমি এই উত্তরটি পরীক্ষা করিনি, তবে এটি খুব প্রশংসাসূচক বলে মনে হচ্ছে। সুতরাং আমি এটির পরিবর্তে "স্বীকৃত উত্তর" হিসাবে চিহ্নিত করেছি।


3

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


মাইএসকিউএল ডক্স অনুসারে, "ট্রান্সকেট ক্রিয়াকলাপগুলি টেবিলটি ড্রপ করে পুনরায় তৈরি করে, যা একের পর এক সারি মুছে ফেলার চেয়ে অনেক দ্রুত", তাই ড্রপ করার জন্য কোনও কাটেনি
এজেউড

3

প্রথম জিনিসটি যা মনে আসে তা হ'ল স্থিতি Checking Permissions...

আপনি যখন DROP DATABASE mydb;/ var / lib / mysql / mydb এর ভিতরে সমস্ত কিছু জারি করেন তখন প্রতিটি ফাইল ফেলে দেওয়ার অধিকারের জন্য ওএস অনুমতি আছে কিনা তা পরীক্ষা করা হয়।

কেউ কেউ অনুভব করেছেন যে মাইএসকিএল ব্যবহারকারীদের সংখ্যা হ্রাস করতে পারে


3

আমিও একই সমস্যার মুখোমুখি হয়েছি। তবে এবার আমি শো প্রসেসলিস্টটি পরীক্ষা করেছি; এটি আরও দীর্ঘ সময়ের জন্য অনুমতিগুলি পরীক্ষা করা বলেছে। তারপরে আমি দেখতে পেলাম যে mysqld_safe রুট হিসাবে চলছে যখন ফোল্ডার স্তরের অনুমতিগুলি কেবল মাইএসকিএল ব্যবহারকারীর জন্য। অতএব, আমি কোয়েরিটি হত্যা করেছি, অবশ্যই এটি মেরে যাওয়া অবস্থায় বলে দীর্ঘ সময় লেগেছিল তবে আমি তার প্রতিক্রিয়া প্রকাশের জন্য অপেক্ষা করছিলাম তখন এটি কোয়েরিটি মেরে ফেলেছে এবং ফোল্ডার স্তরের অনুমতিগুলিও এটি গোষ্ঠী এবং chmod এ যুক্ত করে রুট করে 770০ এ পরিণত হয়েছে। তারপরে আমি মৃত্যুদন্ড কার্যকর করেছি একই ড্রপ ডাটাবেস ব্লাহ; এটি 20 গিগাবাইট ডাটাবেসের জন্য 2 সেকেন্ডে আমার জন্য কাজ করেছিল।

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