Respuestas:
<?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_*
interfaz de PHP está en desuso y se elimina del ver 7. No use este código como está.
Ejecute esta instrucción SQL (en el cliente MySQL, phpMyAdmin o donde sea) para recuperar todas las tablas MyISAM en su base de datos.
Reemplace el valor de la name_of_your_db
variable con el nombre de su base de datos.
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;
Luego, copie el resultado y ejecútelo como una nueva consulta SQL.
ORDER BY table_name DESC
)
CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')
aCONCAT('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';
Funciona de maravilla.
Esto le dará una lista de todas las tablas con las consultas alternativas que puede ejecutar en un lote
En los siguientes scripts, reemplace <nombre de usuario>, <contraseña> y <esquema> con sus datos específicos.
Para mostrar las declaraciones que puede copiar y pegar en una sesión de cliente mysql, escriba lo siguiente:
echo 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
Para ejecutar simplemente el cambio, use esto:
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ÉDITO: Esta es una variación de lo que se describió en este artículo .
Una línea:
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"
como este: `"$1"`
similar a lo que está en mi respuesta.
Use esto como una consulta SQL en su phpMyAdmin
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM';
Puede ejecutar esta declaración en la herramienta de línea de comando 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
Es posible que deba especificar el nombre de usuario y la contraseña usando: mysql -u username -p El resultado es un script sql que puede volver a canalizar en mysql:
mysql name-of-database < convert.sql
Reemplace "nombre-de-base de datos" en la declaración anterior y la línea de comando.
-bash: ,TABLE_NAME,: command not found
Es muy simple, solo hay DOS pasos, solo copie y pegue:
paso 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;
(copie y pegue todos los resultados en la pestaña sql)
paso 2: (copia todos los resultados en la pestaña sql) y pégalo debajo en la línea
INICIAR LA TRANSACCIÓN;
COMETER;
p.ej. INICIAR LA TRANSACCIÓN;
ALTER TABLE admin_files
ENGINE = InnoDB;
COMETER;
Para generar sentencias ALTER para todas las tablas en todos los esquemas que no son del sistema, ordenados por esos esquemas / tablas ejecute lo siguiente:
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;
Después de eso, ejecute esas consultas a través de un cliente para realizar la modificación.
Todavía no se ha mencionado, así que lo escribiré para la posteridad:
Si está migrando entre servidores de base de datos (o tiene otra razón por la que volcaría y volvería a cargar su dta), puede modificar la salida desde mysqldump
:
mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;
Luego cárguelo nuevamente:
mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql
(Además, en mi experiencia limitada, este puede ser un proceso mucho más rápido que alterar las tablas 'en vivo'. Probablemente depende del tipo de datos e índices).
Aquí hay una manera de hacerlo para los usuarios 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
Agregue eso a su aplicación en la carpeta de administración / comandos / Luego puede convertir todas sus tablas con un comando manage.py:
python manage.py convert_to_innodb
Desde mysql, puede usar buscar / reemplazar usando un editor de texto:
SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';
Nota: Probablemente debería ignorar information_schema y mysql porque "las bases de datos mysql e information_schema, que implementan algunos de los componentes internos de MySQL, aún usan MyISAM. En particular, no puede cambiar las tablas de concesión para usar InnoDB". ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )
En cualquier caso, tenga en cuenta las tablas para ignorar y ejecutar:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';
Ahora solo copie / pegue esa lista en su editor de texto y busque / reemplace "|" con "ALTER TABLE", etc.
Luego tendrá una lista como esta que simplemente puede pegar en su 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 su editor de texto no puede hacer esto fácilmente, aquí hay otra solución para obtener una lista similar (que puede pegar en mysql) para solo un prefijo de su base de datos, desde la terminal de Linux:
mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"
Una versión simple de MySQL.
Simplemente puede iniciar el ejecutable mysql, usar la base de datos y copiar y pegar la consulta.
Esto convertirá todas las tablas MyISAM de la base de datos actual en tablas 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;
use esta línea para alterar el motor de la base de datos para una sola tabla.
ALTER TABLE table_name ENGINE = INNODB;
Soy un novato y tuve que encontrar mi propia solución porque los comandos de mysql en la web generalmente están plagados de errores ortográficos que crean una pesadilla en la vida real para las personas que recién comienzan. Aquí está mi solución ...
En lugar de 1 comando por tabla, preparé docenas de comandos (listos para copiar y pegar) a la vez usando Excel.
¿Cómo? expanda su ventana de masilla e ingrese mysql y luego ejecute el comando "SHOW TABLE STATUS"; y el copiar / pegar la salida a Microsoft Excel. Vaya a la pestaña Datos y use la función "texto a columnas" y delimite las columnas con una tecla de espacio. Luego ordene las columnas según la columna que muestre sus tipos de tabla y elimine todas las filas en las que las tablas ya están en formato InnoDb (porque no necesitamos ejecutar comandos contra ellas, ya están hechas). Luego agregue 2 columnas a la izquierda de la columna de tablas y 2 columnas a la derecha. Luego pegue la primera parte del comando en la columna 1 (ver más abajo). La columna 2 debe contener solo un espacio. La columna 3 es su columna de tablas. La columna 4 debe contener solo un espacio. La columna 5 es la última parte de su comando. Debe tener un aspecto como este:
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;
Luego copie y pegue aproximadamente 5 filas a la vez en mysql. Esto convertirá aproximadamente 5 a la vez. Noté que si hacía más que eso de una vez, los comandos fallaban.
En mi caso, estaba migrando de una instancia de MySQL con un valor predeterminado de MyISAM a una instancia de MariaDB con un DEFAULT de InnoDB.
En el antiguo servidor Ejecutar:
mysqldump -u root -p --skip-create-options --all-databases > migration.sql
--Skip-create-options asegura que el servidor de la base de datos use el motor de almacenamiento predeterminado al cargar los datos, en lugar de MyISAM.
mysql -u root -p < migration.sql
Esto arrojó un error con respecto a la creación de mysql.db, pero todo funciona muy bien ahora :)
Simplemente probé otra forma (¿simple?) Y funcionó para mí.
Simplemente exporte su DB como archivo .sql, edítelo con gedit o notepad;
Reemplace ENGINE=MyISAM
con ENGINE=INNODB
y guarde el archivo editado
El número o reemplazo realizado debe ser el número de sus tablas
Importarlo a MySQL (phpMyAdmin o línea de comando)
Y voilá !
Puede escribir un guión para hacerlo en su lenguaje de secuencias de comandos favorito. El script haría lo siguiente:
SHOW FULL TABLES
.'BASE TABLE'
y no'VIEW'
.'VIEW'
, emita el ALTER TABLE
comando apropiado .Prueba este script de 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
Algunas correcciones a este script de utilidad
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");
}
}
Este es un script PHP simple.
<?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();
?>
para 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);
} ?>
Otra opción más ... He aquí cómo hacerlo en ansible. Se supone que el nombre de su base de datos está en dbname
y que ya ha configurado el acceso.
- 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 }}"