Пам’ятайте про найпоширеніший файл в інфраструктурі InnoDB це / var / lib / mysql / ibdata1
Цей файл зазвичай містить багато класів інформації (коли innodb_file_per_table дорівнює 0)
- Дані таблиці
- Табличні покажчики
- Дані MVCC (мультивалюючий контроль за сумісністю)
- Відкатні сегменти
- Скасувати простір таблиць
- Метадані таблиці
- Див наочного уявлення
Багато людей створюють кілька файлів ibdata, сподіваючись на покращення керування та продуктивності дискового простору. Це не допомагає.
На жаль, OPTIMIZE TABLE проти таблиці InnoDB, що зберігається в ibdata1, робить дві речі:
- Робить дані таблиці та індекси суміжними всередині ibdata1
- Це змушує ibdata1 рости, оскільки суміжні дані додаються до ibdata1
Ви можете відокремити дані таблиці та індекси таблиць від ibdata1 та керувати ними самостійно, використовуючи innodb_file_per_table . Щоб скоротити ibdata1 раз і назавжди, ви повинні зробити наступне
Крок 01) MySQLDзавантажте всі бази даних у текстовий файл SQL (назвіть його SQLData.sql) ( Детальніше тут )
Крок 02) Відкиньте всі бази даних ( за винятком mysql
, performance_schema
і information_schema
)
Крок 03) Завершення роботи mysql
Крок 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 Мб.
Спробувати. Якщо у вас є додаткові запитання щодо цього, напишіть мені електронну пошту. Довірся мені. Це буде працювати в короткостроковій перспективі та в довгостроковій віддалі. !!!
Якщо ви хочете побачити, скільки фактичних даних зберігається в MyISAM та InnoDB, будь ласка, запустіть цей запит:
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size"
FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;