MyISAM से InnoDB में सभी तालिकाओं को कैसे बदलें?


264

मुझे पता है कि मैं MyISAM से InnoDB तक तालिका संग्रहण को बदलने के लिए व्यक्तिगत रूप से एक परिवर्तन तालिका जारी कर सकता हूं।

अगर वहाँ जल्दी से उन सभी को InnoDB में बदलने का एक तरीका है मैं सोच रहा हूँ?


1
रूपांतरण पर युक्तियाँ
रिक जेम्स

जवाबों:


173
<?php
    // connect your database here first 
    // 

    // Actual code starts here 

    $sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = 'your_database_name' 
        AND ENGINE = 'MyISAM'";

    $rs = mysql_query($sql);

    while($row = mysql_fetch_array($rs))
    {
        $tbl = $row[0];
        $sql = "ALTER TABLE `$tbl` ENGINE=INNODB";
        mysql_query($sql);
    }
?>

5
संभवत: इसे उस डेटाबेस तक सीमित करना बेहतर होगा, जिस पर आप ध्यान केंद्रित कर रहे हैं। एक "और TABLE_SCHEMA = 'dbname' जोड़ें, अन्यथा यह सभी इंटरनेट MySQL तालिकाओं को निर्दोष के रूप में अच्छी तरह से बदल देगा (जब उनमें से कुछ मेमोरी होनी चाहिए)
नूडल्स

7
PHP का mysql_*इंटरफ़ेस पदावनत किया गया है और 7 से हटा दिया गया है। इस कोड का उपयोग न करें।
रिक जेम्स

4
@ गजेन्द्रबंग - हाँ, प्रस्तुत किए जाने पर मान्य उत्तर। लेकिन नए लोगों के लिए, यह अब वैध नहीं है। मेरे अभिप्राय का उपयोग करके इसके खिलाफ चेतावनी देने के लिए था के रूप में है
रिक जेम्स

1
इस सवाल में PHP का जिक्र नहीं है
21

1
सबसे हाल के संपादन को कैसे ध्वजांकित नहीं किया गया है? MySQL हिस्सा विल जोन्स के उत्तर की एक सीधी प्रति है। प्रत्येक संपादित इतिहास को देखें कि 2013 में विल का उत्तर दिखाई दिया जबकि यह उत्तर 2019 में दिखाई दिया। परिणामस्वरूप, इस प्रश्न की अखंडता से समझौता किया जाता है।
रुमालिक

549

अपने डेटाबेस में सभी MyISAM तालिकाओं को पुनः प्राप्त करने के लिए यह SQL कथन (MySQL क्लाइंट, phpMyAdmin, या जहाँ भी) चलाएँ।

name_of_your_dbचर का मान अपने डेटाबेस नाम से बदलें ।

SET @DATABASE_NAME = 'name_of_your_db';

SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = @DATABASE_NAME
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;

फिर, आउटपुट को कॉपी करें और एक नई SQL क्वेरी के रूप में चलाएं।


4
यह अच्छी तरह से काम किया! मैंने इसे एक उदाहरण शेल स्क्रिप्ट में डाला है: shrubbery.mynetgear.net/c/display/W/…
जोशुआ डेविस

4
"# 1267 अवैध मिश्रणों का टकराव ..." मुझे यह त्रुटि हो रही है, यह काम नहीं करता है
राप्पली आंद्रस

1
जिज्ञासा से बाहर, स्पष्ट अवरोही क्रम का क्या मतलब है? ( ORDER BY table_name DESC)
रिनोगो

12
यदि आपका कई डेटाबेस से निपटना है और डेटाबेस को हर बार बदलना नहीं चाहते हैं, तो बदल CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')देंCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
ub3rst4r

1
यदि आप सभी डेटाबेस (MySQL सिस्टम डेटाबेस को छोड़कर) के लिए स्टेटमेंट प्राप्त करना चाहते हैं: SELECT CONCAT('ALTER TABLE `', table_schema, '`.`', table_name, '` ENGINE=InnoDB;') AS sql_statements FROM information_schema.tables WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'mysql') AND engine = 'MyISAM' AND table_type = 'BASE TABLE' ORDER BY table_schema,table_name
dr fu manchu

61
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;') 
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mydatabase';

एक जादू की तरह काम करता है।

इससे आपको उन सभी तालिकाओं की सूची मिल जाएगी, जो आप एक बैच में चला सकते हैं


5
इसे चलाने के बाद आपको पहले निम्नलिखित क्वेरी को निष्पादित करने की आवश्यकता है: USE databasename; फिर आप उन प्रश्नों का उपयोग कर सकते हैं जो उपरोक्त स्क्रिप्ट देता है।
gijs007

आप एक बैच कैसे चलाते हैं?
मार्क अलेक्जेंडर

उपरोक्त क्वेरी आपको तालिका क्वेरीज़ को बदल देगी। बस उन सभी का चयन करें और उन्हें एक साथ निष्पादित करें। या उन्हें 50 प्रश्नों के समूह में विभाजित करें और परिणाम में बहुत अधिक तालिकाओं के होने पर उन्हें चलाएं
ओमकार कुलकर्णी

2
यह 2018 और पेरकोना क्लस्टर पर भी काम कर रहा है। यदि PHPMyAdmin से इसका उपयोग किया जाता है, तो आपको केवल 20 या इतने ही नाम मिलेंगे, फिर "..." या एक पृष्ठांकन >> प्रतीक। इसका मतलब है कि आपको अगले सभी पृष्ठों को क्लिक करना होगा और कॉपी करना होगा ताकि आप किसी भी तालिका को याद न करें। यदि आप यह भूल जाते हैं, तो आप उपरोक्त क्वेरी को सुरक्षित रूप से लागू कर सकते हैं और यह आपको बदलने के लिए अगली MyISAM तालिका देगा।
दारियो फुमगल्ली

23

नीचे दी गई लिपियों में, अपने विशिष्ट डेटा के साथ <यूज़र>, <पासवर्ड> और <स्कीमा> को बदलें।

उन कथनों को दिखाने के लिए जिन्हें आप mysql क्लाइंट सत्र में कॉपी-पेस्ट कर सकते हैं, निम्नलिखित टाइप करें:

echo 'SHOW TABLES;' \
 | mysql -u <username> --password=<password> -D <schema> \
 | awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
 | column -t \

केवल परिवर्तन को निष्पादित करने के लिए, इसका उपयोग करें:

echo 'SHOW TABLES;' \
 | mysql -u <username> --password=<password> -D <schema> \
 | awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
 | column -t \
 | mysql -u <username> --password=<password> -D <schema>

क्रेडिट: यह इस लेख में उल्लिखित की गई विविधता है ।


23

एक पंक्ति:

 mysql -u root -p dbName -e 
 "show table status where Engine='MyISAM';" | awk 
 'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}'  | 
  mysql -u root -p dbName

1
सबसे अच्छा और सबसे बुद्धिमान जवाब!
बनिअम

जब मैं इसे bash स्क्रिप्ट में चलाता हूं तो यह NR परिभाषा को ओवरराइट करते हुए $ 1 को bash स्क्रिप्ट वेरिएबल के रूप में व्याख्या करता है। इसके आसपास कोई रास्ता?
लिए काम करता है

@OrksforaLiving ने बैकटिक्स "$1"में इस तरह से संलग्न किया है: `"$1"`मेरे जवाब में ऐसा ही है।
विजय वरदान 5

20

अपने phpMyAdmin में एक sql क्वेरी के रूप में इसका उपयोग करें

SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;') 
FROM information_schema.tables 
WHERE engine = 'MyISAM';

3
यह वास्तव में तालिकाओं को InnoDB में परिवर्तित करने के लिए प्रतीत नहीं होता है।
चार्ली श्लिसेर

3
यह एक स्क्रिप्ट को आउटपुट करता है जिसे आप टेबल बदलने के लिए चलाते हैं - यह दो चरण है। यह INFORMATION_SCHEMA तालिकाओं को बदलने की कोशिश करता है, हालांकि - यह एक बुरी बात है। इसे सही डेटाबेस तक सीमित करने की आवश्यकता है।
ब्रिलियनड

1
आपको हमारे आंतरिक mysql तालिकाओं को फ़िल्टर करना होगा - डॉक्स के अनुसार "MySQL सिस्टम टेबल को mysql डेटाबेस (जैसे उपयोगकर्ता या होस्ट) में InnoDB प्रकार में कनवर्ट न करें। यह एक असमर्थित ऑपरेशन है। सिस्टम टेबल हमेशा होना चाहिए। MyISAM प्रकार का। " लिंक
यूजी

इस उत्तर में @ यूग की टिप्पणी को शामिल किए बिना संपादन, मुझे लगता है कि यह एक डाउन-वोट के योग्य है, हालांकि यह अन्यथा इस पृष्ठ पर किसी भी प्रकार के रूप में सुरुचिपूर्ण है।
mc0e

हम्म। @ चार्ली-एस भी सही है, और यह कार्यशील एसक्यूएल का उत्पादन नहीं करता है। एक डाउन-वोट मुझे उचित लगता है।
mc0e

18

आप mysql कमांड लाइन टूल में इस स्टेटमेंट को निष्पादित कर सकते हैं:

echo "SELECT concat('ALTER TABLE `',TABLE_NAME,'` ENGINE=InnoDB;')
FROM Information_schema.TABLES 
WHERE ENGINE != 'InnoDB' AND TABLE_TYPE='BASE TABLE' 
AND TABLE_SCHEMA='name-of-database'" | mysql > convert.sql

आपको उपयोगकर्ता नाम और पासवर्ड का उपयोग करने की आवश्यकता हो सकती है: mysql -u उपयोगकर्ता नाम -p परिणाम एक sql स्क्रिप्ट है जिसे आप mysql में वापस पाइप कर सकते हैं:

mysql name-of-database < convert.sql

उपरोक्त कथन और कमांड लाइन में "नाम-ऑफ-डेटाबेस" को बदलें।


@itsraja, "इको" माइक्रोसॉफ्ट सिस्टम पर linux / unix और cmd दोनों पर sh द्वारा समर्थित एक कमांड है, परिणाम mysql टूल के इनपुट के रूप में पाइप किया गया है।
हेंड्रिक ब्रम्मनरमन

2
ये सही है। लेकिन
u

1
इसके अलावा, "SELECT concat (कंसट्रेट (ALTER TRABLE '), TABLE_NAME),' इंजन (InnoDB; ') से TABLES WHERE Engine =!' 'InnoDB' और TABLE_TYY = 'BASE TABLE' और TABLE_SCHEMA = 'testinno' पर क्लिक करें। mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> Convert.sql ERROR 1146 (42S02) पंक्ति 1 पर: तालिका 'testinno.TABLES' मौजूद नहीं है
थर्रा

मैंने इसे एक उदाहरण शेल स्क्रिप्ट में यहाँ रखा है: shrubbery.mynetgear.net/c/display/W/…
जोशुआ डेविस

1
हम स्ट्रिंग के रूप में sql स्टेटमेंट को कैसे ठीक से बचा सकते हैं? यह अब के रूप में, मैं-bash: ,TABLE_NAME,: command not found
अर्जन

10

यह बहुत सरल है कि केवल दो चरण हैं केवल कॉपी और पेस्ट करें:

चरण 1।

  SET @DATABASE_NAME = 'name_of_your_db';
  SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS  sql_statements FROM information_schema.tables AS tb WHERE   table_schema = @DATABASE_NAME AND `ENGINE` = 'MyISAM' AND `TABLE_TYPE` = 'BASE TABLE' ORDER BY table_name DESC;

(कॉपी और पेस्ट सभी परिणाम sql टैब में)

चरण 2: (sql टैब में सभी परिणाम कॉपी करें) और लाइन में नीचे पेस्ट करें

हुक परिवहन;

COMMIT;

जैसे। हुक परिवहन;

वैकल्पिक टेबल admin_filesइंजन = InnoDB;

COMMIT;


10

सभी गैर-सिस्टम स्कीमा में सभी तालिकाओं के लिए ALTER स्टेटमेंट जेनरेट करने के लिए, उन स्कीमाओं / तालिकाओं द्वारा आदेश दिया गया है जो निम्नलिखित हैं:

SELECT  CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables
WHERE   TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'innodb', 'sys', 'tmp')
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, table_name DESC;

उसके बाद, परिवर्तन करने के लिए क्लाइंट के माध्यम से उन प्रश्नों को चलाएं।

  • उत्तर उपरोक्त उत्तरों पर आधारित है, लेकिन स्कीमा हैंडलिंग में सुधार करता है।

8

यह अभी तक उल्लिखित नहीं किया गया है, इसलिए मैं इसे पोस्टीरिटी के लिए लिखूंगा:

यदि आप DB सर्वरों के बीच माइग्रेट कर रहे हैं (या आपके पास कोई और कारण है और आप अपना ड्राफ्ट पुनः लोड करेंगे), तो आप केवल आउटपुट को संशोधित कर सकते हैं mysqldump:

mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;

फिर इसे फिर से लोड करें:

mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql

(इसके अलावा, मेरे सीमित अनुभव में, यह टेबल्स 'लाइव' को बदलने की तुलना में बहुत तेज़ प्रक्रिया हो सकती है। यह संभवतः डेटा और इंडेक्स के प्रकार पर निर्भर करता है।)


Ty! ठीक वही जो मेरे द्वारा खोजा जा रहा था। कुछ दिनों में इसका परीक्षण करेंगे।
रेनर

7

यहाँ Django उपयोगकर्ताओं के लिए यह करने के लिए एक तरीका है:

from django.core.management.base import BaseCommand
from django.db import connections


class Command(BaseCommand):

    def handle(self, database="default", *args, **options):

        cursor = connections[database].cursor()

        cursor.execute("SHOW TABLE STATUS");

        for row in cursor.fetchall():
            if row[1] != "InnoDB":
                print "Converting %s" % row[0],
                result = cursor.execute("ALTER TABLE %s ENGINE=INNODB" % row[0])
                print result

फ़ोल्डर प्रबंधन / आदेशों के तहत अपने एप्लिकेशन में इसे जोड़ें / फिर आप अपनी सभी तालिकाओं को एक प्रबंधकीय कमांड के साथ बदल सकते हैं:

python manage.py convert_to_innodb

5

Mysql के अंदर से, आप टेक्स्ट एडिटर का उपयोग करके खोज / प्रतिस्थापन का उपयोग कर सकते हैं:

SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';

नोट: आपको शायद info_schema और mysql को नजरअंदाज करना चाहिए क्योंकि "mysql और information_schema डेटाबेस, जो कुछ MySQL इंटर्नल्स को लागू करते हैं, अभी भी MyISAM का उपयोग करते हैं। विशेष रूप से, आप InnoDB का उपयोग करने के लिए अनुदान तालिकाओं को स्विच नहीं कर सकते।" ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )

किसी भी मामले में, ध्यान न देने और चलाने के लिए तालिकाओं पर ध्यान दें:

SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';

अब बस उस सूची को अपने टेक्स्ट एडिटर में कॉपी / पेस्ट करें और खोजें / बदलें "|" "अलर्ट टेबल" आदि के साथ।

फिर आपके पास एक सूची होगी जैसे आप बस अपने mysql टर्मिनल में पेस्ट कर सकते हैं:

ALTER TABLE arth_commentmeta           ENGINE=Innodb;
ALTER TABLE arth_comments              ENGINE=Innodb;
ALTER TABLE arth_links                 ENGINE=Innodb;
ALTER TABLE arth_options               ENGINE=Innodb;
ALTER TABLE arth_postmeta              ENGINE=Innodb;
ALTER TABLE arth_posts                 ENGINE=Innodb;
ALTER TABLE arth_term_relationships    ENGINE=Innodb;
ALTER TABLE arth_term_taxonomy         ENGINE=Innodb;
ALTER TABLE arth_terms                 ENGINE=Innodb;
ALTER TABLE arth_usermeta              ENGINE=Innodb;

यदि आपका पाठ संपादक आसानी से ऐसा नहीं कर सकता है, तो अपने डेटाबेस के सिर्फ एक उपसर्ग के लिए इसी तरह की सूची (जो आप mysql में पेस्ट कर सकते हैं) के लिए एक और समाधान है, लिनक्स टर्मिनल से:

mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"

5

एक सादा MySQL संस्करण।

आप बस mysql निष्पादन योग्य शुरू कर सकते हैं, डेटाबेस का उपयोग कर सकते हैं और क्वेरी को कॉपी-पेस्ट कर सकते हैं।

यह वर्तमान डेटाबेस में सभी MyISAM तालिकाओं को INNODB तालिकाओं में परिवर्तित कर देगा।

DROP PROCEDURE IF EXISTS convertToInnodb;
DELIMITER //
CREATE PROCEDURE convertToInnodb()
BEGIN
mainloop: LOOP
  SELECT TABLE_NAME INTO @convertTable FROM information_schema.TABLES
  WHERE `TABLE_SCHEMA` LIKE DATABASE()
  AND `ENGINE` LIKE 'MyISAM' ORDER BY TABLE_NAME LIMIT 1;
  IF @convertTable IS NULL THEN 
    LEAVE mainloop;
  END IF;
  SET @sqltext := CONCAT('ALTER TABLE `', DATABASE(), '`.`', @convertTable, '` ENGINE = INNODB');
  PREPARE convertTables FROM @sqltext;
  EXECUTE convertTables;
  DEALLOCATE PREPARE convertTables;
  SET @convertTable = NULL;
END LOOP mainloop;

END//
DELIMITER ;

CALL convertToInnodb();
DROP PROCEDURE IF EXISTS convertToInnodb;

मुझे आश्चर्य है कि वहाँ अधिक संग्रहित प्रक्रिया-आधारित समाधान नहीं थे!
FrustratedWithFormsDesigner

क्योंकि MySQL में लिखने और परीक्षण की प्रक्रिया में दर्द होता है ;-) टिप्पणी में सवाल के साथ कुछ भी नहीं है।
हेराल्ड लीथनर

3

एकल तालिका के लिए डेटाबेस इंजन को बदलने के लिए इस लाइन का उपयोग करें।

  ALTER TABLE table_name ENGINE = INNODB;

3

मैं एक नौसिखिया हूँ और मुझे अपना समाधान स्वयं ढूंढना पड़ा क्योंकि वेब पर mysql कमांड आमतौर पर प्रकोप से ग्रस्त हो जाते हैं और लोगों के लिए एक वास्तविक जीवन का बुरा सपना पैदा करते हैं। यहाँ मेरा समाधान है ....

1 कमांड प्रति टेबल के बजाय, मैंने एक्सेल का उपयोग करते हुए दर्जनों कमांड (कॉपी करने और पेस्ट करने के लिए तैयार) को तैयार किया।

कैसे? अपनी पोटीन विंडो का विस्तार करें और mysql दर्ज करें और फिर कमांड "SHOW TABLE STATUS;" और microsoft excel में आउटपुट को कॉपी / पेस्ट करें। डेटा टैब पर जाएं और "टेक्स्ट टू कॉलम" फीचर का उपयोग करके कॉलम को एक स्पेस कुंजी से सीमांकित करें। फिर कॉलम को जो भी आपके कॉलम के प्रकार दिखाता है और सभी पंक्तियों को हटा दें, जो तालिका पहले से ही InnoDb प्रारूप में हैं (क्योंकि हमें उनके खिलाफ कमांड चलाने की आवश्यकता नहीं है, वे पहले से ही हो चुके हैं)। फिर टेबल कॉलम के बाईं ओर 2 कॉलम और दाईं ओर 2 कॉलम जोड़ें। फिर कॉलम -1 में कमांड के पहले भाग में पेस्ट करें (नीचे देखें)। कॉलम 2 में केवल एक स्थान होना चाहिए। कॉलम 3 आपकी टेबल कॉलम है। कॉलम 4 में केवल एक स्थान होना चाहिए। कॉलम 5 आपकी आज्ञा का अंतिम भाग है। इसे ऐसा दिखना चाहिए:

column-1        column-2            column-3         column-4     column-5
ALTER TABLE     t_lade_tr           ENGINE=InnoDB;
ALTER TABLE     t_foro_detail_ms    ENGINE=InnoDB;
ALTER TABLE     t_ljk_ms            ENGINE=InnoDB;

फिर mysql में एक बार में लगभग 5 पंक्तियों को कॉपी और पेस्ट करें। यह एक बार में लगभग 5 में परिवर्तित हो जाएगा। मैंने देखा कि अगर मैंने एक बार में उससे अधिक किया तो कमांड विफल हो जाएंगे।


3

मेरे मामले में, मैं एक MySQL उदाहरण से MyISAM के डिफ़ॉल्ट के साथ, एक InnoDB के DEFAULT के साथ एक MariaDB उदाहरण के लिए माइग्रेट कर रहा था।

प्रति MariaDB प्रवासन डॉक्टर।

पुराने सर्वर रन पर:

mysqldump -u root -p --skip-create-options --all-databases > migration.sql

MyskAM के बजाय डेटा लोड करते समय - डेटाबेस सर्वर यह सुनिश्चित करता है कि डेटाबेस सर्वर डिफ़ॉल्ट स्टोरेज इंजन का उपयोग करता है।

mysql -u root -p < migration.sql

इसने mysql.db बनाने के बारे में एक त्रुटि फेंक दी, लेकिन अब सब कुछ बहुत अच्छा काम करता है :)


3

बस दूसरे (सरल) तरीके से परीक्षण किया, और मेरे लिए काम किया।

बस अपने DB को .sql फ़ाइल के रूप में निर्यात करें, इसे संपादित करें gedit या नोटपैड के साथ;

बदलें ENGINE=MyISAMके साथENGINE=INNODB और संपादित फ़ाइल सहेजें

नंबर या किया गया प्रतिस्थापन आपकी तालिकाओं की संख्या होना चाहिए

इसे MySQL (phpMyAdmin या कमांड लाइन) पर आयात करें

और वोइला!


2

आप इसे अपनी पसंदीदा स्क्रिप्टिंग भाषा में करने के लिए एक स्क्रिप्ट लिख सकते हैं। स्क्रिप्ट निम्न कार्य करेगी:

  1. मुद्दा SHOW FULL TABLES
  2. लौटी प्रत्येक पंक्ति के लिए, जांचें कि दूसरा कॉलम कहता है 'BASE TABLE' और नहीं'VIEW'
  3. यदि ऐसा नहीं है 'VIEW', तो उचित ALTER TABLEआदेश जारी करें ।

2

इस शेल स्क्रिप्ट को आज़माएं

DBENGINE='InnoDB' ;
DBUSER='your_db_user' ;
DBNAME='your_db_name' ;
DBHOST='your_db_host'
DBPASS='your_db_pass' ;
mysqldump --add-drop-table -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME > mtest.sql; mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "SHOW TABLES;" | while read TABLE ; do mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "ALTER TABLE $TABLE ENGINE=$DBENGINE;" ; done

2

इस उपयोग स्क्रिप्ट में कुछ सुधार

SET @DATABASE_NAME = 'Integradb';

SELECT  CONCAT('ALTER TABLE ', table_schema, '.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = @DATABASE_NAME
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;

1
<?php

  // connect your database here first

  mysql_connect('host', 'user', 'pass');

  $databases = mysql_query('SHOW databases');

  while($db = mysql_fetch_array($databases)) {
    echo "database => {$db[0]}\n";
    mysql_select_db($db[0]);

    $tables = mysql_query('SHOW tables');

    while($tbl = mysql_fetch_array($tables)) {
      echo "table => {$tbl[0]}\n";
      mysql_query("ALTER TABLE {$tbl[0]} ENGINE=MyISAM");
    }
  }

1

यह एक साधारण php स्क्रिप्ट है।

<?php
    @error_reporting(E_ALL | E_STRICT);
    @ini_set('display_errors', '1');


    $con = mysql_connect('server', 'user', 'pass');
    $dbName = 'moodle2014';

    $sql = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '".$dbName."';";
    $rs = mysql_query($sql, $con);

    $count = 0;
    $ok = 0;
    while($row = mysql_fetch_array($rs)){
            $count ++;
            $tbl = $row[0];
            $sql = "ALTER TABLE ".$dbName.".".$tbl." ENGINE=INNODB;";
            $resultado = mysql_query($sql);
            if ($resultado){
                    $ok ++;
                    echo $sql."<hr/>";
            }
    }
    if ($count == $ok){
            echo '<div style="color: green"><b>ALL OK</b></div>';
    }else{
            echo '<div style="color: red"><b>ERRORS</b>Total tables: '.$count.', updated tables:'.$ok.'</div>';
    }

1
<?php

// Convert all MyISAM tables to INNODB tables in all non-special databases.
// Note: With MySQL less than 5.6, tables with a fulltext search index cannot be converted to INNODB and will be skipped.

if($argc < 4)
    exit("Usage: {$argv[0]} <host> <username> <password>\n");
$host = $argv[1];
$username = $argv[2];
$password = $argv[3];

// Connect to the database.
if(!mysql_connect($host, $username, $password))
    exit("Error opening database. " . mysql_error() . "\n");

// Get all databases except special ones that shouldn't be converted.
$databases = mysql_query("SHOW databases WHERE `Database` NOT IN ('mysql', 'information_schema', 'performance_schema')");
if($databases === false)
    exit("Error showing databases. " . mysql_error() . "\n");

while($db = mysql_fetch_array($databases))
{
    // Select the database.
    if(!mysql_select_db($db[0]))
        exit("Error selecting database: {$db[0]}. " . mysql_error() . "\n");
    printf("Database: %s\n", $db[0]);

    // Get all MyISAM tables in the database.
    $tables = mysql_query("SHOW table status WHERE Engine = 'MyISAM'");
    if($tables === false)
        exit("Error showing tables. " . mysql_error() . "\n");

    while($tbl = mysql_fetch_array($tables))
    {
        // Convert the table to INNODB.
        printf("--- Converting %s\n", $tbl[0]);
        if(mysql_query("ALTER TABLE `{$tbl[0]}` ENGINE = INNODB") === false)
            printf("--- --- Error altering table: {$tbl[0]}. " . mysql_error() . "\n");
    }
}

mysql_close();

?>

1

mysqli connect के लिए;

<?php

$host       = "host";
$user       = "user";
$pass       = "pss";
$database   = "db_name";


$connect = new mysqli($host, $user, $pass, $database);  

// Actual code starts here Dont forget to change db_name !!
$sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'db_name' 
    AND ENGINE = 'MyISAM'";

$rs = $connect->query($sql);

while($row = $rs->fetch_array())
{
    $tbl = $row[0];
    $sql = "ALTER TABLE `$tbl` ENGINE=INNODB";
    $connect->query($sql);
} ?>

0

फिर भी एक और विकल्प ... यहां बताया गया है कि यह कैसे करना है। यह मानता है कि आपके डेटाबेस का नाम अंदर है dbnameऔर आप पहले से ही एक्सेस को कॉन्फ़िगर कर चुके हैं।

- name: Get list of DB tables that need converting to InnoDB
  command: >
    mysql --batch --skip-column-names --execute="SELECT TABLE_NAME
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = '{{ dbname }}' AND ENGINE = 'MyISAM';"
  register: converttables
  check_mode: no
  changed_when: False

- name: Convert any unconverted tables
  command: >
    mysql --batch --skip-column-names --execute="ALTER TABLE `{{ dbname }}`.`{{ item }}` ENGINE = InnoDB;"
  with_items: "{{ converttables.stdout_lines }}"

-1

cd / var / lib / mysql / DBNAME

ls | grep ".frm" | कटौती -d "।" -f1 | xargs -I {} -n1 mysql -D DBNAME -e "परिवर्तन तालिका {} इंजन = NNODB;" -uroot -pXXXXX

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.