Realmente solo hay una forma de lograr esto. Tendrá que exportar los datos utilizando mysqldumps, descartar todas las bases de datos, cerrar mysqld, eliminar ib_logfile0, eliminar ib_logfile1, eliminar ibdata1, agregar innodb_file_per_table
debajo del [mysqld]
encabezado, iniciar mysql.
Publiqué esta respuesta en StackOverflow en octubre de 2010
Estos son los pasos enumerados verticalmente:
Paso 01) MySQL Vuelca todas las bases de datos en un archivo de texto SQL (llámalo SQLData.sql)
Paso 02) Descarte todas las bases de datos (excepto el esquema mysql)
Paso 03) Apagar mysql
PRECAUCIÓN : para limpiar totalmente las transacciones no confirmadas de los archivos de InnoDB, ejecute esto
mysql -uroot -p... -Ae"SET GLOBAL innodb_fast_shutdown = 0;"
service mysql stop
Paso 04) Agregue las siguientes líneas a /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
Nota al margen: cualquiera que sea su conjunto para innodb_buffer_pool_size, asegúrese de que innodb_log_file_size sea el 25% de innodb_buffer_pool_size.
Paso 05) Eliminar ibdata1, ib_logfile0 e ib_logfile1
En este punto, solo debe haber el esquema mysql en / var / lib / mysql
Paso 06) Reinicia mysql
Esto recreará ibdata1 a 10MB, ib_logfile0 e ib_logfile1 a 1G cada uno
Paso 07) Vuelva a cargar SQLData.sql en mysql
ibdata1 crecerá pero solo contendrá metadatos de tabla
Cada tabla InnoDB existirá fuera de ibdata1
Supongamos que tiene una tabla InnoDB llamada mydb.mytable. Si ingresa en / var / lib / mysql / mydb, verá dos archivos que representan la tabla
- mytable.frm (encabezado del motor de almacenamiento)
- mytable.ibd (Página principal de datos de tabla e índices de tabla para mydb.mytable)
ibdata1 nunca contendrá más datos e índices de InnoDB.
Con la opción innodb_file_per_table en /etc/my.cnf, puede ejecutar OPTIMIZE TABLE mydb.mytable y el archivo /var/lib/mysql/mydb/mytable.ibd realmente se reducirá.
Lo he hecho muchas veces en mi carrera como DBA MySQL
De hecho, la primera vez que hice esto, colapsé un archivo ibdata1 de 50 GB en 500 MB.
Darle una oportunidad. Si tiene más preguntas sobre esto, envíeme un correo electrónico. Créeme. Esto funcionará a corto plazo y a largo plazo. !!!
Existe una alternativa que extraerá la tabla InnoDB sin reducir ibdata1.
Paso 01) Agregue las siguientes líneas a /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
Paso 02) service mysql restart
Paso 03) Para extraer una sola tabla de InnoDB llamada mydb.mytable, haga esto:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
Esto creará un archivo por favor, mantenga el archivo de estructura original
- /var/lib/mysql/mydb/mytable.frm
- /var/lib/mysql/mydb/mytable.ibd
Puede hacer esto para cada tabla InnoDB. Desafortunadamente, ibdata1 se mantendrá 150GB.
ERROR 1071 (42000) at line 25: Specified key was too long; max key length is 1000 bytes
alguna idea?