Comment convertir toutes les tables de MyISAM en InnoDB?

264

Je sais que je peux émettre une table alter individuellement pour changer le stockage de table de MyISAM à InnoDB.

Je me demande s'il existe un moyen de les changer rapidement tous en InnoDB?

Pentium10
la source
1
Conseils sur la conversion.
Rick James

Réponses:

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);
    }
?>
Gajendra Bang
la source
5
Il serait probablement préférable de limiter cela à la base de données sur laquelle vous vous concentrez. Ajoutez un "AND TABLE_SCHEMA = 'dbname', sinon cela peut / changera également toutes les tables MySQL Internet en innodb (quand certaines d'entre elles devraient être de la mémoire)
Noodles
7
L' mysql_*interface de PHP est obsolète et supprimée de la version 7. N'utilisez pas ce code tel quel.
Rick James
4
@GajendraBang - Oui, la réponse est valable lorsqu'elle est présentée. Mais pour les nouveaux arrivants, ce n'est plus valable. Mon intention était de déconseiller de l'utiliser tel quel .
Rick James
1
La question ne mentionne pas PHP du tout
phil294
1
Comment la modification la plus récente n'est-elle pas signalée? La partie MySQL est une copie directe de la réponse de Will Jones. Examinez chaque historique des modifications pour découvrir que la réponse de Will est apparue en 2013 tandis que cette réponse est apparue en 2019. Par conséquent, l'intégrité de cette question est compromise.
rmutalik
549

Exécutez cette instruction SQL (dans le client MySQL, phpMyAdmin ou ailleurs) pour récupérer toutes les tables MyISAM de votre base de données.

Remplacez la valeur de la name_of_your_dbvariable par le nom de votre base de données.

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;

Ensuite, copiez la sortie et exécutez-la en tant que nouvelle requête SQL.

Will Jones
la source
4
Cela a bien fonctionné! Je l'ai mis dans un exemple de script shell ici: shrubbery.mynetgear.net/c/display/W/…
Joshua Davis
4
"# 1267 mélange illégal de classements ..." Je reçois cette erreur, cela ne fonctionne pas
Rápli András
1
Juste par curiosité, quel est l'intérêt de l'ordre descendant explicite? ( ORDER BY table_name DESC)
rinogo
12
Si vous traitez plusieurs bases de données et que vous ne voulez pas changer la base de données à chaque fois, CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')CONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
passez
1
Si vous voulez obtenir les instructions pour toutes les bases de données (sauf les bases de données du système 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';

Fonctionne comme un charme.

Cela vous donnera la liste de toutes les tables avec les requêtes alter que vous pouvez exécuter dans un lot

Omkar Kulkarni
la source
5
Après avoir exécuté cela, vous devez d'abord exécuter la requête suivante: USE databasename; Ensuite, vous pouvez utiliser les requêtes fournies par le script ci-dessus.
gijs007
Comment exécutez-vous un lot?
Marc Alexander
La requête ci-dessus vous donnera des requêtes de table alter. il suffit de les sélectionner tous et de les exécuter ensemble. ou divisez-les en groupes de 50 requêtes et exécutez-les s'il y a trop de tables dans le jeu de résultats
Omkar Kulkarni
2
Cela fonctionne même sur 2018 et sur Percona Cluster. Si vous l'utilisez à partir de PHPMyAdmin, vous n'obtiendrez qu'une vingtaine de noms, puis "..." ou un symbole de pagination >>. Cela signifie que vous devez cliquer et continuer à copier toutes les pages suivantes pour ne manquer aucun tableau. Si vous oubliez cela, vous pouvez réappliquer en toute sécurité la requête ci-dessus et elle vous donnera les prochaines tables MyISAM à convertir.
Dario Fumagalli
23

Dans les scripts ci-dessous, remplacez <username>, <password> et <schema> par vos données spécifiques.

Pour afficher les instructions que vous pouvez copier-coller dans une session client mysql, tapez ce qui suit:

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

Pour exécuter simplement la modification, utilisez ceci:

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>

CRÉDIT: Il s'agit d'une variante de ce qui a été décrit dans cet article .

Vijay Varadan
la source
23

Une ligne:

 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
kuzea
la source
1
La MEILLEURE et la plus INTELLIJENTE réponse!
biniam
Lorsque j'exécute cela dans un script bash, il interprète le $ 1 comme une variable de script bash écrasant la définition NR. Quelque chose autour de ça?
Works for a Living
@WorksforaLiving entoure les "$1"guillemets comme ceci: `"$1"`similaire à ce qui est dans ma réponse.
Vijay Varadan
20

Utilisez-le comme une requête SQL dans votre phpMyAdmin

SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;') 
FROM information_schema.tables 
WHERE engine = 'MyISAM';
Zwarmapapa
la source
3
Cela ne semble pas réellement convertir les tables en InnoDB.
Charlie Schliesser
3
Cela génère un script que vous exécutez ensuite pour convertir les tables - il s'agit de deux étapes. Il essaie cependant de convertir les tables INFORMATION_SCHEMA - c'est une mauvaise chose. Besoin de le limiter à la bonne base de données.
Brilliand
1
Vous devrez filtrer nos tables mysql internes - selon la documentation "Ne convertissez pas les tables système MySQL dans la base de données mysql (comme utilisateur ou hôte) au type InnoDB. Ceci est une opération non prise en charge. Les tables système doivent toujours être du type MyISAM. " link
eug
Sans modification pour incorporer le commentaire de @ eug dans cette réponse, je pense que cela mérite un vote négatif, bien qu'il soit autrement aussi élégant que n'importe laquelle des variantes de cette page.
mc0e
Hmm. @ charlie-s est également correct, et cela ne produit pas de SQL fonctionnel. Un vote à la baisse me semble justifié.
mc0e
18

Vous pouvez exécuter cette instruction dans l'outil de ligne de commande 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

Vous devrez peut-être spécifier un nom d'utilisateur et un mot de passe en utilisant: mysql -u username -p Le résultat est un script sql que vous pouvez rediriger vers mysql:

mysql name-of-database < convert.sql

Remplacez "nom-de-base de données" dans l'instruction et la ligne de commande ci-dessus.

Hendrik Brummermann
la source
@itsraja, "echo" est une commande prise en charge à la fois par sh sur linux / unix et cmd sur les systèmes Microsoft, le résultat est transmis en entrée à l'outil mysql.
Hendrik Brummermann
2
C'est vrai. Mais vous l'avez mentionné comme "outil de ligne de commande mysql"
itsraja
1
Également, sélectionnez "SELECT concat (concat ('ALTER TRABLE', TABLE_NAME), 'ENGINE = InnoDB;') FROM TABLES WHERE ENGINE! = 'InnoDB' ET TABLE_TYPE = 'BASE TABLE' ET TABLE_SCHEMA = 'testinno'" | mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> convert.sql ERREUR 1146 (42S02) à la ligne 1: la table 'testinno.TABLES' n'existe pas
itsraja
J'ai mis cela dans un exemple de script shell ici: shrubbery.mynetgear.net/c/display/W/…
Joshua Davis
1
Comment échapper correctement à l'instruction sql sous forme de chaîne? Tel qu'il est maintenant, je reçois-bash: ,TABLE_NAME,: command not found
arjan
10

C'est très simple, il n'y a que DEUX étapes à copier et coller:

étape 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;

(copiez et collez tous les résultats dans l'onglet SQL)

étape 2: (copiez tous les résultats dans l'onglet sql) et collez ci-dessous dans la ligne

COMMENCER LA TRANSACTION;

COMMETTRE;

par exemple. COMMENCER LA TRANSACTION;

MODIFIER TABLE admin_files ENGINE = InnoDB;

COMMETTRE;

Sachin de Pune
la source
10

Pour générer des instructions ALTER pour toutes les tables de tous les schémas non système, classés par ces schémas / tables, exécutez ce qui suit:

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;

Après cela, exécutez ces requêtes via un client pour effectuer la modification.

  • La réponse est basée sur les réponses ci-dessus, mais améliore la gestion du schéma.
Lavi Avigdor
la source
8

Il n'a pas encore été mentionné, je vais donc l'écrire pour la postérité:

Si vous migrez entre des serveurs de base de données (ou si vous avez une autre raison pour vider et recharger votre dta), vous pouvez simplement modifier la sortie de mysqldump:

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

Rechargez-le ensuite:

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

(De plus, selon mon expérience limitée, cela peut être un processus beaucoup plus rapide que de modifier les tables "en direct". Cela dépend probablement du type de données et d'index.)

Quinn Comendant
la source
ty! exactement ce que je cherchais. Le testera dans quelques jours.
Rainer
7

Voici une façon de le faire pour les utilisateurs de 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

Ajoutez cela à votre application sous la gestion des dossiers / commandes / Ensuite, vous pouvez convertir toutes vos tables avec une commande manage.py:

python manage.py convert_to_innodb
sangsue
la source
5

Depuis mysql, vous pouvez utiliser la recherche / remplacement à l'aide d'un éditeur de texte:

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

Remarque: Vous devriez probablement ignorer information_schema et mysql car "Les bases de données mysql et information_schema, qui implémentent certains des internes de MySQL, utilisent toujours MyISAM. En particulier, vous ne pouvez pas changer les tables de droits pour utiliser InnoDB." ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )

Dans tous les cas, notez les tables à ignorer et à exécuter:

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

Il suffit maintenant de copier / coller cette liste dans votre éditeur de texte et de rechercher / remplacer "|" avec "ALTER TABLE" etc.

Vous aurez alors une liste comme celle-ci que vous pourrez simplement coller dans votre terminal 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;

Si votre éditeur de texte ne peut pas le faire facilement, voici une autre solution pour obtenir une liste similaire (que vous pouvez coller dans mysql) pour un seul préfixe de votre base de données, à partir du terminal linux:

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

Une version simple de MySQL.

Vous pouvez simplement démarrer l'exécutable mysql, utiliser la base de données et copier-coller la requête.

Cela convertira toutes les tables MyISAM de la base de données actuelle en tables 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;
Harald Leithner
la source
Je suis surpris qu'il n'y ait pas plus de solutions basées sur des procédures stockées!
FrustratedWithFormsDesigner
Parce que les procédures d'écriture et de test dans MySQL sont pénibles ;-) le commentaire n'a rien à voir avec la question.
Harald Leithner
3

utilisez cette ligne pour modifier le moteur de base de données pour une table unique.

  ALTER TABLE table_name ENGINE = INNODB;
Développeur
la source
3

Je suis un débutant et j'ai dû trouver ma propre solution parce que les commandes mysql sur le Web sont généralement criblées d'orthographes et créent un véritable cauchemar pour les gens qui débutent. Voici ma solution ....

Au lieu d'une commande par table, j'ai préparé des dizaines de commandes (prêtes à copier et coller) à la fois en utilisant Excel.

Comment? agrandissez votre fenêtre de mastic et entrez mysql puis exécutez la commande "SHOW TABLE STATUS;" et le copier / coller de la sortie vers Microsoft Excel. Allez dans l'onglet Données et utilisez la fonction "texte vers colonnes" et délimitez les colonnes par une touche espace. Ensuite, triez les colonnes selon la colonne qui affiche vos types de table et supprimez toutes les lignes dont les tables sont déjà au format InnoDb (car nous n'avons pas besoin d'exécuter des commandes contre elles, elles sont déjà effectuées). Ajoutez ensuite 2 colonnes à gauche de la colonne des tableaux et 2 colonnes à droite. Collez ensuite la première partie de la commande dans la colonne 1 (voir ci-dessous). La colonne 2 ne doit contenir qu'un espace. La colonne 3 est votre colonne de tableaux. La colonne 4 ne doit contenir qu'un espace. La colonne 5 est la dernière partie de votre commande. Ça devrait ressembler à ça:

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;

Copiez et collez ensuite environ 5 lignes à la fois dans mysql. Cela convertira environ 5 à la fois. J'ai remarqué que si j'en faisais plus à la fois, les commandes échoueraient.

user3035649
la source
3

Dans mon cas, je migrais d'une instance MySQL avec un défaut de MyISAM, vers une instance MariaDB avec un DEFAULT d'InnoDB.

Selon MariaDB Migration Doc's.

Sur l'ancien serveur:

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

Les options --skip-create-s'assurent que le serveur de base de données utilise le moteur de stockage par défaut lors du chargement des données, au lieu de MyISAM.

mysql -u root -p < migration.sql

Cela a généré une erreur concernant la création de mysql.db, mais tout fonctionne très bien maintenant :)

FreeSoftwareServers
la source
3

Je viens de tester une autre méthode (simple?) Et j'ai travaillé pour moi.

Il vous suffit d'exporter votre base de données sous forme de fichier .sql, de le modifier avec gedit ou le bloc-notes;

Remplacer ENGINE=MyISAMpar ENGINE=INNODBet enregistrer le fichier modifié

Le nombre ou le remplacement effectué doit être le nombre de vos tables

Importez-le dans MySQL (phpMyAdmin ou ligne de commande)

Et le tour est joué!

Malibou
la source
2

Vous pouvez écrire un script pour le faire dans votre langage de script préféré. Le script ferait ce qui suit:

  1. Problème SHOW FULL TABLES .
  2. Pour chaque ligne retournée, vérifiez que la deuxième colonne indique 'BASE TABLE'et non'VIEW' .
  3. Si ce n'est pas le cas 'VIEW', exécutez la ALTER TABLEcommande appropriée .
Hammerite
la source
2

Essayez ce script shell

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
Muhammad Reda
la source
2

Quelques corrections à ce script util

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;
user3035727
la source
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");
    }
  }
Rodrigo Gregorio
la source
1

Il s'agit d'un simple script 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>';
    }
touzas
la source
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();

?>
Russell G
la source
1

pour 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);
} ?>
Berdan
la source
0

Encore une autre option ... Voici comment le faire en ansible. Il suppose que le nom de votre base de données se trouve dbnameet que vous avez déjà configuré l'accès.

- 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 }}"
Synchro
la source
-1

cd / var / lib / mysql / DBNAME

ls | grep ".frm" | cut -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "alter table {} ENGINE = INNODB;" -uroot -pXXXXX

api984
la source