Насправді існує лише один спосіб вирішити це. Вам доведеться експортувати дані за допомогою mysqldumps, скинути всі бази даних, вимкнути mysqld, видалити ib_logfile0, видалити ib_logfile1, видалити ibdata1, додати innodb_file_per_table
під [mysqld]
заголовком, запустити mysql.
Цю відповідь я опублікував у StackOverflow ще в жовтні 2010 року
Ось етапи, перелічені вертикально:
Крок 01) MySQLDзавантажте всі бази даних у текстовий файл SQL (назвіть його SQLData.sql)
Крок 02) Видаліть всі бази даних (крім схеми mysql)
Крок 03) Завершення роботи mysql
CAVEAT : Щоб повністю очистити незапущені транзакції з файлів InnoDB, запустіть це
mysql -uroot -p... -Ae"SET GLOBAL innodb_fast_shutdown = 0;"
service mysql stop
Крок 04) Додайте наступні рядки до /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
Сторінка: Незалежно від вашого набору для innodb_buffer_pool_size, переконайтеся, що innodb_log_file_size становить 25% від innodb_buffer_pool_size.
Крок 05) Видаліть ibdata1, ib_logfile0 та ib_logfile1
На цьому етапі має бути лише схема mysql в / var / lib / mysql
Крок 06) Перезапустіть mysql
Це відтворить ibdata1 на 10 МБ, ib_logfile0 та ib_logfile1 на 1G кожен
Крок 07) Перезавантажте SQLData.sql в mysql
ibdata1 зростатиме, але містить лише метадані таблиці
Кожна таблиця InnoDB буде існувати поза ibdata1
Припустимо, у вас є таблиця InnoDB під назвою mydb.mytable. Якщо зайти в / var / lib / mysql / mydb, ви побачите два файли, що представляють таблицю
- mytable.frm (Заголовок двигуна зберігання)
- mytable.ibd (Домашні дані таблиці та індекси таблиць для mydb.mytable)
ibdata1 більше ніколи не буде містити дані InnoDB та індекси.
За допомогою параметра innodb_file_per_table в /etc/my.cnf ви можете запустити OPTIMIZE TABLE mydb.mytable і файл /var/lib/mysql/mydb/mytable.ibd фактично скоротиться.
Я робив це багато разів у своїй кар'єрі як MySQL DBA
Насправді, коли я це зробив, я згорнув файл ibdata1 об'ємом 50 ГБ на 500 Мб.
Спробувати. Якщо у вас є додаткові запитання з цього приводу, напишіть мені. Довірся мені. Це буде працювати в короткостроковій перспективі та в довгостроковій перспективі. !!!
Існує альтернатива, яка витягне таблицю InnoDB, не зменшуючи ibdata1.
Крок 01) Додайте наступні рядки до /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
Крок 02) service mysql restart
Крок 03) Щоб витягти єдину таблицю InnoDB під назвою mydb.mytable, виконайте це:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
Це створить один файл pleus зберегти вихідний файл структури
- /var/lib/mysql/mydb/mytable.frm
- /var/lib/mysql/mydb/mytable.ibd
Це можна зробити для кожної таблиці InnoDB. На жаль, ibdata1 залишиться 150 Гб.
ERROR 1071 (42000) at line 25: Specified key was too long; max key length is 1000 bytes
будь-які ідеї?