Nasıl MyISAM tüm tabloları InnoDB dönüştürmek için?


264

Tablo depolama MyISAM InnoDB değiştirmek için ayrı ayrı bir değiştirme tablosu verebilir biliyorum.

Hepsini hızlı bir şekilde InnoDB olarak değiştirmenin bir yolu olup olmadığını merak ediyorum?


1
Dönüşüm hakkında ipuçları .
Rick James

Yanıtlar:


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
Muhtemelen bunu odaklanmakta olduğunuz veritabanıyla sınırlamak daha iyi olur. Bir "AND TABLE_SCHEMA = 'dbname' ekleyin, aksi takdirde bu, tüm internet MySQL tablolarını innodb olarak da değiştirebilir / değiştirir (bazıları bellek olması gerektiğinde)
Noodles

7
PHP'nin 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.
Rick James

4
@GajendraBang - Evet, cevap sunulduğunda geçerlidir. Ancak yeni gelenler için artık geçerli değil. Amacım onu olduğu gibi kullanmaya karşı uyarmaktı .
Rick James

1
Soru
PHP'den

1
En son düzenleme nasıl işaretlenmez? MySQL bölümü Will Jones'un cevabının doğrudan bir kopyasıdır. Bu cevabın 2019'da ortaya çıkarken Will'in cevabının 2013'te göründüğünü bulmak için her bir düzenleme geçmişine bakın. Sonuç olarak, bu sorunun bütünlüğü tehlikeye atılmıştır.
rmutalik

549

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_dbDeğ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.


4
Güzel çalıştı! Burada örnek bir kabuk komut dosyasına koydum: shrubbery.mynetgear.net/c/display/W/…
Joshua Davis

4
"# 1267 yasadışı harmanlama karışımı ..." Bu hatayı alıyorum, işe yaramıyor
Rápli András

1
Sadece meraktan, açık azalan sıralamanın anlamı nedir? ( ORDER BY table_name DESC)
rinogo

12
Ve birden fazla veritabanı muamele ederken, değişiklik veritabanı her şey değiştirmek istemiyorsanız CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')içinCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
ub3rst4r

1
Tüm veritabanları için ifadeleri almak istiyorsanız (MySQL sistem veritabanları hariç): 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';

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.


5
Bunu çalıştırdıktan sonra ilk olarak aşağıdaki sorguyu yürütmeniz gerekir: USE databasename; Sonra yukarıdaki komut dosyasının verdiği sorguları kullanabilirsiniz.
gijs007

Toplu işi nasıl yürütürsünüz?
Marc Alexander

Yukarıdaki sorgu size tablo sorguları değiştirme verecektir. hepsini seçin ve birlikte yürütün. veya 50 sorgular grupları bunları bölmek ve resultset'de çok fazla tabloları varsa onları çalıştırmak
Omkar Kulkarni

2
2018'de ve Percona Kümesi'nde bile çalışıyor. PHPMyAdmin'den kullanıyorsanız, yalnızca 20 kadar ad, ardından "..." veya bir sayfalandırma >> sembolü alırsınız. Bu, herhangi bir tabloyu kaçırmamak için sonraki tüm sayfaları tıklayıp kopyalamaya devam etmeniz gerektiği anlamına gelir. Bunu unutursanız, yukarıdaki sorguyu güvenle yeniden uygulayabilirsiniz ve size dönüştürülecek sonraki MyISAM tablolarını verecektir.
Dario Fumagalli

23

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 .


23

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
EN İYİ ve EN AKILLI cevap!
15:56

Bunu bir bash betiğinde çalıştırdığımda, NR tanımının üzerine yazarken $ 1'i bash betiği değişkeni olarak yorumlar. Bunun herhangi bir yolu var mı?
Yaşam için çalışıyor

Enclose @WorksforaLiving "$1": böyle ters tırnakların içinde `"$1"`cevabım var ne benzer.
Vijay Varadan

20

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';

3
Bu aslında tabloları InnoDB dönüştürmek gibi görünmüyor.
Charlie Schliesser

3
Bu, daha sonra tabloları dönüştürmek için çalıştırdığınız bir komut dosyası çıkarır - bu iki adımdır. BİLGİ_SCHEMA tablolarını dönüştürmeye çalışır - bu kötü bir şeydir. Doğru veritabanıyla sınırlandırmanız gerekiyor.
Brilliand

1
Dahili mysql tablolarımızı - "mysql veritabanındaki MySQL sistem tablolarını (kullanıcı veya ana bilgisayar gibi) InnoDB türüne dönüştürmeyin. Bu desteklenmeyen bir işlemdir. Sistem tabloları her zaman MyISAM türünde. " bağlantı
eug

@ Eug'un yorumunu bu cevaba dahil etmek için düzenleme yapmadan, bu sayfadaki varyantlardan herhangi biri kadar zarif olsa da, bir aşağı oyu hak ettiğini düşünüyorum.
mc0e

Hmm. @ charlie-s de doğrudur ve bu çalışma SQL'i üretmez. Aşağı oylama bana haklı görünüyor.
mc0e

18

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.


@itsraja, "echo" linux / unix üzerinde sh ve Microsoft sistemlerinde cmd tarafından desteklenen bir komuttur, sonuç mysql aracına girdi olarak iletilir.
Hendrik Brummermann

2
doğru. Ama u "mysql komut satırı aracı" olarak bahsettik
itsraja

1
Ayrıca, "SELECT concat (concat ('ALTER TRABLE', TABLE_NAME), 'ENGINE = InnoDB;') SEPETLER NEREDE MOTOR! = 'InnoDB' VE TABLE_TYPE = 'BASE TABLE' VE TABLE_SCHEMA = 'testinno'" | mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> convert.sql HATA 1146 (42S02) satır 1'de: 'testinno.TABLES' tablosu yok
itsraja

Bunu burada örnek bir kabuk betiğine koydum: shrubbery.mynetgear.net/c/display/W/…
Joshua Davis

1
Bir dize olarak sql ifadesinden nasıl düzgün bir şekilde kaçabiliriz? Şimdi olduğu gibi, ben olsun-bash: ,TABLE_NAME,: command not found
arjan

10

Ç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;


10

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.

  • Cevap yukarıdaki cevaplara dayanır, ancak şema yönetimini geliştirir.

8

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.)


ty! tam olarak aradığım şey. Birkaç gün içinde test edecek.
Rainer

7

İş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

5

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;"

5

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;

Saklı yordam tabanlı çözümler olmadığını şaşırdım!
FrustratedWithFormsDesigner

MySQL'de yazma ve test prosedürleri acıdır ;-) Yorumun soru ile ilgisi yoktur.
Harald Leithner

3

tek tablo için veritabanı motorunu değiştirmek için bu satırı kullanın.

  ALTER TABLE table_name ENGINE = INNODB;

3

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.


3

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 :)


3

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=MyISAMile ENGINE=INNODBdosya 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!


2

En sevdiğiniz komut dosyası dilinde bunu yapmak için bir komut dosyası yazabilirsiniz. Komut dosyası aşağıdakileri yapar:

  1. Konu SHOW FULL TABLES .
  2. Döndürülen her satır için ikinci sütunun yazıp yazmadığını kontrol edin 'BASE TABLE' ve'VIEW' .
  3. Değilse 'VIEW', uygun ALTER TABLEkomutu verin.

2

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

2

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;

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

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>';
    }

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 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);
} ?>

0

Yine başka bir seçenek ... Bunu ansibleda nasıl yapacağınız. Veritabanınızın adının bulunduğu dbnameve 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 }}"

-1

cd / var / lib / mysql / DBNAME

ls | grep ".frm" | kes -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "tabloyu değiştir {} MOTOR = INNODB;" -uroot -pXXXXX

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.