Yanıtlar:
<?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_*
arayüzü kullanım dışıdır ve sürüm 7'den kaldırılmıştır. Bu kodu olduğu gibi kullanmayın.
Veritabanınızdaki tüm MyISAM tablolarını almak için bu SQL deyimini (MySQL istemcisinde, phpMyAdmin veya herhangi bir yerde) çalıştırın.
name_of_your_db
Değişkenin değerini veritabanı adınızla değiştirin.
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;
Ardından, çıktıyı kopyalayın ve yeni bir SQL sorgusu olarak çalıştırın.
ORDER BY table_name DESC
)
CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')
içinCONCAT('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';
Tıkır tıkır çalışıyor.
Bu, toplu olarak çalıştırabileceğiniz değişiklik sorgularına sahip tüm tabloların listesini verecektir.
Aşağıdaki komut dosyalarında, <username>, <password> ve <schema> öğelerini özel verilerinizle değiştirin.
Bir mysql istemci oturumuna kopyalayıp yapıştırabileceğiniz ifadeleri göstermek için aşağıdakileri yazın:
echo 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
Değişikliği basitçe yürütmek için şunu kullanın:
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>
KREDİ: Bu, bu makalede ana hatları verilenlerin bir çeşididir .
Tek çizgi:
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"
: böyle ters tırnakların içinde `"$1"`
cevabım var ne benzer.
Bunu phpMyAdmin'inizde sql sorgusu olarak kullanın
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM';
Bu ifadeyi mysql komut satırı aracında yürütebilirsiniz:
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
Kullanarak kullanıcı adını ve parolayı belirtmeniz gerekebilir: mysql -u kullanıcı adı -p Sonuç mysql'ye geri dönebileceğiniz bir sql betiğidir:
mysql name-of-database < convert.sql
Yukarıdaki deyim ve komut satırında "veritabanı adı" değiştirin.
-bash: ,TABLE_NAME,: command not found
Çok basit sadece kopyalamak ve yapıştırmak için İKİ adım vardır:
Aşama 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;
(tüm sonuçları kopyalayıp sql sekmesine yapıştırın)
2. adım: (tüm sonuçları sql sekmesine kopyalayın) ve aşağıdaki satırı yapıştırın
İŞLEMİ BAŞLAT;
COMMIT;
Örneğin. İŞLEMİ BAŞLAT;
TABLOYU DEĞİŞTİR admin_files
MOTORU = InnoDB;
COMMIT;
Bu şemalar / tablolar tarafından sıralanan sistem dışı tüm şemalardaki tüm tablolar için ALTER deyimleri oluşturmak üzere aşağıdakileri çalıştırın:
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;
Bundan sonra, değişikliği gerçekleştirmek için bu sorguları bir istemci aracılığıyla çalıştırın.
Henüz bahsedilmedi, bu yüzden gelecek nesiller için yazacağım:
DB sunucuları arasında geçiş yapıyorsanız (veya dta'nızı boşaltmanız ve yeniden yüklemeniz için başka bir nedeniniz varsa), çıktıyı şu adresten değiştirebilirsiniz mysqldump
:
mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;
Sonra tekrar yükleyin:
mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql
(Ayrıca, sınırlı deneyimime göre, bu, 'canlı' tabloları değiştirmekten çok daha hızlı bir süreç olabilir. Muhtemelen veri ve dizinlerin türüne bağlıdır.)
İşte Django kullanıcıları için bunu yapmanın bir yolu:
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
Bunu klasör yönetimi / komutları altında uygulamanıza ekleyin / Sonra tüm tablolarınızı bir manage.py komutuyla dönüştürebilirsiniz:
python manage.py convert_to_innodb
MySQL'in içinden, bir metin düzenleyicisi kullanarak arama / değiştirme özelliğini kullanabilirsiniz:
SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';
Not: "MySQL dahili bileşenlerinin bazılarını uygulayan mysql ve information_schema veritabanları hala MyISAM'ı kullandığından, information_schema ve mysql'i görmezden gelmelisiniz. Özellikle, hibe tablolarını InnoDB kullanmak için değiştiremezsiniz." ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )
Her durumda, yok sayılacak ve çalıştırılacak tablolara dikkat edin:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';
Şimdi bu listeyi kopyalayıp metin düzenleyicinize yapıştırın ve "|" "ALTER TABLE" vb. ile
Daha sonra mysql terminalinize yapıştırabileceğiniz böyle bir listeye sahip olacaksınız:
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;
Metin düzenleyiciniz bunu kolayca yapamazsa, linux terminalinden veritabanınızın yalnızca bir öneki için benzer bir liste (mysql'ye yapıştırabileceğiniz) almak için başka bir çözüm:
mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"
Düz bir MySQL Sürümü.
Sadece mysql çalıştırılabilir dosyayı başlatabilir, veritabanını kullanabilir ve sorguyu kopyalayıp yapıştırabilirsiniz.
Bu, geçerli veritabanındaki tüm MyISAM tablolarını INNODB tablolarına dönüştürür.
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;
tek tablo için veritabanı motorunu değiştirmek için bu satırı kullanın.
ALTER TABLE table_name ENGINE = INNODB;
Ben bir acemi ve kendi çözüm bulmak zorunda kaldı çünkü web üzerindeki mysql komutları genellikle yazım hataları ile bilmece yeni başlayan insanlar için gerçek bir yaşam kabusu oluşturmak. İşte benim çözümüm ....
Tablo başına 1 komut yerine, bir kerede excel kullanarak düzinelerce komut (kopyalayıp yapıştırmaya hazır) hazırladım.
Nasıl? macun pencerenizi genişletin ve mysql girin ve sonra "TABLO DURUMU GÖSTER" komutunu çalıştırın; ve çıktıyı microsoft excel'e kopyalayın / yapıştırın. Veri sekmesine gidin ve sütunlara bir boşluk tuşu ile sınırlanan "sütunlara metin" özelliğini kullanın. Sonra sütunları tablo sütunlarınızı hangi sütun türünü gösterirse göre sıralayın ve tabloların zaten InnoDb biçiminde olduğu tüm satırları silin (çünkü bunlara karşı komut çalıştırmamız gerekmez, zaten yapılır). Ardından tablolar sütununun soluna 2 sütun ve sağa 2 sütun ekleyin. Sonra komutun ilk bölümünü sütun-1'e yapıştırın (aşağıya bakın). Sütun 2 sadece boşluk içermelidir. Sütun 3 tablo sütununuzdur. Sütun 4 yalnızca boşluk içermelidir. Sütun 5, komutunuzun son kısmıdır. Şöyle görünmelidir:
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;
Sonra kopyalayın ve bir seferde yaklaşık 5 satır mysql içine yapıştırın. Bu, aynı anda yaklaşık 5 dönüştürecektir. Bir kerede bundan daha fazlasını yaparsam, komutların başarısız olacağını fark ettim.
Benim durumumda, varsayılan MyISAM olan bir MySQL örneğinden, VARSAYILAN InnoDB olan bir MariaDB örneğine geçiyordum.
MariaDB Göçmenlik Belgelerine göre.
Eski Sunucu Çalışmasında:
mysqldump -u root -p --skip-create-options --all-databases > migration.sql
--Skip-create-options veri sunucusunu MyISAM yerine yüklerken varsayılan depolama motorunu kullanmasını sağlar.
mysql -u root -p < migration.sql
Bu mysql.db oluşturma ile ilgili bir hata attı, ama şimdi her şey harika çalışıyor :)
Sadece başka bir yolu (basit?) Test ettim ve benim için çalıştı.
DB'nizi .sql dosyası olarak dışa aktarın, gedit veya not defteri ile düzenleyin;
Değiştir ENGINE=MyISAM
ile ENGINE=INNODB
dosya ve Kaydet Düzenlenen
Yapılan numara veya değiştirme tablolarınızın sayısı olmalıdır
MySQL'e aktarın (phpMyAdmin veya komut satırı)
Ve Voila!
En sevdiğiniz komut dosyası dilinde bunu yapmak için bir komut dosyası yazabilirsiniz. Komut dosyası aşağıdakileri yapar:
SHOW FULL TABLES
.'BASE TABLE'
ve'VIEW'
.'VIEW'
, uygun ALTER TABLE
komutu verin.Bu kabuk komut dosyasını deneyin
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
Bu utut betiğinde bazı düzeltmeler
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");
}
}
Bu basit bir php betiğidir.
<?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 bağlamak için;
<?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);
} ?>
Yine başka bir seçenek ... Bunu ansibleda nasıl yapacağınız. Veritabanınızın adının bulunduğu dbname
ve erişimi önceden yapılandırdığınız varsayılır .
- 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 }}"