Существенная разница между размером базы данных под MySQL и фактическим размером на диске

8

Когда я проверяю размер моих баз данных под MySQL, я получаю это:

MariaDB [(none)]> SELECT table_schema "Data Base Name",  sum( data_length + index_length ) / 1024 /  1024 "Data Base Size in MB",  sum( data_free )/ 1024 / 1024 "Free Space in MB"  FROM information_schema.TABLES  GROUP BY table_schema;
+--------------------+----------------------+------------------+
| Data Base Name     | Data Base Size in MB | Free Space in MB |
+--------------------+----------------------+------------------+
| alfresco           |         245.75000000 |      34.00000000 |
| drupal             |         892.15625000 |     216.00000000 |
+--------------------+----------------------+------------------+

Когда я проверяю размер на диске, я получаю это:

$ sudo du -h --max-depth=1 /var/lib/mysql/
317M    /var/lib/mysql/alfresco
1.4G    /var/lib/mysql/drupal

Если я объединю как использованное, так и свободное пространство, предоставленное Maria DB, и сравню его с данными на диске, я получу следующее:

alfresco: DB=279MB  DISK=317MB (+14%)
drupal: DB=1100MB   DISK=1433MB (+30%)

В: Это нормально, когда на диске столько накладных расходов? Могу ли я что-нибудь сделать, чтобы уменьшить его?

К вашему сведению, запуск mysql optimize поможет ( с помощью этой команды ), он уменьшил размер баз данных, но не изменил размер файлов на диске.

Дополнительная информация:

server:             ubuntu server 10.04 LTS
DB server:          MariaDB
DB engine:          InnoDB v10 (for all tables)
Table collation:    utf8_general_ci
Nb Drupal tables:   416  (0.80MB overhead per table)
Nb Alfresco tables: 84   (0.45MB overhead per table)
Максимум
источник
Все таблицы InnoDB? Сколько столов?
ГБН

Ответы:

5

Если вы используете таблицы InnoDB, размер ваших файлов ibdata со временем будет расти. Таким образом, если вы выполните DELETEоператор, размер вашей базы данных уменьшится, но файл ibdata останется прежним (не уменьшится).

Если вы не используете innodb_file_per_tableопцию, единственный способ освободить пространство - выгрузить базу данных и восстановить ее из файла дампа.

Однако, если вы используете innodb_file_per_table, вы можете выдать

ALTER TABLE foo ENGINE=InnoDB;

на столах, которые становятся слишком большими, чтобы освободить место на диске.

Дерек Дауни
источник
почему размер файлов ibdata не уменьшается, если размер базы данных уменьшается?
Макс
По-видимому, это «дизайнерское решение», принятое разработчиками innodb, кратко объясненное в комментариях к этой ошибке . Аналогичный запрос был сделан несколько лет назад, но с этим ничего не было сделано. Я не согласен с дизайнерским решением лично, но это то, что есть.
Дерек Дауни
почему не оптимизировать пространство для восстановления таблицы? или это просто "аккуратно", а не "сжиматься"?
ГБН
1
@gbn "Для таблиц InnoDB OPTIMIZE TABLE сопоставляется с ALTER TABLE, который перестраивает таблицу для обновления статистики индекса и освобождения неиспользуемого пространства в кластерном индексе." src Так что да, просто приборка. По той же причине AlTER TABLE foo ENGINE=InnoDBбез innodb_file_per_table=1сокращений ибдаты.
Дерек Дауни