অ্যাপাচি এইচডিডি-র মতো মাইএসকিএল-এর মতো কি কোনও চমত্কার বা নিরাপদ পুনঃসূচনা আছে?


29

আমি মাইএসকিএলকে গ্রেডলি পুনরায় আরম্ভ করতে চাই ঠিক তেমনই httpd যেখানে থ্রেডগুলি পুনঃসূচনা করার আগে দেওয়া হয়। আমি জিজ্ঞাসা ভাঙ্গা পছন্দ করি না।

উত্তর:


37

মাইএসকিউএল-এর কোনও "অনুরোধ করা" শাটডাউন সিকোয়েন্স (সংক্ষেপে kill -9) কিছুটা দৃষ্টিনন্দন , যেহেতু লেনদেন চলছে (লেনদেনের টেবিলগুলিতে) আবার ঘুরিয়ে দেওয়া হয়েছে, তবে এখানে পুনরায় আরম্ভ করার যতটা সম্ভব উপায় রয়েছে তার কয়েকটি উপায়।

দ্রষ্টব্য: আপনি যদি কোনও আপগ্রেডের জন্য সার্ভারটি বন্ধ করে দিচ্ছেন, তবে এই প্রক্রিয়াটি ব্যবহার করবেন না; পরিবর্তে, এই উত্তরে বিস্তারিত প্রক্রিয়া অনুসরণ করুন ।

অন্যথায়, আপনি যদি অন্যথায় স্বাস্থ্যকর সার্ভারটি পুনরায় চালু করে থাকেন যাতে আপনি কেবল পঠনযোগ্য বৈশ্বিক পরিবর্তনশীল বা এর অনুরূপ কিছু পরিবর্তন করতে পারেন, এখানে একটি করুণ পথ রয়েছে:

প্রথমত, innodb_fast_shutdownএটি ইতিমধ্যে না থাকলে সক্ষম করুন । এটি সরাসরি শাটডাউনয়ের করুণার সাথে সম্পর্কিত নয়, তবে এটি আপনার সার্ভারটি দ্রুত ফিরিয়ে আনা উচিত।

mysql> SHOW VARIABLES LIKE 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0     |
+----------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_fast_shutdown = 1;
Query OK, 0 rows affected (0.01 sec)

এরপরে, বর্তমানে চলমান কোনও কোয়েরিগুলি উল্লেখ না করা মাত্র সার্ভারকে সমস্ত উন্মুক্ত টেবিলগুলি বন্ধ করার নির্দেশ দিন। এই পদক্ষেপের মনোমুগ্ধকর শাটডাউনটির সাথে কোনও সম্পর্ক নেই, তবে এটি পরবর্তী পদক্ষেপটি আরও দ্রুত এগিয়ে নিয়ে যাবে:

mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)

FLUSH TABLESবিবৃতি (ঐচ্ছিক সঙ্গে LOCALকীওয়ার্ডটি যা কোন দাস একজন অপ্রয়োজনীয় কিন্তু অন্যথায় নিরীহ ফ্লাশ এড়াতে) ব্লক হবে এবং আপনার বলবে ফিরে না হওয়া পর্যন্ত টেবিল সব বন্ধ করা যেতে পারে। একবার প্রতিটি টেবিল "ফ্লাশ" হয়ে গেলে (বন্ধ) হয়ে যায়, যদি কোনও প্রশ্নের পরে টেবিলটি উল্লেখ করা হয় তবে তা স্বয়ংক্রিয়ভাবে পুনরায় খোলা হবে, তবে এটি ঠিক আছে। আমরা এই পদক্ষেপের সাথে যা অর্জন করছি তা চূড়ান্ত পদক্ষেপের জন্য কম কাজ করছে:

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)

mysql>

এই বিবৃতিটি সমস্ত টেবিলগুলিকে ফ্লাশ করে (অতএব পূর্বের পদক্ষেপের সাথে কিছুটা বিঘ্নিতভাবে কমিয়ে আনা সুবিধা) এবং তাদের উপর একটি বৈশ্বিক (সার্ভার-ওয়াইড) পঠনযোগ্য লক অর্জন করে।

প্রতিটি চলমান "রাইটিং" ক্যোয়ারী (অর্থাত্ বেশ কিছু না কিছু SELECT) সম্পন্ন না হওয়া পর্যন্ত আপনার গ্লোবাল রিড লক থাকতে পারে না । লক অনুরোধ জারি করা বিদ্যমান জিজ্ঞাসাগুলি শেষ করার অনুমতি দেবে কিন্তু নতুনদের শুরু করার অনুমতি দেবে না।

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

  • আপনি পুনরায় আরম্ভ সম্পর্কে আপনার মন পরিবর্তন এবং ম্যানুয়ালি লক প্রকাশ ( UNLOCK TABLES;)
  • আপনি সার্ভার পুনরায় চালু করুন, বা
  • আপনি দুর্ঘটনাক্রমে বা ইচ্ছাকৃতভাবে এই থ্রেড থেকে কমান্ড লাইন ক্লায়েন্টকে সংযোগ বিচ্ছিন্ন করুন (সুতরাং এটি করবেন না)। এই উইন্ডোটি সংযুক্ত এবং মাইএসকিএল প্রম্পটে বসে থাকুন:

এটি বন্ধ করার প্রলোভন প্রতিরোধ করুন।

mysql>

এই নিষ্ক্রিয় কনসোল প্রম্পটটি হ'ল আপনার জন্য বিশ্বব্যাপী লকটি কী। এটি হারিয়ে ফেলুন, লকটি হারাবেন।

অন্য কনসোল উইন্ডো থেকে, মাইএসকিউএল পুনরায় চালু করুন আপনি সাধারণত ইনসাইটসক্রিপ্টগুলি (যেমন, আপনার স্থানীয় রূপটি service mysql.server restart) দিয়ে বা mysqladmin shutdownম্যানুয়াল পুনঃসূচনা অনুসরণ করে rest


ব্যবহার করে innodb_fast_shutdown = 1মাইএসকিউএল দ্রুত শুরু হয় তা নিশ্চিত করে ? দস্তাবেজগুলির দিকে তাকিয়ে দেখে মনে হচ্ছে এটি শাটডাউন গতির উন্নতি করে (শুরুর গতির দামে?)
ক্রিস

@ ক্রিসের ধারণাটি এটি সম্পূর্ণ শটডাউন + প্রারম্ভিকটি যতটা বাস্তব হিসাবে তত দ্রুত তা নিশ্চিত করতে সহায়তা করে, তবে এটি যেভাবে করা হচ্ছে কাজটি তাত্ত্বিকভাবে একই - তবে সিক্যুয়েন্সের অন্য দিকে সরে গেছে - এখনও কোনও কারণে এটি সর্বদা সামগ্রিকভাবে দ্রুত গতিতে দেখা গিয়েছিল, যেমন শটডাউনে যেভাবে ঘটে থাকে তাতে কিছুটা অদক্ষতা রয়েছে যা শুরুতে নেই। বলা কঠিন.
মাইকেল - স্কেলবট

2

সংক্ষেপে, মাইএসকিউএল বন্ধ করার আগে বিবেচনা করা উচিত এমন কয়েকটি সেরা অনুশীলন হ'ল:

  1. ভুল করে অন্য কোনও উদাহরণ থামানো এড়াতে আপনি যে উদাহরণটি বন্ধ করতে যাচ্ছেন তা নিশ্চিত করুন।
  2. আপনি যদি কোনও দাসকে বন্ধ করতে চলেছেন তবে প্রতিলিপিটি বন্ধ করুন mysql> STOP SLAVE;
  3. শাটডাউন সময় কমাতে নোংরা পৃষ্ঠাগুলি আগেই ফ্লাশ করুন mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
  4. দীর্ঘ চলমান অনুসন্ধানগুলি পরীক্ষা করুন mysql> SHOW PROCESSLIST;, তাদের হত্যা করুন mysql> kill thread_id;বা শেষ না হওয়া পর্যন্ত অপেক্ষা করুন ।
  5. বাফার পুলটি শাটডাউনে ডাম্প করুন এবং বাফার পুলটি ওয়ার্মআপ করতে mysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;স্টার্টআপে পুনরায় লোড করুন # vi /etc/my.cnf innodb_buffer_pool_load_at_startup = ON

তারপরে পূর্ববর্তী পয়েন্টগুলি নিশ্চিত করার পরে, আপনি নিরাপদে মাইএসকিউএল পুনরায় চালু করতে পারেন shell$ service mysql restart

আরও তথ্যের জন্য, আমার পোস্টটি দেখুন মাইএসকিউএল বন্ধ করার আগে এগুলি চেক করুন!


কেন এই নিম্নমানের ছিল? কোন আদেশ (গুলি) খারাপ তা আমি চিনতে পর্যাপ্ত জানি না, তবে আমি জানতে চাই যাতে আমি এগুলি এড়াতে পারি।
জন

আমি জানি না উপরের কোনটি খারাপ আদেশ। আমি উপরের পদক্ষেপগুলি অনুসরণ করছি এবং অনেক লোক তা করে। কেবলমাত্র পদক্ষেপ 4 সতর্কতার সাথে হওয়া উচিত, আপনি কী করছেন সে সম্পর্কে নিশ্চিত হওয়া অবধি আপনার কোনও জিজ্ঞাসা হত্যা করা উচিত নয় অন্যথায় দীর্ঘতর চলমান অনুসন্ধানগুলি শেষ না হওয়া পর্যন্ত অপেক্ষা করুন। এটি ব্যবহার করে দেখুন এবং এটি যদি আপনাকে সহায়তা করে তবে এটিকে উজ্জীবিত করুন, অন্যথায় যদি তা ডাউনওয়েট করুন!
মোল 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.