मैं MyISAM से InnoDB में एक डेटाबेस कैसे परिवर्तित करूं?


9

मैं MyISAM से InnoDB तक 500MB डेटाबेस की सभी तालिकाओं को परिवर्तित करने जा रहा हूं, यह देखने के लिए कि क्या यह एक व्यस्त Drupal 6 साइट के समग्र प्रदर्शन में सुधार करेगा या नहीं। मैं सोच रहा हूं कि रूपांतरण करने का सबसे अच्छा (सबसे सुरक्षित / सबसे आसान / सबसे तेज़) तरीका क्या है।


यह एक Drupal से संबंधित प्रश्न नहीं लगता है?
तस्तिनी

2
सीधे तौर पर नहीं, लेकिन यह एक ऐसी चीज है जिसे ड्रुपल एडिंस को करने की जरूरत होती है।
mpdonadio

मैंने अपने जवाब को अपडेट किया कि एक नई SQL कमांड का उपयोग करके MyISAM टेबल्स को फ़िल्टर किया जा सके जिसमें फुलटेक्स्ट इंडेक्स हों। कृपया मेरे अपडेट किए गए उत्तर का उपयोग करते हुए खरोंच से सभी चरणों को पुन: चलाएँ।
RolandoMySQLDBA

यदि आपकी Drupal साइट को FULLTEXT इंडेक्स का उपयोग करके खोज करने के लिए कॉन्फ़िगर नहीं किया गया है, तो आप FULLTEXT इंडेक्स वाली सभी तालिकाओं में जाना चाहते हैं और उन टेबल्स को उन तालिकाओं से बाहर कर सकते हैं। FULLTEXT अनुक्रमणिका वाले सभी तालिकाओं को खोजने के लिए, SELECT table_schema, table FROM से सूचना_schema.statistics WHERE index_type = 'FULLTEXT' चलाएं;
RolandoMySQLDBA

जवाबों:


7

MySQL DBA के रूप में, मुझे विश्वास है कि MySQL मेरे लिए स्क्रिप्ट लिखने से MySQL रूपांतरण करता है।

लिनक्स कमांड को इस क्वेरी को चलाते हैं

mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',db,'.',tb,' ENGINE=InnoDB;') FROM (SELECT A.db,A.tb,A.tbsize FROM (SELECT table_schema db,table_name tb,(data_length+index_length) tbsize FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql')) A LEFT JOIN (SELECT table_schema db,table_name tb FROM information_schema.statistics WHERE index_type='FULLTEXT') B USING (db,tb) WHERE B.db IS NULL) AA ORDER BY tbsize" > /root/ConvertMyISAM2InnoDB.sql

स्क्रिप्ट पहले सबसे छोटी तालिकाओं को रूपांतरित करेगी। यह स्क्रिप्ट किसी भी MyISAM तालिकाओं को भी बाईपास करती है जिसमें FULLTEXT इंडेक्स होते हैं।

A स्क्रिप्ट की तलाश में, आप इसे केवल MySQL में निम्नानुसार चला सकते हैं:

mysql -h... -u... -p... -A < /root/ConvertMyISAM2InnoDB.sql

या यदि आप प्रत्येक रूपांतरण का समय देखना चाहते हैं, तो mysql पर लॉगिन करें और इसे चलाएं:

mysql> source /root/ConvertMyISAM2InnoDB.sql

यह गड़बड़ नहीं होनी चाहिए क्योंकि पूर्ण टेबल लॉक तब होता है जब रूपांतरण निष्पादित किया जा रहा है।

एक बार सभी तालिकाओं को परिवर्तित करने के बाद आपको InnoDB उपयोग के लिए MySQL सेटिंग्स को ट्यून करना होगा और key_buffer को स्केल करना होगा।

InnoDB बफर पूल की स्थापना के लिए कृपया इसे पढ़ें: /dba/1/what-are-the-main-differences-between-innodb-and-myisam-2194#2194

कृपया इसे भी पढ़ें: /drupal/1715/what-would-the-optimal-mysql-configuration-for-a-drupal-7-site-be/2367#2367

कोशिश करो !!!


रोलैंड, मैंने आपके समाधान की कोशिश की, लेकिन ConvertMyISAM2InnoDB.sql को डेटाबेस में आयात करने के बाद, मुझे यह त्रुटि मिलती है: "ERROR 1214 (HY000) लाइन 585 पर: उपयोग की गई तालिका प्रकार पूर्ण अनुक्रमित अनुक्रमणिकाओं का समर्थन नहीं करता है"। तो क्या मुझे पता होना चाहिए कि क्या रूपांतरण कुछ तालिकाओं पर हुआ और मुझे इस त्रुटि को कैसे हल करना चाहिए? धन्यवाद
अल्फ

मुझे डर था कि ऐसा होगा। इसका सीधा सा मतलब है कि एक MyISAM तालिका में एक पूर्णांक सूचकांक था। Mysql में लॉगिन करें और चलाएं जैसे कि आप समय देखना चाहते हैं। दूसरे शब्दों में, रन सोर्स /root/ConvertMyISAM2InnoDB.sql
RolandoMySQLDBA

मैं FULLTEXT इंडेक्स वाली तालिकाओं को छोड़ने के लिए SQL पीढ़ी स्क्रिप्ट को अपडेट करने का प्रयास करूंगा।
रोलैंडमाइसीडीडीबीए

इस बीच, खरोंच से इन सभी चरणों को दोहराएं। पुनर्निर्मित फ़ाइल की पहली पंक्ति में FULLTEXT इंडेक्स के साथ MyISAM फ़ाइल है। बस उस पहली पंक्ति को हटा दें और स्क्रिप्ट को फिर से चलाएँ।
रोलैंडमाइसीडीडीबीए

ठीक है, इस शांत रूपांतरण बैश स्क्रिप्ट ( yoodey.com/… ) को चलाकर , मुझे पता चला कि मेरे डेटाबेस पर एकमात्र टेबल जो पूर्ण पाठ का उपयोग करता है, वह है 'search_index'। यह रूपांतरण को रोक देता है लेकिन इस पर रूपांतरण रद्द करने के बाद, बाकी आसानी से चला गया। स्रोत ConvertMyISAM2InnoDB.sql चलाकर मैं अपराधी को इंगित नहीं कर सका। वैसे भी मैं आपकी मदद की सराहना करता हूं।
अल्फांस

4

मैंने कुछ समय पहले इसके लिए एक ड्रश कमांड लिखा है।

<?php
/**
 * Implements hook_drush_command().
 */
function convert_drush_command() {
  $items = array();

  // the key in the $items array is the name of the command.
  $items['convert-engine'] = array(
    // a short description of your command
    'description' => "Convert MYSQL Table Type",
  );
  return $items;
}

function drush_convert_engine() {
  $args = func_get_args();
  $engine = $args[0];

  $result = db_query("SHOW TABLES");
  while ($row = db_fetch_array($result)) {
    $table = array_shift($row);
    drush_log(dt('Converting @table to @engine', array('@table' => $table, '@engine' => $engine)), 'success');
    db_query("ALTER TABLE $table ENGINE = $engine");
  }
}

मेरे लिए एक या दो साल पहले काम किया है, सुनिश्चित नहीं है कि तब से ड्रश एपीआई बदल गया है।

आप इसे एक ..drush.inc में उदाहरण के लिए .drush फ़ोल्डर में रख सकते हैं या इसे अपनी साइट पर किसी तरह निष्पादित कर सकते हैं, उदाहरण के लिए devel निष्पादित php ब्लॉक। एक शराबी स्क्रिप्ट के रूप में, आप इसे इस तरह कह सकते हैं:

drush convert-engine InnoDB

चेतावनी : यदि कोई इन आदेशों को चलाने के दौरान डेटाबेस के साथ कुछ करता है, तो आपका डेटाबेस पूरी तरह से गड़बड़ हो जाएगा। Unrecoverably। इसलिए, अपनी साइट को रखरखाव मोड में रखें और इसे आज़माने से पहले बैकअप लें! और हां, पहले एक विकास / परीक्षण स्थल पर प्रयास करें :)


5
Berdir से सहमत हैं, अपनी साइट का बैकअप लें। जबकि यह ऑपरेशन चल रहा है, आप डेटाबेस को लॉक किया जाएगा। यदि आप ऐसा मॉड्यूल चाहते हैं जो यह कर सकता है, तो डीबी ट्यूनर को एक शॉट दें।
mikeytown2

@ mikeytown2: यह एक बहुत अच्छा मॉड्यूल है :)
Berdir

1
अच्छी स्क्रिप्ट है, लेकिन यह सीधे MySQL ग्राहक को ऐसा करने में काफी हद तक ओवरकिल लगता है।
तस्तिनी

2
स्क्रिप्ट कोड की 5 पंक्तियाँ है। बाकी इसे ड्रश के साथ एकीकृत करना है। MySQL में सिंगल sql कमांड में ऐसा करने का तरीका है। एक तरह से या किसी अन्य के लिए, आप है एक स्क्रिप्ट लिखने के लिए।
बेदिर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.