<?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);}?>
Probablemente sería mejor limitar esto a la base de datos en la que se está enfocando. Agregue un "AND TABLE_SCHEMA = 'dbname', de lo contrario, esto puede / cambiará todas las tablas de MySQL de Internet a innodb también (cuando algunas de ellas deberían ser memoria)
Fideos
77
La mysql_*interfaz de PHP está en desuso y se elimina del ver 7. No use este código como está.
Rick James
44
@GajendraBang: Sí, la respuesta es válida cuando se presenta. Pero para los recién llegados, ya no es válido. Mi intención era advertir contra usarlo como está .
Rick James el
1
La pregunta no menciona PHP en absoluto
phil294
1
¿Cómo no se marca la edición más reciente? La parte de MySQL es una copia directa de la respuesta de Will Jones. Mire cada historial de edición para encontrar que la respuesta de Will apareció en 2013 mientras que esta respuesta apareció en 2019. Como resultado, la integridad de esta pregunta se ve comprometida.
rmutalik
549
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_dbvariable 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'ORDERBY table_name DESC;
Luego, copie el resultado y ejecútelo como una nueva consulta SQL.
"# 1267 mezcla ilegal de colaciones ..." Recibo este error, no funciona
Rápli András
1
Solo por curiosidad, ¿cuál es el punto del ordenamiento descendente explícito? ( ORDER BY table_name DESC)
rinogo
12
Si está tratando con múltiples bases de datos y no quiere cambiar la base de datos cada vez, cambie CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')aCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
ub3rst4r el
1
Si desea obtener las declaraciones para todas las bases de datos (excepto las bases de datos del sistema 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';
Funciona de maravilla.
Esto le dará una lista de todas las tablas con las consultas alternativas que puede ejecutar en un lote
Después de ejecutar esto, primero debe ejecutar la siguiente consulta: USE databasename; Luego puede usar las consultas que proporciona el script anterior.
gijs007
¿Cómo se ejecuta un lote?
Marc Alexander
La consulta anterior le dará consultas de tablas alternativas. simplemente selecciónelos todos y ejecútelos juntos. o divídalos en grupos de 50 consultas y ejecútelos si hay demasiadas tablas en el conjunto de resultados
Omkar Kulkarni
2
Funciona incluso en 2018 y en Percona Cluster. Si lo usa desde PHPMyAdmin, solo obtendrá unos 20 nombres, luego "..." o un símbolo de paginación >>. Esto significa que debe hacer clic y copiar todas las páginas siguientes para no perderse ninguna tabla. Si olvida eso, puede volver a aplicar con seguridad la consulta anterior y le dará las siguientes tablas MyISAM para convertir.
Dario Fumagalli
23
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:
Cuando ejecuto esto en un script bash, interpreta el $ 1 como una variable de script bash que sobrescribe la definición NR. ¿Alguna forma de evitar esto?
Trabaja para vivir
@WorksforaLiving encierra los backticks "$1"como este: `"$1"`similar a lo que está en mi respuesta.
Vijay Varadan
20
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';
Esto no parece convertir realmente las tablas a InnoDB.
Charlie Schliesser
3
Esto genera un script que luego ejecuta para convertir las tablas: son dos pasos. Sin embargo, intenta convertir las tablas INFORMATION_SCHEMA; eso es algo malo. Necesita limitarlo a la base de datos correcta.
Brilliand
1
Tendrá que filtrar nuestras tablas internas de mysql, de acuerdo con los documentos "No convierta las tablas del sistema MySQL en la base de datos mysql (como usuario o host) al tipo InnoDB. Esta es una operación no admitida. Las tablas del sistema siempre deben ser del tipo MyISAM ". enlace
eug
Sin editar para incorporar el comentario de @ eug en esta respuesta, creo que merece un voto negativo, aunque por lo demás es tan elegante como cualquiera de las variantes en esta página.
mc0e
Hmm @ charlie-s también es correcto, y esto no produce SQL en funcionamiento. Un voto negativo me parece justificado.
mc0e
18
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.
@itsraja, "echo" es un comando compatible con sh en linux / unix y cmd en sistemas Microsoft, el resultado se canaliza como entrada a la herramienta mysql.
Hendrik Brummermann
2
Así es. Pero has mencionado como "herramienta de línea de comando mysql"
itsraja
1
Además, echo "SELECT concat (concat ('ALTER TRABLE', TABLE_NAME), 'ENGINE = InnoDB;') FROM TABLES WHERE ENGINE! = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'testinno'" | mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> convert.sql ERROR 1146 (42S02) en la línea 1: La tabla 'testinno.TABLES' no existe
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 NOTIN('mysql','information_schema','performance_schema','innodb','sys','tmp')AND`ENGINE`='MyISAM'AND`TABLE_TYPE`='BASE TABLE'ORDERBY TABLE_SCHEMA, table_name DESC;
Después de eso, ejecute esas consultas a través de un cliente para realizar la modificación.
La respuesta se basa en las respuestas anteriores, pero mejora el manejo del esquema.
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:
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).
ty! Exactamente lo que estaba buscando. Lo probaré en unos días.
Rainer
7
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");forrowincursor.fetchall():ifrow[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:
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:
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;"
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;
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:
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.
--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 :)
<?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 dbnamey 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_NAMEFROM 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="ALTERTABLE`{{ dbname }}`.`{{ item }}` ENGINE = InnoDB;"
with_items: "{{ converttables.stdout_lines }}"
Respuestas:
fuente
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.Luego, copie el resultado y ejecútelo como una nueva consulta SQL.
fuente
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
Funciona de maravilla.
Esto le dará una lista de todas las tablas con las consultas alternativas que puede ejecutar en un lote
fuente
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:
Para ejecutar simplemente el cambio, use esto:
CRÉDITO: Esta es una variación de lo que se describió en este artículo .
fuente
Una línea:
fuente
"$1"
como este:`"$1"`
similar a lo que está en mi respuesta.Use esto como una consulta SQL en su phpMyAdmin
fuente
Puede ejecutar esta declaración en la herramienta de línea de comando mysql:
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:
Reemplace "nombre-de-base de datos" en la declaración anterior y la línea de comando.
fuente
-bash: ,TABLE_NAME,: command not found
Es muy simple, solo hay DOS pasos, solo copie y pegue:
paso 1.
(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;
fuente
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:
Después de eso, ejecute esas consultas a través de un cliente para realizar la modificación.
fuente
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
:Luego cárguelo nuevamente:
(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).
fuente
Aquí hay una manera de hacerlo para los usuarios de Django:
Agregue eso a su aplicación en la carpeta de administración / comandos / Luego puede convertir todas sus tablas con un comando manage.py:
fuente
Desde mysql, puede usar buscar / reemplazar usando un editor de texto:
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:
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:
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:
fuente
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.
fuente
use esta línea para alterar el motor de la base de datos para una sola tabla.
fuente
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:
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.
fuente
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.
Por MariaDB Migration Doc's.
En el antiguo servidor Ejecutar:
--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.
Esto arrojó un error con respecto a la creación de mysql.db, pero todo funciona muy bien ahora :)
fuente
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
conENGINE=INNODB
y guarde el archivo editadoEl número o reemplazo realizado debe ser el número de sus tablas
Importarlo a MySQL (phpMyAdmin o línea de comando)
Y voilá !
fuente
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 elALTER TABLE
comando apropiado .fuente
Prueba este script de shell
fuente
Algunas correcciones a este script de utilidad
fuente
fuente
Este es un script PHP simple.
fuente
fuente
para mysqli connect;
fuente
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.fuente
cd / var / lib / mysql / DBNAME
ls | grep ".frm" | cortar -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "alter table {} ENGINE = INNODB;" -uroot -pXXXXX
fuente