Який найкращий спосіб зменшити розмір ibdata в mysql?


63

У мене є декілька виробничих серверів, чиї ibdataфайли з кожним днем ​​збільшуються в розмірі.

Вже витрачено 290 Гб місця.

Таблиці на серверах здебільшого є InnoDB і є запити на читання та записування високого рівня.

Розмір файлу журналу також збільшується. У Таблицях величезна кількість даних.

Як я можу контролювати зростаючий розмір обох?

Я не використовую innodb_file_per_table.

Відповіді:


104

Пам’ятайте про найпоширеніший файл в інфраструктурі 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;

Навіть із запропонованими налаштуваннями для my.cnf (які у мене вже є), видаляючи ib_logfile0 і 1, а потім запускаючи mysql, нові файли створюються і протягом декількох секунд вони виростають до рівня розміру бази даних, як відображено у вашому вище запиті. Не впевнений, чи mysql копіює всі таблиці та індекси в ці файли, зберігаючи також кожну таблицю в окремому файлі.
Аллен Кінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.