जवाबों:
<?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);
}
?>
mysql_*
इंटरफ़ेस पदावनत किया गया है और 7 से हटा दिया गया है। इस कोड का उपयोग न करें।
अपने डेटाबेस में सभी 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 क्वेरी के रूप में चलाएं।
ORDER BY table_name DESC
)
CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')
देंCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
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
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;')
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mydatabase';
एक जादू की तरह काम करता है।
इससे आपको उन सभी तालिकाओं की सूची मिल जाएगी, जो आप एक बैच में चला सकते हैं
नीचे दी गई लिपियों में, अपने विशिष्ट डेटा के साथ <यूज़र>, <पासवर्ड> और <स्कीमा> को बदलें।
उन कथनों को दिखाने के लिए जिन्हें आप 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>
क्रेडिट: यह इस लेख में उल्लिखित की गई विविधता है ।
एक पंक्ति:
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"
में इस तरह से संलग्न किया है: `"$1"`
मेरे जवाब में ऐसा ही है।
अपने phpMyAdmin में एक sql क्वेरी के रूप में इसका उपयोग करें
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM';
आप 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
उपरोक्त कथन और कमांड लाइन में "नाम-ऑफ-डेटाबेस" को बदलें।
-bash: ,TABLE_NAME,: command not found
यह बहुत सरल है कि केवल दो चरण हैं केवल कॉपी और पेस्ट करें:
चरण 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;
सभी गैर-सिस्टम स्कीमा में सभी तालिकाओं के लिए 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;
उसके बाद, परिवर्तन करने के लिए क्लाइंट के माध्यम से उन प्रश्नों को चलाएं।
यह अभी तक उल्लिखित नहीं किया गया है, इसलिए मैं इसे पोस्टीरिटी के लिए लिखूंगा:
यदि आप 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
(इसके अलावा, मेरे सीमित अनुभव में, यह टेबल्स 'लाइव' को बदलने की तुलना में बहुत तेज़ प्रक्रिया हो सकती है। यह संभवतः डेटा और इंडेक्स के प्रकार पर निर्भर करता है।)
यहाँ 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
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;"
एक सादा 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;
मैं एक नौसिखिया हूँ और मुझे अपना समाधान स्वयं ढूंढना पड़ा क्योंकि वेब पर 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 में परिवर्तित हो जाएगा। मैंने देखा कि अगर मैंने एक बार में उससे अधिक किया तो कमांड विफल हो जाएंगे।
मेरे मामले में, मैं एक MySQL उदाहरण से MyISAM के डिफ़ॉल्ट के साथ, एक InnoDB के DEFAULT के साथ एक MariaDB उदाहरण के लिए माइग्रेट कर रहा था।
पुराने सर्वर रन पर:
mysqldump -u root -p --skip-create-options --all-databases > migration.sql
MyskAM के बजाय डेटा लोड करते समय - डेटाबेस सर्वर यह सुनिश्चित करता है कि डेटाबेस सर्वर डिफ़ॉल्ट स्टोरेज इंजन का उपयोग करता है।
mysql -u root -p < migration.sql
इसने mysql.db बनाने के बारे में एक त्रुटि फेंक दी, लेकिन अब सब कुछ बहुत अच्छा काम करता है :)
बस दूसरे (सरल) तरीके से परीक्षण किया, और मेरे लिए काम किया।
बस अपने DB को .sql फ़ाइल के रूप में निर्यात करें, इसे संपादित करें gedit या नोटपैड के साथ;
बदलें ENGINE=MyISAM
के साथENGINE=INNODB
और संपादित फ़ाइल सहेजें
नंबर या किया गया प्रतिस्थापन आपकी तालिकाओं की संख्या होना चाहिए
इसे MySQL (phpMyAdmin या कमांड लाइन) पर आयात करें
और वोइला!
इस शेल स्क्रिप्ट को आज़माएं
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
इस उपयोग स्क्रिप्ट में कुछ सुधार
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;
<?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");
}
}
यह एक साधारण 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>';
}
<?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();
?>
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);
} ?>
फिर भी एक और विकल्प ... यहां बताया गया है कि यह कैसे करना है। यह मानता है कि आपके डेटाबेस का नाम अंदर है 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 }}"